#############################
Animated Creature via COLLADA
#############################

This tutorial shows how to get an animated creature from Blender to OpenMW using 
the COLLADA format. It does not cover using Blender itself, as there are many 
better resources for that. The focus is solely on the animation pipeline and its 
specific requirements. Most of them are related to how the model, rig, and 
animations are set up in Blender.

.. note::
    This tutorial builds upon the :doc:`pipeline-blender-collada-static-models` tutorial. All fundamentals of exporting static objects apply to animated ones as well.

Requirements
************

To use the Blender to OpenMW pipeline via COLLADA, you will need the following.

* `OpenMW 0.48 <https://openmw.org/downloads/>`_ or later
* `Blender 2.83 <https://www.blender.org/download/>`_ or later. Latest confirmed, working version is Blender 3.0
* `OpenMW COLLADA Exporter <https://github.com/openmw/collada-exporter>`_
* An animated model you would like to export. In our case the flamboyant Land Racer!

The Land Racer
**************

The creature, and its revelant files, are available from the `Example Suite repository <https://gitlab.com/OpenMW/example-suite/-/tree/master/example_animated_creature>`_.
This should be useful for further study of how to set things up in case this 
tutorial is not clear on any particular thing.

* ``data/meshes/land_racer.dae`` – exported model
* ``data/meshes/land_racer.txt`` – animation textkeys
* ``data/textures/land_racer.dds`` – diffuse texture
* ``data/textures/land_racer_n.dds`` - normal map
* ``source_assets/land_racer.blend`` – source file configured as this tutorial specifies

Model
*****

The model needs to be a child of the rig and have an Armature modifier asigned. 
Bone weights are limited to a maximum of 4 bones per vertex. The model needs to 
have default location, rotation, and scale.

.. image:: https://gitlab.com/OpenMW/openmw-docs/-/raw/master/docs/source/reference/modding/custom-models/_static/landracer-in-blender.jpg
    :align: center


Collision Shape
***************

Collision is set up with an empty named ``Collision`` or ``collision`` with a 
single child mesh. OpenMW will use the bounding box of this mesh for physics 
collision shape so a simple, cuboid mesh is enough. If no collision shape is 
defined, the bounding box of the animated model will be used instead.

.. image:: https://gitlab.com/OpenMW/openmw-docs/-/raw/master/docs/source/reference/modding/custom-models/_static/landracer-collision-shape.jpg
    :align: center


Armature / Rig
**************

.. note::
  Only a single rig object should be included in the exported file. Exporting multiple rigs is not reliably supported and can lead to errors.

Root
====

The rig needs to be structured in a specific way. There should be a single top 
bone in the rig’s hierarchy, the root bone named ``Bip01``. The name is 
required so OpenMW recognizes and uses it for root movement. For this same 
reason, the bone should be by default aligned with the world. The root bone 
needs to have its ``Deform`` flag **enabled**.

.. image:: https://gitlab.com/OpenMW/openmw-docs/-/raw/master/docs/source/reference/modding/custom-models/_static/landracer-root-bone.jpg
    :align: center


Deform Bones
============

Below the root bone, the bones are divided into two branches. One branch 
contains the deform bones which get included in the final exported file. These 
are otherwise not animated directly but inherit motion from other bones via 
constraints. They have their ``Deform`` flag **enabled**. For creatures, the 
deform bones can be named as you desire and don’t need to follow the naming 
convention used for NPC and player models.

.. image:: https://gitlab.com/OpenMW/openmw-docs/-/raw/master/docs/source/reference/modding/custom-models/_static/landracer-rig-hierarchy.jpg
    :align: center

Control Bones
=============

The other branch holds control and helper bones that enable comfortable 
animation in Blender, but are neither required nor included in the exported 
file. They have their ``Deform`` flag **disabled**. How these bones are 
structured is a big separate topic on its own that this tutorial does not cover, 
but you can study the provided source file.

  
Animations
**********

