Difference between revisions of "Golem Studio"

From Oldunreal-Wiki
Jump to navigation Jump to search
(→‎Default attributes: Notes about relays)
Line 277: Line 277:
|BoneCount      ||Integer  ||0                  ||Yes            ||Total amount of bones in the entity mesh.
|BoneCount      ||Integer  ||0                  ||Yes            ||Total amount of bones in the entity mesh.
|-
|-
|RelayCount      ||Integer  ||0                  ||Yes            ||''Unknown'', set to 0 even in stock objects.
|RelayCount      ||Integer  ||0                  ||Yes            ||''Obsolete'', set to 0. Was planned to show statistics about bones shared between models.
|-
|-
|RelayAdjustCount||Integer  ||0                  ||Yes            ||''Unknown'', set to 0 even in stock objects.
|RelayAdjustCount||Integer  ||0                  ||Yes            ||''Obsolete'', set to 0. Was planned to show statistics about bones shared between models.
|}
|}



Revision as of 08:59, 26 June 2012

GlmEd-icon.gif

Golem Studio is a mesh and animation editor that came with Unreal II (specifically, version 1.01). It was created by Chris Hargrove from Legend Entertainment and was used as a companion program to UnrealEd for setting up the meshes and animations of all animated objects in Unreal II, including characters, creatures, some decorations and most weapons. It can be launched by running GlmEd.exe found in the Unreal2/System directory.

Unlike UnrealEd (as of 11 June 2012), the Golem Studio works well on Linux through Wine, including the Render window.

Program logic

Workspaces

Golem Studio works with files called Golem workspaces (extension .gws). Golem workspaces are a kind of master files that contain a reference to a Root folder. The Root folder typically holds two types of data - folders and GEM files. Opening the workspace will cause Golem Studio to scan the Root folder for any subfolders and GEM files. Changing anything in the workspace changes the way files are situated on the Root folder, for instance, adding a subfolder to a workspace in the Goldem Studio will also physically add a subfolder into the Root folder. Same thing with GEM files. And vice versa - physically changing the contents of the Root folder will change it in the workspace. As such, workspace files are nothing more than one path and a few associated settings.

New workspace files contain the reference to the Root folder in the form of an absolute path. That means that if you change your disk order or use a workspace file from another person, it will most likely fail to work. In such an event, nothing is opened, and the Golem Studio continues as if nothing was attempted to be opened. However, GWS files themselves are actually text files; thus you can change the path from an absolute to a relative one manually. Moreover, that allows you to add the NoEdit flag to your workspace.

GEM files

While the Root folder contains only folders and GEM files, GEM files themselves contain objects (physically, not just references to them, except for a few types of objects). These objects can be of different categories:

Category Type Description
Bone Frames GemBoneFrames These objects contain a set of frames with bone transform information based on a particular bone hierarchy, used for skeletal animation.
Bone Hierarchy GemBoneHierarchy These objects contain a collection of bones organized in a hierarchy, used by bone points and frames objects for skeletal animation.
Bone Weighted Points GemBonePoints These objects contain a set of points and their normals, which are weighted to the bones of a bone hierarchy for smooth skinning. These weighted points are necessary in order to generate point positions from skeletal animation data.
Color/Alpha Frames GemColorFrames These objects contain a set of frames with 32-bit ARGB values capable of being animated on vertices for color & alpha effects.
Entity Blueprint GemBlueprint These objects are blueprints used to create entities at runtime. They contain a reference to a Model object describing the entity's structure, and a set of attachments used to connect other entities to this one.
Entity Script Agent GemAgent These objects contain a rule tree used to determine a set of entity script processes to use based on a small set of input values. The agent acts as an intermediary between a client application and an entity's script processes, translating only a few pieces of input data into choices within a potentially large set of usable entity scripts.
Entity Scripts GemScripts These objects contain command scripts for manipulating entities at runtime, using static animation frame sequences and/or dynamic animation effects.
Level-of-Detail Information GemLodInfo These objects contain triangle Level-of-Detail (LOD) reduction information in the form of a "progressive mesh" capable of choosing its triangle count at will. This data is constructed from the vertices and triangles used by a Model object. Once the data is present, the LOD information can be used to reorder the vertices for LOD compatibility, and then create new reduced triangle sets for lower detail levels.
Lipsync Curve GemLipsyncCurve These objects contain a function curve applied to a set of viseme frames at runtime, for lip-syncing.
Materials GemMaterials These objects contain a set of materials composed of various rendering settings, potentially using multiple texture stages. Each triangle in a model has a single material index which refers to one of the materials within these objects.
Model GemModel These objects describe the structure of a polygonal model used by Entity objects. Models are a combination of various other object types including triangle, vertex, and bone information.
Physical Ragdoll GemRagdoll These objects define a physical "ragdoll" composed of primitive solids and constrained joints. The volumes are associated with hierarchy bones, allowing physics-related abilities to operate on the hierarchy.
Point Normal Frames GemNormalFrames These objects contain a set of frames with uncompressed point normals, used for lighting information during vertex animation.
Point Position Frames GemPointFrames These objects contain a set of frames with uncompressed point positions, used for vertex animation.
Quantized Point Normal Frames GemQuantNormalFrames These objects contain a set of frames with quantized (compressed) point normals, used for lighting information during vertex animation.
Quantized Point Position Frames GemQuantPointFrames These objects contain a set of frames with quantized (compressed) point positions, used for vertex animation.
Triangle Adjacency Links GemTriLinks Marked with OBSOLETE / DELETE IF INDICATED. These objects contain triangle adjacency information for a variety of uses. The adjacency information identifies which vertices are connected to which triangles via shared edges, and so forth. This information is typically generated from the raw triangles of a Triangles object, along with the point indices used by the vertices in a Vertices object.
Triangle Rendering Primitives GemTriPrims Marked with OBSOLETE / DELETE IF INDICATED. These objects contain triangle primitives sorted into material batches for optimized rendering. This information is typically generated from the raw triangles of a Triangles object.
Triangles GemTriangles These objects contain raw triangles which refer to a given material index and three vertex indices.
Vertices GemVertices These objects contain model vertices which refer to a given point index, normal index, color index, and multiple texture UV indices.

To have a working (visible) model, it must have at least Bone Weighted Points, Entity Blueprint, Materials, Model, Triangles and Vertices defined.

A GEM file can contain multiple objects in the same category.

Object attributes

Each object has a set of attributes. Golem Studio allows you to view and add attributes to each object freely. Attributes must have a name, array index, type and value. The attribute name is what gives the Golem Studio information about which attribute you intend to modify (unfortunately, you need to enter the name manually for most object types, and there is no documentation about what names are valid for what types). The array index is an integer, and it's used for setting up elements of an array. Valid attribute types are integer value, floating-point value, text string and object reference. The value is, of course, the value of the attribute, limited by the attribute type.

Most objects have pre-defined attributes, most in the form of statistics. Those attributes are read-only as they are auto-generated. Some of them, such as the attributes of the Triangles category objects, are not set as read-only, but changing them (or even deleting them) does not have any effect.

Interface

The Golem Studio window

The Golem Studio interface consists of four independent windows. The main window has a menu bar and, when maximised, contains the other three windows inside it. The Workspace window provides a list of folders, files, categories and objects referenced in the open workspace and allows to manipulate them. The Render window shows a rendered preview of a selected entity. The Entity window controls what entity is displayed in the Render window and allows you to change the parameters of the entity render.

Main window

The main window has a single element that can be interacted with - the menu bar. It has three menus - File, View and Help.

File menu

The File menu allows you to create a new workspace (if no workspace is open), to open an existing workspace (again, only if no workspace is open) and to close a workspace (if one is open). You are not allowed to open more than one workspace at a time. The File menu also has a Preferences option and an Exit button.

While opening and closing a workspace, as well as the program itself, is self-explanatory, more should be said about creating a new workspace. First the program asks you where to put the workspace file (by default in the same directory as the program itself, Unreal2/System). Then a new window, titled New Workspace, opens. Here you need to enter the title of your workspace and the location of the Root folder (the directory in which all the GEM files and folders created within the workspace are stored, by default again Unreal2/System, although Legend Entertainment themselves used Unreal2/Meshes instead). You can also define a custom Textures root folder (the directory where external textures will be kept), although by default it is set to match the workspace Root folder. Lastly, you can select Visual SourceSafe integration options (path to the VSS database, username and password), although it is of low practical use these days as Visual SourceSafe is a rather antiquated version control system, whose job is better left to modern systems, such as Git, which do not require special integration in the first place.

