text: shown in other instead.
  Unigine::Skinner
  Skinner is a visual scripting system for animations. It allows blending different animations together to create complex movements of skinned characters. It also possible to include the physical ragdoll into played animation (for the whole the character or per bone).
  The Skinner is based on Unigine::Schemer. Skinner scripts can be found under data/core/systems/skinner folder.
  The predefined Skinner blocks that are available by default are contained in the data/core/systems/skinner/blocks/skinner.blocks file.
  How To Use Skinner Graph
  Skinner is built based on Unigine::Schemer. It uses the same entities (see Schemer overview) and shares blocks with it. That means, you can add any of the Schemer block to be used in Skinner graph.
  - Skinner graph is created in the same way as Schemer one (see the how-to guide).
  - The skinned mesh that Skinner controls is specified in the script (see the details below).
  - By default, the Skinner graph should start with schemer.entry named update (see the details below).
  - It is possible to create entry point for playing a single animation event. It can be used to create a momentary action, for example, a punch or an action to pick up an item, instead of playing a looped animation (see details below).
  - All Skinner nodes in the graph, just like Schemer ones, are triggered by dragging a path to their input. After thy has finished their work, an output path is used to trigger next following nodes, if any.
  For a start, do the following to create a simple graph that sets an animation to the mesh:
  - Create schemer.entry named update as the start-up point for the graph.
  - Add skinner.animation node that will load the animation. Connect schemer.entry output with the input of skinner.animation by dragging a joint. By doing this, you indicate what node to execute after the graph has been run.
  - Add schemer.file node that will specify the skinned animation file name. Connect it to the name anchor of skinner.animation node.
  - Add skinner.set node that will play the animation (i.e. set animation to the mesh). This node needs an animation buffer that contains bones transformation data. Connect skinner.animation buffer to the skinner.set buffer. Connect skinner.animation output to skinner.set input to indicate that this is the next node to be executed.
  - After the Skinner graph has been created or modified, click Run button. A script will be generated out of the graph, compiled on-the-fly and run.
  - You can also save the created script into *.script file via Save button for it to be loaded and edited later or executed at runtime.
  Here is how this simple Skinner graph would look like. Nodes will be executed in the specified order.
  Available Skinner Blocks
  The following blocks are the predefined Skinner blocks loaded from data/core/systems/skinner/blocks/skinner.blocks file.
  How to Run Skinner Script
  To initialize the Skinner (here, without the visual editor), you need to add the code as in the following example. First of all, a mesh to be controlled by the Skinner is specified. After that, similar to running a Schemer, you need to call update() function. However, it must be called from within world script update() and this function requires to be passed the inverse FPS value to play animations. Update function will trigger execution of all nodes in the Skinner graph one by one starting from the schemer.entry named update and further in the specified order.
  #include <core/scripts/utils.h> #include <core/systems/skinner/skinner.h> #include <samples/common/common.h> Unigine::Skinner::Skinner skinner; Unigine::Skinner::SkinnerMesh skinner_mesh; /* */ int init() { // Use Skinner namespace. using Unigine::Skinner; // Load the skinned mesh and add it into the editor. ObjectMeshSkinned mesh = add_editor(node_load("samples/skinner/meshes/agent.node")); // Create a Skinner. skinner = new Skinner(); // Create SkinnerMesh that will manage the executable script compiled from a graph. skinner_mesh = new SkinnerMesh(skinner,mesh); // Load a graph that scripts character behavior. skinner_mesh.loadScript("samples/skinner/scripts/agent_00.script"); return 1; } int update() { float ifps = engine.game.getIFps(); // Update Skinner mesh. skinner_mesh.update(ifps); return 1; }
  In case of using ragdolls, render() function of the world script instead of update() can be used as a starting point for a graph. It will allow to get animations transformation in the current frame and use this data to simulate physics-driven ragdoll. (See details on render().) In this case, schemer.entry named render.
  int render() { float ifps = engine.game.getIFps(); // Run the Skinner graph script from "render" entry. skinner_mesh.render(ifps); } return 1; }
  How to Run Event
  To create a one-time action, you can call event() function of the Skinner (found in data/core/systems/skinner/skinner_mesh.h). It will simply call an update function for Skinner script created from a graph with the passed name.
  int id = skinner_mesh.getEventID(entry_name); skinner_mesh.event(id);