Replaced attachments system with Joints. Instead of vertices trying to attach to vertices of a given ID, they now try to attach to a model joint with the given ID. These joints then have their matrices precomputed and dumped into an SSBO where the shader can look up the transform. This means you can now animate and display large models with attachments enabled without any lag. Because SSBOs require GLSL version 430. Checks have been put into place to see if its supported, and if its not, the program will fallback to baking connections like it used to.
To use the new joints system, RootEntity.PrepareJoints MUST be called after the model is setup (only if triangles have non-NoJoint joint values). Models must be assigned a joint ID that is referenced by a vertex/normal. Many models can share the same joint ID, but only the first will be used. Joint IDs (in the model and in the triangles) are remapped by RootEntity.PrepareJoints, so that only models that are needed as joints are put into the list.
glTF2 no longer exports joint nodes when it doesn't need to, now that what joints are needed are known ahead of time.
glTF2 now exports 1 skin per root entity, and not per the entire file.
Fixed Merge Models check box being disabled for glTF2 and DAE, even though support was added for it.
Changed scene.AutoAttach to AttachJointsMode, which can either be Hide (false), DontAttach (new), or Attach (true). Currently DontAttach cannot be enabled in the UI yet.
Fixed Neversoft PSX model joints not working with actor models. It turns out actors (for some insane reason) use the index of the model for the objects table to get the transform, when really the object matching the model index should be used. Currently this is detected by the presence of the BlockMap tagged chunk, and has had no issues with any games tested against.
Also fixed Neversoft PSX attachments not handling cases where an attachable vertex isn't used in a visible triangle.
Other changes:
Fixed entity picking always using triangles, instead of defaulting to bounds intersection.
Fixed entity picking triangle mode only using the first triangle intersection, meaning the closest entity wasn't always picked.
FPS label now also shows triangles, meshes, and skins (with shader-time-joints) drawn.
Fixed vertex/wireframe size control visibility not changing if the Scene.Draw function was taking too long.
Checking a root entity tree node now automatically handles fixing connections.
About window now shows the GLSL (OpenGL Shader) version number, and whether joints are shader-time or pre-computed.
AnimationType is now readonly, because changing this can potentially crash the program.
AnimationBatch no longer updates the models mesh batch every frame when paused.
Added TMD Bindings support to PSI/HMD animations.
TMD Bindings form is no longer 0-indexed for the binding values. It also now shows a display names (with optional animation object names) for each ID. Additionally, properties are no longer sorted, meaning you won't get 1, 10, 11, 2, 3...
Replaced the many pointless instances of Array.Resize with new[]. Because for some reason I thought it made sense to resize the array when reusing it (even though the old values weren't needed)...
Other changes:
and skins (with shader-time-joints)drawn.