The Preferences window

The Preferences option brings up the Preferences window with three sections. The first section, titled General Preferences, allows you to choose whether the last used workspace should be automatically loaded at program startup (useful when working on a single workspace) and whether to update the Render window when the Golem Studio main window is not on focus (this is usually a bad idea, as the Render window doesn't have a framerate limit and therefore takes up all of the resources of the graphics card that it can spare). The second section is titled Rendering Preferences, and the single option here is the background colour of the Render window. It is set to black by default, but it is recommended to set it to grey or white in order to see untextured entities in the Render window. Note that this setting is only applied after restarting the Golem Studio. The last section is titled Crash Dump Email Preferences (Developer Build Only) and was used for sending crash reports to the developers, but it is of no use these days.

View menu

The View menu has five options: Workspace Window, Entity Window, Render Window, Log Window and Memory Usage. The first three options toggle visibility of the other three windows. It is recommended to keep the Render window disabled until it's necessary in order to keep your GPU cool and using less power. The Log Window option produces a small window with a read-only textbox in it. It appears to have been unused, as no text ever appears there. The Memory Usage option creates a dialog window that shows how much memory the program uses (although it doesn't seem to be accurate, according to the Resource Monitor).

Help menu

The Help menu unfortunately has a single option - About Golem Studio, which produces a dialog window titled About that reads nothing more than Golem Studio - Version 1.01.

Workspace window

The Workspace window is the main part of the program that you can interact with. It contains a folder tree of all folders, subfolders, GEM files, object categories and objects listed. Each of these data types can be interacted with in different ways.

Workspace

The root element of the tree is the open workspace. Right-clicking on it provides four options - New, Save All, Reload All and SourceSafe. The New option allows you to create a new folder or a new GEM file, which will be placed in the Root folder of the workspace. Save All is used to save changes to any modified GEM files that the open workspace covers. Reload All is the opposite - it allows to discard any pending changes to the GEM files. Note that these options do not cover folders or file creation/deletion - those actions take place immediately, so they don't need to be saved and cannot be reloaded. The SourceSafe option is greyed out when SourceSafe integration is off.

Folder

Right-clicking on a folder or a subfolder allows you to choose from the same four options, plus two new - Rename and Delete. Unfortunately, there is no option to move the folders, but that can be worked around by physically moving the folders (or GEM files) outside the Golem Studio in the Root folder. The workspace automatically refreshes itself on next program start in that event. Alternatively, using Rename also allows for moving the files and folders (if you have a file File.gem and a folder Folder, renaming the file to Folder/File.gem will move it inside the folder, and renaming it to ../File.gem will move it back up; these changes show up correctly only after reloading the program).

GEM file

The New Object window

If you right-click on a GEM file, you will see options similar to the ones above, but with two new additions and slight changes. The New option here allows you to create only one type of element - object. Pressing the New Object button opens a new window with all the possible objects listed. After selecting one and pressing OK, you need to enter a (unique) name for the new object. The newly added object automatically contains several preset attributes depending on the object category.

The Save All and Reload All buttons are replaced with Save and Reload buttons when working with GEM files, and they only affect the selected GEM file instead of every changed GEM file in the workspace.

There are two new additions to the context menu when working with GEM files. First is the Import... menu, which allows you to import either static untextured 3DS Max files, or ActorX PSK/PSA files. If you choose to import a PSK file, and point to a PSK file, Golem Studio asks you for a prefix, which you can think of as a name for the entity you wish to import. The default is based on the filename. Once that is done, the program lists what objects will be generated from the PSK file, along with their names, and whether anything will be overwritten or not. The generated objects are typically Bone Hierarchy, Vertices, Triangles, Bone Weighted Points, Materials, Texture UV Frames, Model, Entity Scripts, Entity Blueprint and Level-of-Detail Information. The created Entity Scripts object is completely empty, but it is needed for the import of a PSA file. All the information, such as the texture name for the Materials object, is taken from the PSK file. When importing a PSA file, the first steps are identical, except that you also need to point to a Bone Hierarchy object that matches the imported animations as well as an Entity Scripts object to put the newly generated scripts into. The number of animations (scripts) added or replaced is shown in the prompt at the end.

The second new option is the Generate... menu that allows for generating a basic cube or plane entity. If generating a cube, you will have to input the name of the cube entity and its associated objects and the size of the cube (presumably in Unreal Units). If creating a plane (sheet), you will have to give not only a unique name and size, but also the number of subdivisions the plane should have and texture scaling percentage (both of which have no immediate effect as the texture applied is purely black, but they affect in-game performance and appearance with an assigned material). That will create 8 new objects per generated shape - Bone Hierarchy, Bone Weighted Points, Entity Blueprint, Materials, Model, Texture UV Frames, Triangles and Vertices.

Object category

Object categories are listed mainly for organisational purposes, so there are just two options in the context menu. The first one is View Description that shows the description of each category, as noted in the Program logic section of this page. The other options is Delete All that removes all of the objects in the selected category, and therefore the category itself as well.

Object

The context menu entries differ slightly depending on the category of the object that is selected. See below for more information on individual object settings. However, the main options are the same across all objects. The first option is View/Modify... that opens the Edit Object window for editing attributes of the object. Whether the window will have additional tabs depends on the object category. The Move option allows you to move the object from one GEM file to another. Duplicate creates a clone of the object with a new name. The Redirect option changes any existing references to the object (from other objects) to point to a new chosen object. the Rename and Delete options are self-explanatory.

If an object is changed in any way, an asterisk will appear near it and the GEM file the object belongs to will become bolded. That indicates that there are unsaved changes. You will have to choose one of the save options to save your changes, or a Reload option to discard them. Exiting the program will discard any pending changes.

Edit Object

The Edit Object window

The Edit Object attribute tab is a little more complex than the other windows. The tab itself lists all of the attributes an object has set by using four columns - Name, ArIntex, Type and Value. In order to modify the attributes, you need to right-click (or double-click, in this window both are interchangeable) on the cell you wish to edit. For instance, to edit the name of a parameter, you have to right-click the name cell of that parameter - right-clicking anywhere else will not allow you to do that.

If an attribute is set to be read-only, or if you right-click on an empty row, the only option available from the menu will be Create New Attribute. If you choose it, you will need to enter a name for the attribute. Unlike with objects, attribute names don't have to be unique - in fact, only hardcoded names are identified by Golem Studio, any other entries have no effect. If there are several attributes with the same name, the array index of the second attribute will be higher than the first - that allows for reordering arrays of attributes. The Create New Attribute option is available from every context menu in the list.

The context menu entries when right-clicking in the Name column, beside Create New Attribute, are Rename Attribute and Delete Attribute. They are self-explanatory.

If you right-click or double-click on the ArIndex or Value tabs, Golem Studio will bring up a prompt where you can input the new value of either. If you enter a string where an integer is expected, the new value will be 0. If you enter a float where an integer is expected, the resulting value will be equal to the result of the floor(FloatValue) function. If you are attempting to edit the value of an attribute of type Object, you will be presented with a list of all entries in the workspace, not unlike what you get when you try to move an object.

The context menu options in the Type column allow you to choose between the four possible attribute types like detailed above.

Render window

The Render window shows the selected entity. There are certain keystrokes and mouse movements available for use when the Render window is focused. The generic keystrokes are listed below, while those that depend on each entity's Agent scripts are explained in the Agent Tab section.

Keystroke Effect
Dragging the left mouse button Rotates the camera around the entity.
Dragging the right mouse button Zooms the camera in and out. Only moving the mouse up and down has effect.
Ctrl+Dragging the right mouse button Pans the camera (moves the camera pivot point).
←, → Moves the Satellite node on the X axis.
↑, ↓ Moves the Satellite node on the Y axis.
Ctrl+↑, Ctrl+↓ Moves the Satellite node on the Z axis.
F4 Toggles bone coordinate frame visibility.
F5 Toggles wireframe mode (wireframe is black, so you have to adjust the background colour).
F6 Toggles ragdoll solid visibility (only where they are defined). This is required for the next two actions.
Ctrl+F6 Toggles ragdoll solid occlusion (so that they are not visible from everywhere).
Shift+F6 Toggles ragdoll joint visibility.
F7 Cycles through point evaluation styles. The log shows which one it is set to.
F8 Cycles through normal evaluation styles. The log shows which one it is set to.