A creature in OpenMW is expected to have a set of animations to display its 
various actions. These animations are recognized and used by their name. 

.. list-table:: 
   :widths: 25 25 50
   :header-rows: 1

   * - Animation name
     - Possible variations
     - Purpose
   * - attack1
     - attack2, attack3
     - The creature performs an attack
   * - death1
     - death2 - death5
     - The creature dies while upright
   * - hit1
     - hit2 - hit5
     - The creature is hit in combat
   * - idle
     - idle2 - idle9
     - Flavour animations when the creature does nothing in particular
   * - knockout
     - /
     - When creature's fatigue goes below 0 and it staggers to the ground
   * - deathknockout
     - /
     - The creature dies while knocked out
   * - knockdown
     - /
     - When the creatures receives a heavy hit in combat or lands from a considerable height
   * - deathknockdown
     - /
     - The creature dies while knocked down 
   * - runforward
     - /
     - Moving forward fast
   * - walkforward
     - /
     - Moving forward at regular speed

Animating in Blender is done at 30 fps. Specific to how OpenMW works, each 
exported animation needs to take a unique range on the timeline. To achieve 
this, actions are placed as strips in the NLA editor with an obligatory one 
frame gap between them.

.. image:: https://gitlab.com/OpenMW/openmw-docs/-/raw/master/docs/source/reference/modding/custom-models/_static/landracer-nla-strips.jpg
    :align: center
    
NLA strips affect the exported result based on their scale, name, frame range, 
repetition, or any other factor affecting the end animation result. It's
*What you see is what you get* principle.

Root movement is required for animations such as ``walkforward`` and 
``runforward`` and is likely to work for other animations if needed.
Root movement works only when the root bone is named ``Bip01``.

Textkeys
********

The exported COLLADA file requires a corresponding textkeys file for OpenMW to 
properly read the animations. Textkeys is a ``.txt`` file containing animation 
definitions and events. At a minimum it needs to include at least animation 
``start`` and ``stop`` values in a format as shown in this example.
    
.. code::

    idle: start 0.033333
    idle: stop 2.033333
    walkforward: start 2.066667
    walkforward: stop 3.666667
    runforward: start 3.7
    runforward: stop 4.433333
    attack1: start 4.466667
    attack1: stop 5.433333
    ...

The textkeys file is placed in the same folder as the model and matches the model's name.

* ``meshes/land_racer.dae``
* ``meshes/land_racer.txt``

While it's possible to write it by hand, OpenMW's Collada Exporter offers a 
convenient option to export a textkeys file based on Blender's timeline markers 
(not to be confused with pose markers which are contained per action). What you 
need to do is create properly named timeline markers for each animation and 
enable the ``Export Textkeys`` option in the exporter.

.. image:: https://gitlab.com/OpenMW/openmw-docs/-/raw/master/docs/source/reference/modding/custom-models/_static/landracer-textkey-markers.jpg
    :align: center

In the example of ``walkforward`` the timeline markers should be named 
``walkforward: start`` and ``walkforward: stop``.


Exporter Settings
*****************

For animated models, use the following exporter settings. Before export, select 
all objects you wish to include in the exported file and have the ``Selected 
Objects`` option enabled. Without this, the exporter could fail.

.. image:: https://gitlab.com/OpenMW/openmw-docs/-/raw/master/docs/source/reference/modding/custom-models/_static/landracer-exporter-settings.jpg
    :align: center


Getting the Model In-game
*************************

Once the Land Racer is exported, both of its ``.dae`` and ``.txt`` files need to 
be placed in the correct folder where OpenMW will read it. Afterwards in 
OpenMW-CS, it should be visible in the Assets->Meshes table and can be assigned 
to the ``Model/Animation`` field of a creature.

.. image:: https://gitlab.com/OpenMW/openmw-docs/-/raw/master/docs/source/reference/modding/custom-models/_static/landracer-in-openmwcs.jpg
    :align: center

