EMI: Make SCXTrack behave like MP3Track in regards to isPlaying
EMI: Make sector name comparisons match GRIM and EMI. Fixes #873 and #895.
EMI: Use a hash map for joint lookup by name.
EMI: Move methods that require animation state information from AnimationEmi to AnimationStateEmi.
EMI: Store joint indexes to avoid joint lookup by name in each animation step.
MATH: More efficient matrix multiplication implementation for 3x3 and 4x4 matrix specializations.
EMI: Save and restore chore instance IDs.

Previously chore instance IDs stored as Lua userdata became invalid after
loading a save, because the chores were recreated with different IDs. This
caused certain opcodes like StopChore to fail.
EMI: Fix compatibility with older savegames.
Merge pull request #923 from Akz-/emi-anim-perf

EMI: Animation performance optimization
GRIM/EMI: Fix bridge height check. See #842
GRIM/EMI: Remove bridge length check.
MATH: Return false in intersectLine2d if lines do not intersect.
GRIM/EMI: Always walk towards the target position in a straight line if possible.
GRIM/EMI: The walk destination may reside in multiple sectors, so don't choose a single end sector.

This fixes Elaine walking through Guybrush at the end of the first cutscene in the set gme.
Merge pull request #911 from Akz-/emi-save-animation

EMI: Save/restore fixes
GRIM: Use exact string search when searching for shadow sectors.

Fixes shadows in set st.
GRIM: Test model center position instead of origin in shouldDrawShadow. Fixes #741
EMI: Implemented dynamic lighting for models.

Lighting is done by calculating vertex colors in software, since the attenuation model used in EMI cannot be simulated with OpenGL fixed function lighting. The original game does the lighting this way as well. Ideally for the modern shader-based renderer a shader would be used for this instead.
EMI: Only draw models for actors inside the view frustum.

This adds math classes for doing frustum culling in software. These could be used for optimizing performance in many other places as well. For example, if an actor is outside the view frustum, it may not be necessary to do expensive keyframe animation and vertex skinning calculations for that actor.
EMI: Implemented SetActorLighting.