Pivot location adjustment and other changes that relate to the entity itself are done from the Entity Blueprint object.

The Render window doesn't have a framerate limiter, so it might be taxing on your computer resources. It is best to keep it off whenever it's not in use, or force VSync on for the Golem Studio process.

Setting the background colour to something other than the default black will allow you to see black objects, such as the wireframe or black materials. Dark grey is recommended.

Entity window

The Entity window controls what is shown in the Render window. It consists of four parts. The first one, titled Entity, has two text boxes and two buttons. The text box just under the word Entity indicates the currently selected entity. The Change button gives a list of all entities available in the open workspace.

Below that is another text box labelled Params. Pressing the Change button asks for a text string. The format for it is Parameter = Value, ParameterB = ValueB and it only affects entities which have some parameters defined in the Entity Blueprint or its CommonBlueprint. See below for an explanation on how to create them.

The second section is titled Satellite Node Name and has a yet another set of a text box and a Change button. Once again, it requires a text string. This section relates to the head tracking system and controls what the Satellite node represents. Most of the time it's a point at which the entity should be looking, other times it could be aiming at it, reaching at it, etc. Satellite nodes are nodes that are not connected to the entity itself (free-floating), and they represent objects that would exist in the game itself (that allows for debugging the head tracking setup for an entity inside Golem Studio). The default value, GolemSatellite, doesn't appear to do anything in particular. The possible values are defined in Entity Scripts objects as the targets of the Node Look At or Node Look At 2 functions. For instance, most humanoids have the Sat_HeadTrack node defined. Entering this string into the Satellite Node Name will make the satellite node represent the head tracking target. To move it, refer to the keystroke list above. The Satellite node is represented by a small cube connected to the origin of the entity, and stops being displayed after a period of inactivity.

At the bottom of the window is a big button labelled Refresh. It reloads the entity after its blueprint or its references were changed.

The section above the refresh button is the most important part of the window. It consists of two tabs - Processes and Agent.

Processes tab

The Processes tab contains a list of entity scripts currently running. To start scripts, there are two options. One is to manually set a script into a vacant slot, detailed below. The other is to have Golem Studio set it automatically by enabling Agent mode in the Agent tab.

The # column indicates the slot, with a gem icon marking slots which are occupied. The Script column shows the names of all currently running scripts, and other scripts that the currently running scripts are calling, if any. Right-clicking on any slot brings up a list of all entity scripts, where you can choose which one to play in that slot. The Time column shows a percentage value indicating how much of the animation has already played.

To the right of the checkbox below the list is the slot number and name of the currently selected process.

Below the list is a checkbox Frame-by-frame. If you select a slot, then check this checkbox, that slot will become frozen in time (while all other slots will continue playing). Note that this is persistent even if you change the entity - its scripts in the frozen slots will stay frozen as well. Below this checkbox are four buttons. The << and >> buttons move the animation by 30 frames backwards or forward in time, respectively. < and > buttons do the same, but they move the animation only by one frame.

Note: if you attempt to play a script that has an Apply Lipsync Curve action defined in it without another animation playing on the entity, the entity will show distorted animations. That is due to the lipsync curves being defined in a relative position to currently playing ones. To fix that, you need to start an animation, such as one of the idling animations, before starting the lipsync animation. Alternatively, you can edit the animation script and add an Execute Child Script action with a Thread value that is lower than that of the Apply Lipsync Curve action to automate the playing of another animation before the lipsync curves are applied.

Agent tab

The Agent tab of the Entity window.

The Agent tab controls preset assembled animations by utilising an Entity Script Agent. The tab contains another pane with two tabs. At the bottom is a checkbox Enable Agent Mode that turns on the Agent mode. It has to be checked for the complex animations to play.

Note that depending on the agent script, the Render window might respond to different keystrokes or key combinations. For instance, hitting the p key when viewing the Aida entity in agent mode will play the pointing animation. These special key strokes are defined in the test function of agent scripts. See the GAL scripting page for more details.

Inputs tab

The Inputs tab shows a list of inputs - the state in which the rendered entity should be in. Depending on the entity, there will be several slots defined. The first column is titled # and shows the slot number. The second column is Input Name. You cannot change this here, as it is defined in Agent scripts instead. The last column is Value. Right-clicking or double-clicking here will allow you to choose between a list of possible values for the input. For instance, one of the inputs for the Aida entity is Direction, and it can have a value of None, Forward, Backward, Left and Right. It defines which direction the entity is supposed to be walking, and if the Agent mode is on, changing this input changes the render.

Actions tab

The Actions tab lists all of the available actions the entity agent script has defined. Actions define a set of processes the entity has to perform in sequence or in parallel. The action list is fairly basic - the # column shows the number of the action, and the Action Name shows its name. You can interact with the list by right-clicking or double-clicking on the name of the action you want the entity to perform. Note that the actions listed might not all be complete - some are partial actions used by other actions to form a longer, more complex action, therefore they may not appear to be functional. Also note that performing some actions will leave the entity without any way to restore itself to an earlier state, such as death animations, which leave the entity in a ragdoll state. In that case, hitting the Refresh button will reset the entity.

Below the action list is a line titled Immediate action. It is used in GAL scripting as a quick way to execute commands. You can change the command in the text box by clicking the Change button. All of the GAL syntax applies here. For instance, inputting call point; when viewing Aida and pressing the Call button will make her play a taunt animation. In case of a syntax error, the Log window outputs an error with a bit more details about it.

Working with objects

Objects in each category have unique ways to interact with them. This is where most of the editing work in Golem Studio is done. Below the way to interact with objects from each category is discussed in more detail.

Bone Frames

Bone frames are automatically added when importing skeletal meshes, therefore there are few ways to interact with this type of object.

Default attributes

Name Type Default value Read-only Comment
PlayRate Float 1.0 No Controls the play rate of skeletal animations, in frames per second.
BoneHierarchy Object None No Reference to the Bone Hierarchy object that these bone frames affect.
UsedBoneCount Integer 0 Yes Amount of bones affected by this object.
FrameCount Integer 0 Yes Total amount of skeletal animation frames in this object. Combined with PlayRate, it can be used to determine the animation length in seconds.
TranslateCount Integer 0 Yes Total amount of bone translations done by this object.
RotateCount Integer 0 Yes Total amount of bone rotations done by this object.
ScaleCount Integer 0 Yes Total amount of bone scaling done by this object. Typically set to 0, as bone scaling is hardly ever used in practise.

Bone Hierarchy

Bone hierarchy objects have an extra tab, titled Hierarchy, available in the Edit Object window.

Hierarchy tab

The Hierarchy tab

This tab has a single section, titled Node Tree. It lists all of the bones available in the entity mesh and their hierarchy. This tree cannot be edited, apart from reimporting the skeletal mesh.

Default attributes

Name Type Default value Read-only Comment
BoneCount Integer 0 Yes Total amount of bones in the entity mesh.
RelayCount Integer 0 Yes Obsolete, set to 0. Was planned to show statistics about bones shared between models.
RelayAdjustCount Integer 0 Yes Obsolete, set to 0. Was planned to show statistics about bones shared between models.

Bone Weighted Points

Bone weighted points, like the two other object types above, are automatically generated and have little to edit.

Default attributes

Name Type Default value Read-only Comment
BoneHierarchy Object None No Reference to the Bone Hierarchy object affected by this object.
BoneCount Integer 0 Yes Total amount of bones affected by this object. Usually equals the total amount of bones in the entity mesh.
PointCount Integer 0 Yes Total amount of points (unique vertices) affected by this object. Usually equals the total amount of points in the entity mesh.
WeightCount Integer 0 Yes Total amount of bone weighted points in the object.
NormalCount Integer 0 Yes Total amount of normals affected by this object. Usually equals the total amount of normals in the entity mesh.
TangentCount Integer 0 Yes Unknown, set to 0 even in stock objects.

Color/Alpha Frames

These frames are probably automatically generated as well, although they are never used in the stock GEM files.

Default attributes

Name Type Default value Read-only Comment
PlayRate Float 1.0 No Controls the play rate of skeletal animations, in frames per second.
FrameCount Integer 0 Yes Total amount of skeletal animation frames in this object. Combined with PlayRate, it can be used to determine the animation length in seconds.
ColorCount Integer 0 Yes Total amount of colours contained in this object.

