Switched to a state machine wrapper around OpenGL (Shader class). This prevents unecessary changes to the state, which can increase FPS when previewing a large amount of models by about 50% or so.
Added mesh sorting for the models mesh batch for non-semi-transparent meshes.
Added option to show hierarchy skeleton with models. Note that this is somewhat experimental, as the size of joint nodes is decided by standard deviation (basically an average). Most models work fine, but for example, Frogger 2 frog models have joint nodes that are way too large. An option to adjust node size will be added in the future.
Added UI option to change how models are selected (either via bounds intersection or triangle intersection, or off).
Added UI option to preview a texture's palette.
Added UI option to preview a texture's/VRAM's semi-transparent bits.
Added UI option to disable camera rotation resetting when focusing.
Neversoft PSX models now have hierarchy coordinates, meaning they can be used with PSI/HMD animations. NOTE that PSX animations themselves still aren't readable/supported.
Fix BFF (FMM/FMW) sprites using the wrong vertex order, thus being invisible without Force Double-Sided enabled.
Added PreviewForm GetSelectedEntityBase and GetSelectedRootEntity, to reduce code duplication in the dozens of locations that all try to do the same thing.
Switched to int type instead of uint for OpenGL returned IDs (names). This was decided since int is the default type returned and accepted by GL. Note that setting a sampler uniform MUST HAVE THE ID CASTED TO UINT!
Fixed MeshBatch.ReuseArray not assigning to the array field, making the function completely useless.