Entity Blueprint

While Entity Blueprint objects are also generated when generating or importing objects, they are internal Golem objects and therefore have a wealth of editing options. In case of entity blueprints, all editing is done though the Attributes tab, but by default nothing is defined. However, instead of a context option Create New Attribute, it's now a submenu that lists all of the options that the Entity Blueprint objects expect. There is also a Custom Attribute option that allows you to create attributes freely, as in other objects.

Custom attributes

Name Type Comment
Agent Object Reference to the Entity Script Agent object used by the entity.
AttachAxes String Defines the axis order of the bone to attach the attachment to, in the format of a combination of three letters, x, y and z. If left empty or in any other format, xyz is implied. See ColonistFemale for a usage example. See DrakkBossLowerWithUpper and FrankMarineSwill for defining negative axes.
AttachBlueprint Object Reference to another Entity Blueprint whose entity to attach to the base model.
AttachChildNode String Unknown, used in FrankGimp.
AttachName String Unknown, used in FrankGimp, presumably a name to use when referring to the attachment.
AttachNode String The bone name to attach the attachment to.
AttachRotatePitch Float The pitch rotation angle for rotating the attachment before rendering the entity, in degrees.
AttachRotateRoll Float The roll rotation angle for rotating the attachment before rendering the entity, in degrees.
AttachRotateYaw Float The yaw rotation angle for rotating the attachment before rendering the entity, in degrees.
AttachParamCondition String Used to define parameters for the entity, in the form of Parameter = PossibleValue. See zMercFemLight_Common_Head for an example, and MercFemLight_HeadBlue_New for how it ties with DefaultParams.
AttachParticle String The name of a ParticleSalamander to attach, in the form of PackageName.ParticleSalamanderNameX. See FagMouth for an example. Particles are not rendered in Golem Studio, only in the game itself.
AttachParticleName String Unknown, presumably a name to use when referring to the ParticleSalamander.
AttachParticleNode String The bone name to attach the ParticleSalamander to.
AttachParticleTriggerUpdateOnly Integer Unknown
AttachScale Float The amount to scale the attachment by before rendering the entity.
AttachScript String The name of an Entity Script for the attachment to execute. See FrankGimp for an example.
AttachScriptMimic Integer Whether the attachment should mimic the bone movement of the base model. A boolean value. See Izarian_Armor01 for an example.
AttachScriptProxy Integer Changes the way the Entity Scripts are handed over by the Entity Script Agent. See KaiUnclothedTransformation for an example.
AttachStaticMesh String The static mesh to attach. The format is Package.Group.StaticMeshName.
AttachStaticMeshNode String The bone name to attach the static mesh to.
AttachTranslateX Float The X component for translating the attachment before rendering the entity.
AttachTranslateY Float The Y component for translating the attachment before rendering the entity.
AttachTranslateZ Float The Z component for translating the attachment before rendering the entity.
CommonBlueprint Object Reference to another Entity Blueprint object. Certain parts of the specified blueprint become available in the current blueprint. Can be used to share blueprint attributes between different blueprints. See MarineHeavy_Blue for an example.
CommonBlueprintBaseIndex Integer Unknown, used in MercFemLight_HeadBlue_New
DefaultParams String Controls certain entity parameters. See MercFemLight_HairBlue for a usage example. Changing the Params field in the Entity window allows for changing the parameters on the fly. In conjunction with CommonBlueprint, parameters allow for an easy way to create variants of the same model - that is how most of MercFemLight models were created.
Model Object Reference to the Model object used by the entity. This is mandatory for the resulting entity to be functional.
Scripts Object Reference to an Entity Script used by the entity. Often there are multiple of these defined.
OriginRotatePitch Float The pitch rotation angle for rotating the base model before rendering the entity, in degrees.
OriginRotateRoll Float The roll rotation angle for rotating the base model before rendering the entity, in degrees.
OriginRotateYaw Float The yaw rotation angle for rotating the base model before rendering the entity, in degrees.
OriginScale Float The amount to scale the base model by before rendering the entity.
OriginTranslateX Float The X component for translating the base model before rendering the entity.
OriginTranslateY Float The Y component for translating the base model before rendering the entity.
OriginTranslateZ Float The Z component for translating the base model before rendering the entity.

Context menu options

In the Workspace window, the Entity Blueprint context menu has a new option Refresh CommonBlueprints. It is supposed to update blueprints referred to in the CommonBlueprints attribute of the selected object, although it seems like they should refresh automatically. If it fails to do so, however, this option could be used.

Entity Script Agent

Unlike all of the objects above, Entity Script Agent objects are not generated upon importing meshes and hence must be created manually to get Agent functionality.

When created manually, they have no attributes specified.

Context menu options

Entity Script Agent objects have two new context menu options. The first one is Import GAL File. Using this option, you can import an agent script (GAL) file. These scripts control the entries in the Agent tab of the Entity window. See the article on GAL scripting for more information on agent scripting.

The second option is, thankfully, Export GAL File. It allows you to view GAL scripts that were written by the developers of the game in order to see usage examples.

Custom attributes

Name Type Comment
TextLength Integer The size of the GAL script file imported into this object, in characters.

Entity Scripts

Just like the Entity Script Agent, Entity Scripts have to be added manually. Note that there is a distinction between agent scripts (GAL) and entity scripts. Agent scripts use entity scripts to animate entities. So entity scripts are hierarchically lower than agent scripts. And unlike agent scripts, entity script editing is done purely through Golem Studio. Entity scripts are probably the most complex objects available in Golem Studio.

Default attributes

Name Type Default value Read-only Comment
ScriptCount Integer 0 Yes The amount of scripts contained in this object.
ItemCount Integer 0 Yes Total number of items contained in all the scripts combined.
ParamCount Integer 0 Yes Total number of parameters contained in all the items combined.
ValueCount Integer 0 Yes Total number of values contained in all the items combined. Typically equals ParamCount.
AutoShare String None No Unknown, unset even in stock objects

Custom attributes

Name Type Comment
ChildScripts Object Other scripts to include when this object is added to an Entity Blueprint. See AidaScripts for an example.
DefaultAgent Object An agent to include when this object is added to an Entity Blueprint. See IzarianAnimsScripts for an example.

Scripts tab

The Scripts tab

Like with Bone Hierarchy, Entity Scripts objects have a new tab in the Edit Object window, titled Scripts. This is where all the script writing takes place.

The tab has three sections. The top left one has a drop-down box and three buttons under it. The drop-down box allows you to select a script to edit. The Add button adds a new script, Rename changes the name of an existing script, Delete deletes a script.

The top right section has two text boxes: the top one, labelled Frame Count, and the bottom one, Frame Rate. Near them are buttons Change that allow you to specify new values. These values control the length and speed of the animation that the script defines.

Below these section is a pane with two tabs. The Items tab contains a list of items, similarly to the Attributes tab. Here are five columns. The first one, titled Enabled, controls whether the script item is enabled or not. Right-clicking or double-clicking will toggle the boolean value of a cell in this column. The second column is titled Frame. Values in this column determine when the script item goes into effect, in the form of a frame number (although the value is of a float type). The third column is titled Thread, values in which define what slot the animations will be played in, and whether it will be parallel, one after another, or a mix of the two. The fourth column is named Ability, where ability names are entered. The last column is Parameters, where ability parameters and values are entered.

To add an item into the script, you can right-click on an empty space and choose Create New Item. A new disabled item starting at frame 0 and in thread 0 will be added. To remove an item, you have to right-click on the Abilities column and choose Remove Item. You can also choose Duplicate Item here.

Abilities

There is a large variety of abilities available to choose from, with even more parameters unique to each. You can add an ability by right-clicking on the Ability column. All abilities are put into different categories. Below is a table listing each of those with official explanations.

Category Name Description Parameter Type Explanation
Attachment Abilities Surface Walkers Creates a set of attached entities based on a given attachment name, which will walk along the edges of the parent entity's mesh surface while the ability is active. WalkerCount Integer Number of walkers to create
AttachName String Name of attachment to use for walkers. The attachment must have an AttachClass of "RSurfaceWalkerAttachment".
MoveDistance Float Number of units each walker should move by, over the course of MoveFrameCount frames
MoveFrameCount Float Number of frames over which each walker should move by MoveDistance
ResetDistance[2] Float Number of units (random range) that each walker should move before being reset to a random position (use zero for no resets)
WalkerScale Float Walker attachment scale factor
WalkerOffset[3] Float Walker origin offset used as a translation adjustment
EmitNodeName String Optional node name where walkers emit from before interpolating to surface
EmitFrameCount Float Number of frames over which walkers should move from EmitNode to surface
Editor-Only Abilities Play Sound File Plays a WAV sound within the editor. The ability is ignored by external programs. SoundFileName String Full path of sound file to play
General Abilities Execute Child Script Executes another script as a child process of this thread ScriptName String Name of child script to execute
RateMultiplier Float Multiplies the child script playrate by this amount
StartFrame Float Frame in child script to begin execution
Hide Entity Sets the entity's "hidden" flag for the duration of the ability. Scripts are processed normally on hidden entities, but rendering will not be performed. Note that this flag does not propogate to attachments, which would need to use Hide Entity themselves in order to be hidden.
Karma Abilities Karma Impulse Applies an instantaneous impulse to an entity running a Karma Ragdoll Driver, at the moment the ability is initialized. NodeName String Name of node to receive impulse
ImpulseVector[3] Float Impulse vector to apply to the given node
AdjustForMass Boolean If true, the given impulse vector is treated as a raw velocity rather than a momentum, and will automatically be multiplied by the bone mass internally to determine the actual momentum applied
Karma Ragdoll Driver Background driver enabling Karma Ragdoll Physics on an entity which has a supporting Physical Ragdoll object connected to a blueprint attribute. Gravity[3] Float World gravity vector
GroundPlaneOffset[3] Float World offset of the ground plane; only used within the editor
GroundPlaneNormal[3] Float World normal of the ground plane; only used within the editor
RagdollAttribute String Name of entity attribute pointing to Physical Ragdoll object to use
HasRootMotion Boolean Indicates that motion of the mesh root should be expected; used during external events
BaseScript String Name of optional script whose first frame should be used as a starting point during setup
RotationBlendMode Enumeration:
Keep Existing State
Apply Karma State
Use Blend Factor
Blending mode used for rotations when blending in Karma's node state
TranslationBlendMode Blending mode used for translations when blending in Karma's node state
ScaleBlendMode Blending mode used for scalings when blending in Karma's node state
Material Abilities Material Alpha Fader Fades the constant color alpha value of an entity's materials over time FadeFrameCount Float Number of frames to fade alpha from opaque to invisible
UseNoDepthWrite Boolean Force no-depth-write material flag on during the fade
Material Color Warp Experimental ability which performs a hue warping of the constant color of a material. RateMultiplier Float Multiplies the script playrate by this amount to determine actual playrate
Node Abilities Apply Bone Frames Applies data from a bone frames object to the current bone state BoneFrames Object Bone Frames object to apply
RateMultiplier Float Multiplies the script playrate by this amount to determine actual playrate
StartFrame Float Frame within the frames object from which to start playing
Exclude[] String Exclude the given bones when animating
ExcludeTree[] String Exclude the given bones and their children when animating
BlendFactor Float Maximum blending factor to use between 0.0 and 1.0, either set immediately or ramped via BlendIn/BlendOut parameters
BlendInFrameCount Float Number of frames used to blend in animation after ability start, or zero if blending is not used
BlendOutStartFrame Float Frame number at which to start blending out animation, used only if BlendOutFrameCount is not zero
BlendOutFrameCount Float Number of frames used to blend out animation after BlendOutStartFrame, or zero if blending is not used
UseFilterAsExclusion Boolean If true, uses current Node Filter settings for exclusion purposes only, not as a full bone transformation filter
Apply Lipsync Curve Applies data from a bone frames object to the current bone state LipsyncCurve Object Lipsinc Curve object to apply
VisemeBoneFrames Object Bone frames object with viseme base poses
RateMultiplier Float Multiplies the script playrate by this amount to determine sequence playrate
StartFrame Flaot Frame from which to start playing the animation sequence
Node Filter Excludes/Includes nodes and/or node subtrees to determine which nodes are currently active. Other node-affecting abilities can look at which nodes are active or inactive during evaluation. All nodes are made active at the start of each frame, so any deactivations will cease when this ability terminates. If more than one of these abilities is chained together, the inclusions of the later abilities may override the exclusions of the previous ones. NodeNames[] String Changes the active/inactive status of the given nodes. The status change is indicated by '-' and '+' characters, or a number between 0 and 100 followed by '%' characters, prefixed to the front of a node name itself:
  • -NodeName: Exclude the node by itself
  • --NodeName: Exclude the node and all its children
  • +NodeName: Include the node by itself
  • ++NodeName: Include the node and all its children
  • ###%NodeName: Partially exclude the node by itself
  • ###%%NodeName: Partially exclude the node and all its children

### is percentage where 0 is full exclusion, 100 is full inclusion

Because the exclusions/inclusions are performed in series, the order the nodes are indicated does matter. Node names without prefixed '-' or '+' characters, or a number and '%' combination, are ignored.

Node Gravity Well Experimental ability for performing a gravity effect on the entity's nodes. Not very effective, and made largely obsolete with the addition of the (more useful) Point Gravity Well ability. Radius Float Unit radius of effect
Strength Float Effect strength
GravityNode String Name of node acting as the center of gravity
Node IK Reach Performs a very simplistic Cyclic Coordinate Descent based Inverse Kinematics (IK) operation on a node chain, attempting to get the end node to reach the given target node. Not recommended for use unless the desired alterations are relatively minor. TargetNode String Name of target node to reach for
EndNode String Name of end effector node that should reach towards the target
RootNode String Name of root node beyond which to stop reaching; uses hierarchy root if empty
Iterations Integer Number of iterations to repeat the reach process at each evaluation
Node Look At Performs a "look at" operation on the given node, orienting it towards the target node over time. This ability has been superceded by the new and improved "Node Look At 2" ability, which should be used instead for new assets requiring "look at" functionality. TargetNode String Name of target node to look at
LookNode String Name of node that should look at the target
RotScale[3] Float Roll/Pitch/Yaw scale factors to adjust rotation amount
RotSpeed[3] Float Roll/Pitch/Yaw speed factors to adjust rate of rotation over time
RotClamp[3] Float Roll/Pitch/Yaw +/- angle limits in degrees
IsRelative Boolean Whether or not the adjustment should be relative to current orientation
AffectChildren Boolean Whether or not the adjustment should take the node's children along with it
LocalOrigin Boolean Use the local node origin for the base of rotation rather than the entity origin itself
UseDefault Boolean Whether or not the adjustment should be based on the default bone pose or not, used only when IsRelative is true
UseProcessBlend Boolean Whether or not to factor in the process blending value. For backward compatibility, the default is false (do not use blending).
Node Look At 2 Performs a "look at" operation on the given node, orienting it towards the target node over time. "Node Look At 2" has similar parameters as the first "Node Look At" ability, but with an improved underlying implementation to make the clamping and interpolation behavior more robust. Since the details of these changes make the results slightly different, the decision was made to add the improvements in the form of this new ability, rather than modify the original Node Look At behavior in a way that was potentially not backwards-compatible. So existing assets can continue to use the old ability without worry, while new assets can (and should) use this new & improved ability when applicable. TargetNode String Name of target node to look at
LookNode String Name of node that should look at the target
RotScale[2] Float Pitch/Yaw scale factors to adjust rotation amount
RotSpeed[2] Float Pitch/Yaw speed factors to adjust rate of rotation over time
RotClamp[2] Float Pitch/Yaw +/- angle limits in degrees
IsRelative Boolean Whether or not the adjustment should be relative to current orientation
AffectChildren Boolean Whether or not the adjustment should take the node's children along with it
LocalOrigin Boolean Use the local node origin for the base of rotation rather than the entity origin itself
UseDefault Boolean Whether or not the adjustment should be based on the default bone pose or not
UseProcessBlend Boolean Whether or not to factor in the process blending value
ClampBaseNode String Name of node used to determine base angles for clamping, if any
Node Noise Experimental ability for performing function-composition-based rotation noise. Uses current Node Filter state to determine which nodes to apply noise to. AngleDegreeLimits[3] Float Maximum angle to manipulate roll/pitch/yaw by, in degrees
AngleRateMultipliers[3] Float Amount to multiply the rate of roll/pitch/yaw manipulation by
Node Oscillator Oscillates a node's rotation over time, using a sine wave pattern with roll/pitch/yaw angles. RepeatFrameCount Float Number of frames it takes for the oscillation to repeat
AngleDegreeLimits[3] Float Maximum angle to oscillate roll/pitch/yaw by, in degrees
AngleRateMultipliers[3] Float Amount to multiply the rate of roll/pitch/yaw oscillation by
EndNode String Name of end node of oscillator chain
RootNode String Name of root node beyond which to stop oscillating; uses hierarchy root if empty
UseProcessBlend Boolean Whether or not to factor in the process blending value. For backward compatibility, the default is false (do not use blending).
Node Rotator Rotates a node (and its children) over time, with the rotation rate itself being adjustable over time.

Durations are number of frames it takes to rotate the roll/pitch/yaw angle by a full 360 degrees (lower number means faster rotation rate). Positive values rotate the angle counterclockwise using Duration. Negative values rotate the angle clockwise using -Duration. Zero values indicate axes that should not be rotated.

NodeName String Name of the node that should be rotated
RotationOffset[3] Float Rotation offset roll/pitch/yaw angles in degrees, added to the rate-computed angle
DurationStart[3] Float Starting roll/pitch/yaw rotation duration
DurationEnd[3] Float Ending roll/pitch/yaw rotation duration
FrameCount Float Number of frames between start and end; zero means use DurationEnd instantly
BlendRotationOffset Boolean Whether or not to factor in the process blending value in the initial rotation offset. For backward compatibility, the default is false (do not use blending).
Node Rotator 2 Rotates a node (and its children) over time, based on a starting angle and ending angle. The rate itself can be adjusted by specifying the starting and ending rates, which affect the slope of the interpolation curve over time.

This ability is only useful for gradual rotations that require a specific starting and ending angle, with no wraparound. For performing rotations that should wrap and/or don't have specific ending angles, a different Ability should be used.

NodeName String Name of the node that should be rotated
StartRotation[3] Float Start rotation roll/pitch/yaw angles in degrees
EndRotation[3] Float End rotation roll/pitch/yaw angles in degrees
StartRate Float Slope of rotation rate curve at start
EndRate Flaot Slope of rotation rate curve at end
FrameCount Float Number of frames between start and end; zero jumps to end immediately
Node Scaler Scales a set of nodes (and their children) over time, between two scale factors ScaleStart Float Starting scale factor
ScaleEnd Float Ending scale factor
FrameCount Float Number of frames between start and end; zero means use ScaleEnd instantly
NodeNames[] String Names of nodes to scale
UseProcessBlend Boolean Whether or not to factor in the process blending value. For backward compatibility, the default is false (do not use blending).
Node Translator Translates a node (and its children) over time, based on a starting position and ending position. The rate itself can be adjusted by specifying the starting and ending rates, which affect the slope of the interpolation curve over time. NodeName String Name of the node that should be translated
StartPosition[3] Float Starting XYZ point position
EndPosition[3] Float Ending XYZ point position
StartRate Float Slope of translation rate curve at start
EndRate Float Slope of translation rate curve at end
FrameCount Float Number of frames between start and end; zero jumps to end immediately
IsRelative Boolean True if position is relative to parent node, false if position is in world space
Vertex Abilities Point Flattener Flattens and collapses the points of the mesh surface along a given axis. VertOffset Float Vertical offset to start flattening process
VertHeight Float Vertical height to move over the course of the flattening process
VertThickness Float Vertical height thickness to flatten from center
FlattenFrameCount Float Number of frames for flattener to use from full to flattened. A negative count inverts the process, from flattened to full
VertAxis Enumeration:
PosX
NegX
PosY
NegY
PosZ
NegZ
Axis that's treated as "vertical" upward, for flattening purposes
UseRootAdjust Boolean Adjust the flattening axes according to the root bone rotation
Point Gravity Well Performs a gravity effect on the points of the mesh surface. Radius Float Unit radius of effect
Strength Float Effect strength
GravityNode String Name of node acting as the center of gravity
Point Plumper Performs a "plumping" of the points of the mesh surface outward based on the vertex normal and the depth of the node in the node hierarchy. Radius Float Unit radius of plumping
PlumpFrameCount Float Number of frames for plumping to expand from center to radius; must be nonzero
Point Rippler Performs a vertical ripple effect on the points of the mesh surface. Radius Float Unit radius of end of rippler
RippleFrameCount Float Number of frames for rippler to expand from center to radius
RippleNode String Name of node acting as the center of the rippler
Thickness Float Unit thickness of rippler around the current radius
Strength Float Strength of rippler deformation
NormalWarpFactor Float Factor to multiply amount that the vertex normals are warped by
Point Shockwave Creates a spherical shockwave effect on the points of the mesh surface, emanating from the given node. Radius Float Unit radius of end of shockwave
ShockFrameCount Float Number of frames for shockwave to expand from center to radius
ShockNode String Name of node acting as the center of the shockwave
Thickness Float Unit thickness of shockwave around the current radius
Strength Float Strength of shockwave deformation

Changing the parameters of an ability is done entirely by using the context menu of the Parameters column. While the cells in the Parameters column show all parameters condensed on a single line, the context menu shows them in a more human-readable fashion. Each parameter is represented by one context menu entry. In case if strings, integers, floats and objects, the parameter values can be changed by clicking on their entries. In case of other data types, such as booleans, arrays and enumerations, the entries become submenus that list the names and values of their elements or possible choices for the parameter.

Dynamic arrays are handled in a unique fashion here. They are also represented by submenus, which are initially empty aside from a separator and an entry New Value. Pressing that and entering a value makes it appear in the submenu. This new value itself has a submenu with the choices Change and Remove.

Sub-Attributes tab

This tab is very similar to the Attributes tab. The only difference between them is their scope - values entered into the Attributes tab affect the whole Entity Scripts object, while values in the Sub-Attributes tab affect only the script that is currently selected.

This tab has no predefined attributes. Also, none of the custom attributes need to be added by hand - they are added automatically by using the context menu in the Workspace window. But you can edit the attributes here.

Custom attributes

Name Type Comment
AnimBaseName String Compatibility option. Seems to always be set to the same name as the script name itself.
AnimSlotName String Compatibility option. Also seems to be set to the same name as the script name, but if it ends with a number, the number is omitted and entered as AnimVersion instead. Sometimes it's used as a group name for several scripts.
AnimVersion String Compatibility option. Seems to contain the trailing number in the script name.
AnimPostureExt String Posture on which this animation should be played, defined in Agent scripts.
AnimWeaponExt String Weapon type this animation should be played on, defined in Agent scripts.
NotifyCount Integer How many times a notification should be sent.
NotifyText String What the notification should contain. Presumably it gets used in the game itself (or by the agent scripts), in order to synchronise animations to game events. See AidaScripts.TypeAngle2Boards for a usage example.
NotifyTime Float When the notification should take place, in percentage. Presumably also at what intervals it should repeat, if NotifyCount is more than 1.
Comment String A comment that doesn't have any effect. Used in IzarianAnimsScripts.AimFrwd_Fr02_LG.

Context menu options

In addition to this rich-functionality Edit Object window, objects in the Entity Scripts category have a few new context menu options in the Workspace window. The first two are Copy Scripts and Move Scripts. They allow you to transfer or duplicate selected scripts in the object to other GEM files and objects of the Entity Scripts category.

The next option is titled Lipsync Curves Batch Import. It allows you to import multiple LIP or SYNC files and update the selected Entity Scripts object accordingly. More about this in the Lipsync Curve section. This is the original explanation of this option:

Batch import viseme text: This command will add/replace a set of viseme curve objects in the parent gem file from a list of viseme curve text files, and then add/replace corresponding scripts within this scripts object. The names of the viseme curve objects and the scripts will be taken from the names of the imported files.
Any existing viseme curves in the file and/or any existing scripts matching one of these names will be replaced automatically; you will not be asked for confirmation.

Next is an option titled Run Attribute Extractor. This option generates the Anim* sub-attributes by parsing animation names. This is the original explanation:

Animation Attribute Extractor: This command is for scripts used by character meshes in Unreal 2, when the script name is in the form:
[SlotName-]BaseName[Version][[.Posture].Weapon]
For these scripts, this command will extract the base name, slot name, version number, and the weapon and posture extensions into script sub-attributes. Afterwards, the script name will have any explicit slot name removed, and all dots will be replaced with underscores to allow Unreal 2 compatibility. Scripts with an existing AnimBaseName attribute will be skipped, to keep this operation from being performed twice.
Since this command makes significant changes to the object contents, you should NOT have an Edit Object box open on this Scripts object while this operation is being performed.

The last new option is titled Add Notify. This option adds the Notify* sub-attributes to the scripts. When selected, you will be asked to select which scripts to apply the new notification to, then to enter the notification name and time in percentage.

Level-of-Detail Information

This type of objects also have to be added manually if they are needed. They contain information about lower quality versions of a model that is shown when the player is too far for the complete model to be worth rendering. These objects tie in with objects from the Triangles category.

Default attributes

Name Type Default value Read-only Comment
LODCollapseCount Integer 0 Yes The amount of edge collapses calculated for the model.
LODTriCount Integer 0 Yes The amount of triangles in the model.
LODVertexCount Integer 0 Yes The amount of vertices in the model.
LODPointCount Integer 0 Yes The amount of points (unique vertices) in the model.
LODNormalCount Integer 0 Yes The amount of normals in the model.
SourceModel Object None Yes The model from which this LOD information was generated.

Context menu options

Level-of-Detail Information has only one new context option in the Workspace window, titled Generate from Model. When selected, you are asked to select an object in the Model category, then a warning appears:

LOD Generation: This process generates LOD information by computing edge collapses. It is an extensive computation, which can take from several seconds to several minutes depending on the model complexity and your CPU speed.

Once you confirm your action, the edge collapses for the selected model will be calculated and written to the selected Level-of-Detail Information object. Note that these are just edge collapse data, and not LOD levels by itself. These calculations are an intermediary step in creating LOD levels for a model. To create the actual LOD levels, see the Triangles section.

Lipsync Curve

The Lipsync Curve category objects contain information on lip synchronisation. Each of the objects in this category can contain information only on lipsyncing to a single sound file - to get more, you need to create additional Lipsync Curve objects. The Lipsync Curves Batch Import option in the |Entity Scripts context menu can automate the import of these objects if there are many of them. Since lipsyncing is controlled via Entity Scripts, these objects have very little options or attributes.

Default attributes

Name Type Default value Read-only Comment
TextLength Integer 0 Yes The size of the imported LIP file, in characters.
PlayRate Float 1.0 Yes The speed of the lipsync animation, in frames per second.
FrameCount Integer 0 Yes The amount of frames this object contains.
SrcFileName Integer None Yes The filename of the imported LIP file.

Context menu options

The only new context option for Lipsync Curve objects is titled Import Text File. It does exactly what it says - it imports the information on the lip synchronisation. When selected, it asks you for a file in either the LIP (LIPSinc AniMeter Function Curve) or the older SYNC (LIPSinc Echo Function Curve) format. Both of these formats were used by external lipsync programs - Echo and AniMeter, but they are no longer sold and the company that produced them is long defunct. However, it is possible to still get this data. You will need to use the successor of AniMeter, called Impersonator Studio that came with Unreal Tournament 2004, to create these lipsync curves, and then use the LTF to LIP converter to convert Impersonator files to AniMeter files. More information in Lipsync Tutorial.

Materials

Objects in the Materials category contain information on what textures are applied to the model and how they should be manipulated before they are applied. Material objects are another kind of extensively modifiable objects. They can contain an infinite number of materials, but they are applied to a single model. The context menu in the Workspace window doesn't contain any unique options.

Default attributes

Name Type Default value Read-only Comment
MaterialCount Integer 0 Yes The amount of materials defined in this object.
LevelCount Integer 0 Yes Unknown, always equal to MaterialCount.

Materials tab

The Materials tab

The Edit Object window of objects in the Materials category contains a new tab, titled Materials. It is divided into a whopping 12 sections. This whole tab allows you to directly modify the way materials are rendered within Direct3D8, the renderer used in Unreal II. Unlike the materials implementation that Epic Games implemented in UnrealEd, which abstracts the Direct3D calls and therefore allows for better compatibility, the Golem Studio material implementation is a visual wrapper around the D3D calls, therefore allowing far more precise control over what is being rendered.

The first section is called Current Material. It contains a drop-down box and three buttons. The drop-down box allows you to select a material for editing. The three buttons are Add, Rename and Delete. They manipulate the amount of materials defined in the object as well as their names. The functions are self-explanatory.

The section below and to the left of the previous one is titled Priority. It contains a text box and a button Change. Pressing it allows you to enter a number from 0 to 255, with the default being 0. This option changes the Z buffer of materials with alpha blending. It should be used for tweaking problematic textures that use alpha blending.

Below that is a section called Blend Src/Dest. It has two drop-down boxes. They only matter when the Blending checkbox is selected. These drop-down boxes select what colours will be applied and how (the top one selects the source, the bottom one selects the destination). Most of the times when dealing with textures with an alpha map, the blending source controls the colour, while the destination controls the alpha value. For more information on this, see the Blending article on the OpenGL wiki. Note that the renderer is Direct3D8, but OpenGL uses the same implementation and has a rather good article explaining most of these options. The drop-down box values are shortly described below.

Value OpenGL equivalent Comment Result if used as source Result if used as destination
Zero GL_ZERO Use zero in equations. The texture becomes black. The texture becomes matte.
One GL_ONE Use one in equations. The texture uses its own colour multiplied by its alpha. The texture becomes translucent (pretty much equivalent to setting a Translucent flag to a BSP surface in UnrealEd).
SrcColor GL_SRC_COLOR The texture colour itself. The texture uses only its own colour. Should not be used intentionally.
DstColor GL_DST_COLOR Unknown - undefined?
SrcAlpha GL_SRC_ALPHA​ The alpha component of the texture. The texture uses its own colour divided by its alpha. Uses an inverted alpha mask.
DstAlpha GL_SRC_ALPHA​ Unknown - undefined? Same as One.
SrcAlphaSat - Unknown The texture uses alpha blending, but anything that doesn't have an alpha mask appears black behind the alpha surface. Undefined behaviour.
1-SrcColor GL_ONE_MINUS_SRC_COLOR Inverted SrcColor. The texture becomes a negative of itself. Should not be used intentionally.
1-DstColor GL_ONE_MINUS_DST_COLOR Inverted DstColor.
1-SrcAlpha GL_ONE_MINUS_SRC_ALPHA​ Inverted SrcAlpha. The texture uses its own colour divided by an inverted alpha mask. Uses the alpha mask.
1-DstAlpha GL_ONE_MINUS_DST_ALPHA​ Inverted DstAlpha. Same as Zero.

The most often used combination is SrcAlpha as input and 1-SrcAlpha as output, which is equivalent to enabling alpha blending using UnrealEd materials. But, as seen above, more options are available, such as adding flat translucency.

Aida with materials using the Subtract function

The section to the right is called Colors. It contains a drop-down box, one colour box, one text box and two buttons, titled Color and Alpha. The drop-down box has options Diffuse, Specular, Ambient, Emissive and Constant. Pressing the Color button brings up the colour selector, while pressing the Alpha button allows you to input a value from 0 to 255. Changing the Diffuse changes the colour of the texture, with white being the real colour and black being completely black. Changing the Ambient colour makes the texture glow in the dark in that colour. Changing the Emissive colour has a similar effect, but it effects some of the lit places and dark places are not lit as much. Changing Specular, Constant and any of the Alpha values doesn't seem to have any effect, at least inside Golem Studio.

Below is a section called Shader Names. It has two text boxes and two Change buttons. The first one is called Vertex and is used for applying a vertex shader to the material, and the second is called Pixel for the pixel shader. This section is experimental, so it should be avoided, especially given that during the time Golem Studio was created, only assembly-based shader programs were available.

The section below is titled Flags. Here you can set three flags - Two-Sided, Blending Enabled and No Depth Write. All of them are disabled by default. The first flag makes a material visible from both sides, the second enables blending effects, such as alpha blending support, and the third flag is for working around issues related to the Z depth buffer.

Moving to the right block, at the top left we have a section titled Current Stage #. It contains a text box and two buttons. The number in the box indicates the stage number, while the Prev and Next buttons change the selected stage. A stage is in essence a texture layer. Adding more stages will add more textures on top of the previous ones, and this section allows you to select a stage for editing.

To the right of the previous section is another section titled Stage Texture Name. This is where you set a texture to the material (or to the currently selected stage, to be more precise). The Change button allows you to change the value in the text box. The format should be the filename of the texture you want, without the extension. These texture files need to be placed inside the same directory on disk as the GEM files, and the possible image formats seem to be TGA (Targa) and DDS (DXT).

Aida with materials using the DotProduct3 function

Below and to the left is a section titled Stage Color Function. Similarly to the Blend Src/Dest section, this changes the appearance of the texture stage. You can chain texture layers this way, or change the appearance of a single stage. There are three drop-down boxes here, with the largest one being the blending function to add, with a very large variety of options (unfortunately, they are difficult to describe, you need to try that by yourself). The lower left drop-down box allows you to select the first argument (which source it affects, the options being Default, Diffuse, Current, Texture, Specular and Constant, with Default being the same as Texture). The lower right drop-down box selects the second argument (affected destination). If the first or second argument is Current, it will use the lower stage as the blending source or destination. Selecting Diffuse, Specular and Constant takes colour information from the respective channels, as defined in the Colors section. Of particular note are the blending options SelectArg1 and SelectArg2 which drop one of the arguments and shows only the remaining one, so that you can see exactly what textures are being blended together in that stage. There are also two checkboxes below each argument, labelled One Minus and Alpha Rep. The former reverses the blending effect, and the latter uses the alpha channel from the stage texture as a mask.

The section to the right is titled Stage Alpha Function. It only matters for materials with an alpha mask, as it manipulates how the alpha channel is perceived. The options are the same as in the previous section, just instead of changing the colour, the alpha channel strength is changed. For instance, selecting the function to be Modulate4X will make an alpha channel look more like a mask (either completely transparent or completely visible).

Below is a section titled Stage Texture Coordinate Source. It contains a text box, labelled Stage Index, and a button Change. It seems to be disabled, and so far no way to enable it has been found, so it is set to 0 all the time. To the right is a drop-down box labelled AutoGen. Changing its value makes the texture coordinates change according to the camera view, allowing for a selection of different reflective looks.

Aida with materials using the Reflection Vector coordinate source

Below that is the last section, called Stage Flags. It contains two flags – Disabled, which disables the selected stage entirely, and No Smooth Filter, which disables the smooth filter so that the selected stage shows pixels instead of trying to smooth them out. There is also a label This space intentionally left blank for expansion, which apparently never came.

Using the stage functions, at least in theory it should be possible to set up the use of both normal maps and bump maps in Golem studio. See this and this respectively for more information about that.

Model

Objects in the Model category are automatically generated on model import, so they should never be added manually. Hence they have very few options. Note that models by themselves don't contain any information apart from references to other objects that comprise the model. There are no unique context menu options for these objects.

Default attributes

Name Type Default value Read-only Comment
Vertices Object None No Reference to a Vertices object used by the model.
Triangles Object None No Reference to a Triangles object used by the model.
BonePoints Object None No Reference to a Bone Weighted Points object used by the model.
PointFrames Object None No Unknown, reference to either a Point Normal Frames or a Point Position Frames object or their quantised versions used by the model. Optional.
ColorFrames Object None No Reference to a Color/Alpha Frames object used by the model. Optional.
TexUVFrames Object None No Reference to a Texture UV Frames object used by the model.
Materials Object None No Reference to a Materials object used by the model.

Custom attributes

Name Type Comment
MaterialName String Automatically generated on import or generation of a model if it has any materials defined. Does not get updated if the materials are changed, and doesn't seem to have any real effect.

Physical Ragdoll

Objects in the Physical Ragdoll category also have to be added manually. They define solids and joints in the model that allow ragdoll physics. The Edit Object window for this type of objects contains even two new tabs, titled Joints and Solids.

Default Attributes

Name Type Default value Read-only Comment
SolidCount Integer 0 Yes The amount of solids defined in this object.
JointCount Integer 0 Yes The amount of joints defined in this object.

Solids tab

The Solids tab

This tab functions very similarly to the Abilities section in Entity Scripts. It's a list with different columns, listed below.

Column name Allowed types Comment
Index Integer The number of a defined solid. This is read-only.
Enabled Boolean Whether the solid is in use or not.
ParentBone String The name of a bone, to which the solid is attached.
SolidType Enum: None, Sphere, Cylinder, Capsule, Box The shape of the solid.
Dimensions Depends on solid type The size of the solid.
Position Float[3] The offset from the parent bone.
Rotation Float[3] The rotation difference from the parent bone.
Mass Float How heavy the solid should be.

You can add, remove and edit entries as usual, by using the context menu or double-clicking.

If you select a solid type to be None, then you can't enter anything in the Dimensions field. If you select Sphere, you need to define its radius. If it's a Cylinder, then you have to define both a radius and a height. The same goes for the Capsule type. And if it's a Box, you need to define the three coordinates.

Joints tab

The Joints tab

Similarly to the Solids tab, the Joints tab is a list. It has different columns, however, and quite a bit more options.

Column name Allowed types Comment
Index Integer The number of a defined joint. This is read-only.
Enabled Boolean Whether the joint is in use or not.
ParentBone String The name of a bone associated with this joint. This is the bone from the LinkBones pair that is the source of the movement limits as defined by the joint type.
JointType Enum: Unassigned, BallSocket, Universal, Hinge, ConeLimit, Skeletal The physical restrictions that should apply to this joint.
LinkBones String[2] The bones that this joint connects.
Position Float[3] The offset from the parent bone.
Rotation Float[3] The rotation difference from the parent bone.
Parameters Depends on joint type Extra parameters specific to the selected joint type.

Since there are quite a few joint types and each contains a large set of parameters, the table below lists them.

Joint type Comment Parameter Type Default value Comment
Unassigned This is the default joint type. Probably the effect is the same as if it was a disabled entry. You can't set this type again after another was assigned.
BallSocket This joint type doesn't appear to have any parameters. Could be that it's been obsoleted by ConeLimit.
Universal This joint type also doesn't seem to have parameters. Possibly because it allows the connected bones to move freely.
Hinge This joint type resembles a door hinge. It is the most common joint type, as some ragdolls have only this type of joints defined. LowerLimit Float[3] Angle=-180.0
Stiffness=Infinite
Restitution=0.0
Defines the lower limits of how the hinge joint should be allowed to move. Of note is that if a negative value for Stiffness is entered, it's considered to be infinite, and the word Infinite appears instead of a float value.
UpperLimit Float[3] Angle=180.0
Stiffness=Infinite
Restitution=0.0
Defines the upper limits of how the hinge joint should be allowed to move. Same as above, just with the opposite end of the hinge.
ConeLimit This joint type allows bones to move in a cone shape from the parent bone. Angle Float -1.0 The angle of the cone that limits how the linked bones are allowed to move.
Stiffness Float Infinite Unknown
Damping Float 0.0 What dampening effect should be applied to the movement of linked bones.
Skeletal This joint type is used in case of closely connected series of bones, such as those that define a tail or the dreads of a Skaarj. ConePrimaryAngle Float -1.0 Unknown, some sort of cone angle
ConeSecondaryAngle Float 180.0 Unknown, some sort of cone angle
ConeStiffness Float Infinite Unknown
ConeDamping Float 0.0 What dampening effect should be applied to the movement of linked bones.
TwistAngle Float 0.0 Unknown
TwistStiffness Float Infinite Unknown
TwistDamping Float 0.0 Unknown

Context menu options

Objects in the Physical Ragdoll category have four unique context menu option. The first is titled Build from Hierarchy. It simplifies the process of creating a ragdoll by creating solid and joint entries for each bone defined by a selected Bone Hierarchy object. When building the hierarchy, you also need to provide the base mass for the ragdoll. The result of this command is a list of all bones in the Solids tab with automatically generated mass values, but without any shape, position or rotation information. And in the Joints tab, all of the bone connections are defined and given a Hinge type. Again, no positioning or rotation is defined for these joints, and the parameters use the default values.

The second option in the context menu is called Scale Solid Masses. When selected, you need to enter a multiplier that then gets applied to each of the solids' mass. This is useful if you decide that the mass of the ragdoll on the whole should be different than what you initially selected when generating it.

The last two options are called Copy Solids From Ragdoll and Copy Joints From Ragdoll. They allow you to copy the list of solids and/or joints from another Physical Ragdoll object. These copied values overwrite whatever was in the list before copying.

Point Normal Frames