Unigine::ObjectMeshSkinned Class
Header: | #include <UnigineObjects.h> |
Inherits: | Object |
This class is used to create or modify skinned meshes.
Creating and Playing Animation
To add the animation to the ObjectMeshSkinned and play it, do the following:
- Set the number of animation layers with the setNumLayers() method. There is only one layer by default.
- Enable the layer and set the animation weight for blending by calling the setLayer() function.
- Add the animation .anim file by using addAnimation() or setAnimation() functions.When you import your model with animations from an FBX container, the following path to your *.anim files should be used: <path_to_your_fbx_file>/<file.fbx>/<your_anim_file.anim>
For example: object->addAnimation("models/soldier/soldier.fbx/run.anim");
- Play the added animation by calling the setFrame() function for each animation layer.
Blending is performed between all layers. The contribution of each layer depends on its weight. Also, you can optionally define single bone transformations by hand, if needed, using either setBoneTransform() or setBoneChildrenTransform().
Usage Example
The following example shows how to blend 2 different animations assigned to a mesh. In this example we use the mesh and animations from UNIGINE samples located in <UnigineSDK>/data/samples/animation/meshes and <UnigineSDK>/data/samples/animation/animations folders, respectively. Animations are added by using the addAnimation() function.
// define the new ObjectMeshSkinned class instance
ObjectMeshSkinned skinned_mesh;
int init() {
/* ... */
// create the new ObjectMeshSkinned mesh based on an existing mesh
skinned_mesh = new ObjectMeshSkinned("samples/animation/meshes/agent.mesh");
// add the material and the property to the mesh
skinned_mesh.setMaterial("mesh_base","*");
skinned_mesh.setProperty("surface_base","*");
// add the mesh to the editor
engine.editor.addNode(node_remove(skinned_mesh));
// set the number of animation layers
skinned_mesh.setNumLayers(2);
// load animations from the files
int animation_1 = skinned_mesh.addAnimation("samples/animation/animations/agent_run.anim");
int animation_2 = skinned_mesh.addAnimation("samples/animation/animations/agent_punch.anim");
// enable each layer and set an animation weight
skinned_mesh.setLayer(0,1,0.7);
skinned_mesh.setLayer(1,1,0.3);
// set animations to layers
skinned_mesh.setAnimation(0, animation_1);
skinned_mesh.setAnimation(1, animation_2);
/* ... */
}
int update() {
/* ... */
// get the current time spent in the game
float time = engine.game.getTime();
// start each animation playing
skinned_mesh.setFrame(0,time * 25.0f);
skinned_mesh.setFrame(1,time * 25.0f);
/* ... */
}
Updating Bone Transformations
Some of the methods require to update the animation data before the renderer makes its update and actually draws the skinned mesh. Such update allows to get the correct result of blending between the frames and layers.
The execution sequence of updating bone transformations is the following:
- Call the method, which sets the update flag. This flag shows that the instance should be updated.
- Update the bone transformations by calling proper functions. These functions check the flag and if the flag is set, they calculate the transformations and set the flag to the default value.
- During the rendering, the engine performs animations and transformations which were calculated on the previous step or recalculates them, if the update flag has been set. If calculations have been performed, the flag is set to the default value.
When you change the transformation of the bone, you should notify all skinned meshes which use these bone about these transformations to update the mesh. When you change transformations of a bone, skinned mesh instances get the flag to update. When you use the setFrame() function, you set necessary transformations for the specified skinned mesh.
Instancing
Surfaces of identical skinned meshes which have the same materials assigned to them and the same number of bones attached to their vertices are automatically instanced and drawn in one draw call. The instancing flag is enabled by default (see corresponding console commands).
The data buffers for instanced objects that store bones transformations are limited in size; therefore, if skinned meshes have many bones, only a few meshes can populate the instance data buffer to be drawn in one draw call.
See Also
- Mesh class
- Article on Mesh File Formats
- Samples located in the data/samples/animation folder
- The following samples that demonstrate the ObjectMeshSkinned class usage:
- objects/skinned_00
- objects/skinned_01
- objects/skinned_02
- objects/skinned_03
- objects/skinned_04
- objects/skinned_05
- objects/skinned_06
- objects/skinned_07
ObjectMeshSkinned Class
Members
static ObjectMeshSkinnedPtr create(const Ptr<Mesh> & mesh)
ObjectMeshSkinned constructor.Arguments
- const Ptr<Mesh> & mesh - Pointer to Mesh.
static ObjectMeshSkinnedPtr create(const char * name, int unique = 0)
ObjectMeshSkinned constructor.Arguments
- const char * name - Path to the skinned mesh file.
- int unique - When you create several objects out of a single .mesh file, the instance of the mesh geometry is created. If you then change the source geometry, its instances will be changed as well. To avoid this, set the unique flag to 1, so a copy of the mesh geometry will be created and changes won't be applied.
Ptr<ObjectMeshSkinned> cast(const Ptr<Node> & node)
Casts an ObjectMeshSkinned out of the Node instance.Arguments
- const Ptr<Node> & node - Pointer to Node.
Return value
Pointer to ObjectMeshSkinned.Ptr<ObjectMeshSkinned> cast(const Ptr<Object> & base)
Casts an ObjectMeshSkinned out of the Object instance.Arguments
- const Ptr<Object> & base - Pointer to Object.
Return value
Pointer to ObjectMeshSkinned.int setAnimation(int layer, int animation)
Sets the animation identifier for the given animation layer.Arguments
- int layer - Layer number.
- int animation - Animation identifier.
int setAnimation(int layer, const char * name)
Sets the animation name for the given animation layer.Arguments
- int layer - Layer number.
- const char * name - Animation name.
int getAnimation(int layer)
Returns the animation identifier from the given animation layer.Arguments
- int layer - Layer number.
Return value
Animation identifier.int getAnimationID(int num)
Returns the identifier of the animation at the specified position.Arguments
- int num - Animation number.
Return value
Animation identifier.const char * getAnimationName(int animation)
Returns the name of the animation by an identifier.Arguments
- int animation - Animation identifier.
Return value
Animation name.void setAnimName(const char * name, int force_load = 0)
Sets the animation name and forces setting this animation name for the first animation layer.Arguments
- const char * name - Animation name.
- int force_load - Force flag. If 1 is specified, the new animation name will be set for the first animation layer immediately.
const char * getAnimName()
Returns the name of the current animation.Return value
Animation name.Math::mat4 getBoneBindTransform(int bone)
Returns the bind pose bone transformation matrix. Bone transformations are relative.Arguments
- int bone - Bone number.
Return value
Bind pose bone transformation matrix.int getBoneChild(int bone, int child)
Returns the number of a child of a given bone.Arguments
- int bone - Bone number.
- int child - Child number.
Return value
Number of the child in the collection of all bones.void setBoneChildrenTransform(int bone, const Math::mat4 & transform)
Sets transformation for the bone and all of its children (without considering node transformations).Arguments
- int bone - Bone number.
- const Math::mat4 & transform - Transformation matrix.
const char * getBoneName(int bone)
Returns the name of the given bone.Arguments
- int bone - Bone number.
Return value
Bone name.int getBoneParent(int bone)
Returns the number of the parent bone for a given one.Arguments
- int bone - Number of the bone, for which the parent will be returned.
Return value
Parent bone number.void setBoneTransform(int bone, const Math::mat4 & transform)
Sets a transformation matrix for a given bone (without considering node transformations).Arguments
- int bone - Bone number.
- const Math::mat4 & transform - Transformation matrix.
Math::mat4 getBoneTransform(int bone)
Returns a transformation matrix of a given bone relatively to the parent object (not considering transformations of the node itself).Arguments
- int bone - Bone number.
Return value
Transformation matrix.void setBoneTransforms(const int * bones, const Math::mat4 * transforms, int num_bones)
Sets a transformation matrix for given bones.Arguments
- const int * bones - Bone numbers.
- const Math::mat4 * transforms - Transformation matrices.
- int num_bones - Number of bones.
void setCIndex(int num, int index, int surface)
Sets the new coordinate index for the given vertex of the given surface.Arguments
- int num - Vertex number in the range from 0 to the total number of coordinate indices for the given surface.
To get the total number of coordinate indices for the given surface, use the getNumCIndices() method.
- int index - Coordinate index to be set in the range from 0 to the total number of coordinate vertices for the given surface. To get the total number of coordinate vertices for the given surface, use the getNumCVertex() method.
- int surface - Mesh surface number.
int getCIndex(int num, int surface)
Returns the coordinate index for the given vertex of the given surface.Arguments
- int num - Vertex number in the range from 0 to the total number of coordinate indices for the given surface.
To get the total number of coordinate indices for the given surface, use the getNumCIndices() method.
- int surface - Mesh surface number.
Return value
Coordinate index.void setColor(int num, const Math::vec4 & color, int surface)
Sets the color for the given triangle vertex of the given surface.Arguments
- int num - Triangle vertex number in the range from 0 to the total number of vertex color entries of the given surface.
To get the total number of vertex color entries for the surface, call the getNumColors() method.
- const Math::vec4 & color - Vertex color to be set.
- int surface - Mesh surface number.
Math::vec4 getColor(int num, int surface)
Returns the color of the given triangle vertex of the given surface.Arguments
- int num - Triangle vertex number in the range from 0 to the total number of vertex color entries of the given surface.
To get the total number of vertex color entries for the surface, call the getNumColors() method.
- int surface - Mesh surface number.
Return value
Vertex color.void setControlled(int controlled)
Sets a value indicating if the animation should be controlled by a parent ObjectMeshSkinned (useful for attaching clothes to a character body).Arguments
- int controlled - Controlled flag: 1 if the animation is controlled by a parent ObjectMeshSkinned; otherwise - 0.
int isControlled()
Returns a value indicating if the animation is controlled by a parent ObjectMeshSkinned.Return value
1 if the animation is controlled by a parent ObjectMeshSkinned; otherwise, 0.float setFrame(int layer, float frame, int from = -1, int to = -1)
Sets a frame for the given animation layer.Arguments
- int layer - Animation layer number.
- float frame - Frame number in the "from-to" interval. If the float argument is passed, animation is interpolated between nearby frames. 0 means the from frame. For larger values, a residue of a modulo (from-to) is calculated. If a negative value is provided, interpolation will be done from the current frame to the from frame.
- int from - Start frame. -1 means the first frame of the animation.
- int to - End frame. -1 means the last frame of the animation.
Return value
The number of the frame.float getFrame(int layer)
Returns the frame number passed as the time argument on the last setFrame() call.Arguments
- int layer - Animation layer number.
Return value
Frame number.int getFrameFrom(int layer)
Returns the start frame passed as the from argument on the last setFrame() call.Arguments
- int layer - Animation layer number.
Return value
Start frame.int getFrameTo(int layer)
Returns the end frame passed as the to argument on the last setFrame() call.Arguments
- int layer - Animation layer number.
Return value
End frame.Math::mat4 getIBoneBindTransform(int bone)
Returns the inverse bind pose bone transformation matrix.Arguments
- int bone - Bone number.
Return value
Inverse bind pose transformation matrix.Math::mat4 getIBoneTransform(int bone)
Returns an inverse transformation matrix for a given bone relatively to the parent object.Arguments
- int bone - Bone number.
Return value
Inverse transformation matrix.void setLayer(int layer, int enabled, float weight)
Enables or disables the given animation layer and sets the value of the weight parameter.Arguments
- int layer - Animation layer number.
- int enabled - Enable flag. 1 to enable the layer, 0 to disable it.
- float weight - Animation layer weight.
void setLayerBoneTransform(int layer, int bone, const Math::mat4 & transform)
Sets a transformation matrix for a given bone. The difference from the setBoneTransform() function is that this method takes into account only the transformation in the animation layer (no blending is done). Take notice that a bone can be scaled only uniformly.Arguments
- int layer - Animation layer number.
- int bone - Bone number.
- const Math::mat4 & transform - Bone transformation matrix.
Math::mat4 getLayerBoneTransform(int layer, int bone)
Returns a transformation matrix of a given bone relatively to the parent object.Arguments
- int layer - Animation layer number.
- int bone - Bone number.
Return value
Bone transformation matrix.int isLayerBoneTransform(int layer, int bone)
Returns a value indicating if the bone transformation is applied only to the animation layer (no blending is performed).Arguments
- int layer - Animation layer number.
- int bone - Bone number.
Return value
1 if the bone transformation is applied only to the animation layer; otherwise, 0.void setLayerBoneTransformEnabled(int layer, int bone, int enabled)
Enables or disables a layer transformation for a given bone.Arguments
- int layer - Animation layer number.
- int bone - Bone number.
- int enabled - Enabled flag: 1 to enable layer transformation, 0 to disable it.
void setLayerEnabled(int layer, int enabled)
Enables or disables a given animation layer.Arguments
- int layer - Animation layer number.
- int enabled - 1 to enable the animation layer, 0 to disable it.
int isLayerEnabled(int layer)
Returns a value indicating if a given animation layer is enabled.Arguments
- int layer - Animation layer number.
Return value
1 if the layer is disabled; otherwise, 0.void setLayerWeight(int layer, float weight)
Sets a weight for the animation layer.Arguments
- int layer - Animation layer number.
- float weight - Animation layer weight.
float getLayerWeight(int layer)
Returns the weight of the animation layer.Arguments
- int layer - Animation layer number.
Return value
Weight of the animation layer.void setLoop(int loop)
Sets a value indicating if the animation should be looped.Arguments
- int loop - 1 is to play the animation in a loop, 0 is to play it only once.
int getLoop()
Returns a value indicating if the animation is looped. 1 if the animation is looped; otherwise - 0.Return value
The loop flag.int setMesh(const Ptr<Mesh> & mesh)
Copies the source mesh into the current mesh.// create ObjectMeshSkinned instances
ObjectMeshSkinnedPtr skinnedMesh = ObjectMeshSkinned::create("soldier.mesh");
ObjectMeshSkinnedPtr skinnedMesh_2 = ObjectMeshSkinned::create("doll.mesh");
// create a Mesh instance
MeshPtr firstMesh = Mesh::create();
// get the mesh of the ObjectMeshSkinned and copy it to the Mesh class instance
skinnedMesh->getMesh(firstMesh);
// put the firstMesh mesh to the skinnedMesh_2 instance
skinnedMesh_2->setMesh(firstMesh);
Arguments
- const Ptr<Mesh> & mesh - The source mesh to be copied.
Return value
1 if the mesh is copied successfully; otherwise, 0.int getMesh(const Ptr<Mesh> & mesh)
Copies the current mesh into the source mesh.// a skinned mesh from which geometry will be obtained
ObjectMeshSkinnedPtr skinnedMesh = ObjectMeshSkinned::create("skinned.mesh");
// create a new mesh
MeshPtr mesh = Mesh::create();
// copy geometry to the created mesh
if (skinnedMesh->getMesh(mesh)) {
// do something with the obtained mesh
}
else {
Log::error("Failed to copy a mesh\n");
}
Arguments
- const Ptr<Mesh> & mesh - Source mesh.
Return value
1 if the mesh is copied successfully; otherwise, 0.void setMeshName(const char * name, int force_load = 0)
Sets the mesh name and forces creating of the mesh with the new name.Arguments
- const char * name - Mesh name.
- int force_load - Force flag.
- If 1 is specified, the mesh with the new name will be created immediately with the unique flag set to 0.
- If 0 is specified, only the mesh name will be updated.
const char * getMeshName()
Returns the name of the mesh.Return value
Mesh name.int getMeshSurface(const Ptr<Mesh> & mesh, int surface, int target = -1)
Gets the mesh surface from the current meshArguments
- const Ptr<Mesh> & mesh - Mesh pointer to copy a surface to.
- int surface - Number of the mesh surface to be copied.
- int target - Number of the surface morph target to be copied. The default value is -1 (all morph targets).
Return value
Number of the new added mesh surface.Math::vec3 getNormal(int num, int surface, int target = 0)
Returns the normal for the given triangle vertex of the given surface target.Arguments
- int num - Triangle vertex number in the range from 0 to the total number of vertex tangent entries of the given surface target.
Vertex normals are calculated using vertex tangents. To get the total number of vertex tangent entries for the surface target, call the getNumTangents() method.
- int surface - Mesh surface number.
- int target - Surface target number. The default value is 0.
Return value
Vertex normal.int getNumAnimationBones(int animation)
Returns the number of animation bones.Arguments
- int animation - Animation number.
Return value
Number of animation bones.int getNumAnimationFrames(int animation)
Returns the number of animation frames.Arguments
- int animation - Animation number.
Return value
Number of animation frames.int getNumAnimations()
Returns the total number of all loaded animations.Return value
Number of loaded animations.int getNumBoneChildren(int bone)
Returns the number of children for the specified bone.Arguments
- int bone - Bone number.
Return value
Number of child bones.int getNumBones()
Returns the number of all bones taking part in animation.Return value
Number of bones.int getNumCIndices(int surface)
Returns the number of coordinate indices for the given mesh surface.Arguments
- int surface - Mesh surface number.
Return value
Number of coordinate indices.int getNumColors(int surface)
Returns the total number of vertex color entries for the given surface.Arguments
- int surface - Surface number.
Return value
Number of vertex color entries.int getNumFrames(int layer)
Returns the number of animation frames for a given layer.Arguments
- int layer - Animation layer number.
Return value
Number of animation frames.void setNumLayers(int layers)
Sets the number of animation layers for blending. For example, when two layers are blended, bone transformations in between the layers are interpolated, and vertex positions can be calculated using the interpolated results. For more details, see the article on Skinned Mesh.Arguments
- int layers - Number of animation layers (must be greater than 0).
int getNumLayers()
Returns the number of animation layers set for blending. For more details, see the article on Skinned Mesh.Return value
Number of animation layers.int getNumSurfaceTargets(int surface)
Returns the number of surface morph targets for the given mesh surface.Arguments
- int surface - Mesh surface number.
Return value
Number of surface morph targets.int getNumTangents(int surface)
Returns the number of vertex tangent entries of the given mesh surface.Arguments
- int surface - Mesh surface number.
Return value
Number of surface tangent vectors.void setNumTargets(int num, int surface)
Sets the number of animation morph targets for the given mesh surface.Arguments
- int num - Number of animation morph targets.
- int surface - Mesh surface number.
int getNumTargets(int surface)
Returns the total number of morph targets of the given mesh surface.Arguments
- int surface - Mesh surface number.
Return value
Number of animation morph targets.void setNumTexCoords0(int num, int surface)
Sets the number of the first UV map texture coordinates for the given mesh surface.Arguments
- int num - Number of the first UV map texture coordinates to be set.
- int surface - Mesh surface number.
int getNumTexCoords0(int surface)
Returns the number of the first UV map texture coordinates for the given mesh surface.Arguments
- int surface - Mesh surface number.
Return value
Number of the first UV map texture coordinates.void setNumTexCoords1(int num, int surface)
Sets the number of the second UV map texture coordinates for the given mesh surface.Arguments
- int num - Number of the second UV map texture coordinates to be set.
- int surface - Mesh surface number.
int getNumTexCoords1(int surface)
Returns the number of the second UV map texture coordinates for the given mesh surface.Arguments
- int surface - Mesh surface number.
Return value
Number of the second UV map texture coordinates.int getNumTIndices(int surface)
Returns the number of triangle indices for the given mesh surface.Arguments
- int surface - Mesh surface number.
Return value
Number of triangle indices.int getNumVertex(int surface)
Returns the number of coordinate vertices for the given mesh surface.Arguments
- int surface - Mesh surface number.
Return value
Number of the surface vertices.int isPlaying()
Returns playback status.Return value
1 if animation is playing; otherwise, 0.void setQuaternion(int quaternion)
Enables or disables the dual-quaternion skinning mode. The dual-quaternion model is an accurate, computationally efficient, robust, and flexible method of representing rigid transforms and it is used in skeletal animation. See a Wikipedia article on dual quaternions and a beginners guide to dual-quaternions for more information.Arguments
- int quaternion - 1 to enable dual-quaternion skinning mode, 0 to disable it.
int isQuaternion()
Returns the value indicating if the dual-quaternion skinning mode is used. The dual-quaternion model is an accurate, computationally efficient, robust, and flexible method of representing rigid transforms and it is used in skeletal animation. See a Wikipedia article on dual quaternions and a beginners guide to dual-quaternions for more information.Return value
1 if dual-quaternion skinning mode is used; otherwise, 0.Math::vec3 getSkinnedNormal(int num, int index, int surface)
Returns the skinned normal for the given triangle vertex.Arguments
- int num - Triangle vertex number in the range from 0 to the total number of vertex tangent entries of the given surface target.
Vertex normals are calculated using vertex tangents. To get the total number of vertex tangent entries for the surface target, call the getNumTangents() method.
- int index - Coordinate index of the vertex.if -1 is passed, the coordinate index will be obtained for the first vertex having its triangle index equal to the specified triangle vertex number.
- int surface - Mesh surface number.
Return value
Skinned normal.Math::quat getSkinnedTangent(int num, int index, int surface)
Returns the skinned tangent vector for the given triangle vertex.Arguments
- int num - Triangle vertex number in the range from 0 to the total number of vertex tangent entries of the given surface target.
To get the total number of vertex tangent entries for the surface target, call the getNumTangents() method.
- int index - Coordinate index of the vertex.if -1 is passed, the coordinate index will be obtained for the first vertex having its triangle index equal to the specified triangle vertex number.
- int surface - Mesh surface number.
Return value
Skinned tangent.Math::vec3 getSkinnedVertex(int num, int surface)
Returns skinned coordinates of the given coordinate vertex.Arguments
- int num - Coordinate vertex number in the range from 0 to the total number of coordinate vertices for the given surface.
To get the total number of coordinate vertices for the given surface, use the getNumVertex() method.
- int surface - Mesh surface number.
Return value
Vertex coordinates.void setSpeed(float speed)
Updates a multiplier value for the animation playback time.Arguments
- float speed - Playback speed multiplier value.
float getSpeed()
Returns a multiplier for animation playback time.Return value
Playback speed multiplier value.int isStopped()
Returns stop status.Return value
1 if animation is stopped; otherwise, 0.const char * getSurfaceTargetName(int surface, int target)
Returns the name of the morph target for the given mesh surface.Arguments
- int surface - Mesh surface number.
- int target - Morph target number.
Return value
Morph target name.void setSurfaceTransform(const Math::mat4 & transform, int surface, int target = -1)
Transforms the given mesh surface target.Arguments
- const Math::mat4 & transform - Transformation matrix.
- int surface - Mesh surface number.
- int target - Morph target number. The default value is -1 (the transformation will be applied to all morph targets).
void setTangent(int num, const Math::quat & tangent, int surface, int target = 0)
Sets the new tangent for the given triangle vertex of the given surface target.Arguments
- int num - Triangle vertex number in the range from 0 to the total number of vertex tangent entries of the given surface.
To get the total number of vertex tangent entries for the surface, call the getNumTangents() method.
- const Math::quat & tangent - Tangent to be set.
- int surface - Mesh surface number.
- int target - Surface target number. The default value is 0.
Math::quat getTangent(int num, int surface, int target = 0)
Returns the tangent for the given triangle vertex of the given surface target.Arguments
- int num - Triangle vertex number in the range from 0 to the total number of vertex tangent entries of the given surface.
To get the total number of vertex tangent entries for the surface, call the getNumTangents() method.
- int surface - Mesh surface number.
- int target - Surface target number. The default value is 0.
Return value
Vertex tangent.void setTarget(int target, int enabled, int index, float weight, int surface)
Enables or disables a given morph target and sets all its parameters.Arguments
- int target - Morph target number.
- int enabled - Enable flag: 1 to enable the morph target; 0 to disable it.
- int index - Target index.
- float weight - Target weight.
- int surface - Surface number.
void setTargetEnabled(int target, int enabled, int surface)
Enables or disables a given morph target.Arguments
- int target - Morph target number.
- int enabled - 1 to enable the morph target, 0 to disable it.
- int surface - Surface number.
int isTargetEnabled(int target, int surface)
Returns a value indicating if the given morph target of the given surface is enabled.Arguments
- int target - Morph target number.
- int surface - Mesh surface number.
Return value
1 if the given morph target of the given surface is enabled; otherwise, 0.void setTargetIndex(int target, int index, int surface)
Sets an index for the given morph target.Arguments
- int target - Morph target number.
- int index - Morph target index.
- int surface - Mesh surface number.
int getTargetIndex(int target, int surface)
Returns the index of the morph target. Returns the index of the given morph target.Arguments
- int target - Morph target number.
- int surface - Mesh surface number.
Return value
Index of the given morph target.void setTargetWeight(int target, float weight, int surface)
Sets a weight for the given animation target.Arguments
- int target - Morph target number.
- float weight - Morph target weight.
- int surface - Mesh surface number.
float getTargetWeight(int target, int surface)
Returns the weight of the given morph target.Arguments
- int target - Morph target number.
- int surface - Mesh surface number.
Return value
Morph target weight.void setTexCoord0(int num, const Math::vec2 & texcoord, int surface)
Sets first UV map texture coordinates for the given triangle vertex of the given surface.Arguments
- int num - Triangle vertex number in the range from 0 to the total number of first UV map texture coordinate entries of the given surface.
To get the total number of first UV map texture coordinate entries for the surface, call the getNumTexCoords0() method.
- const Math::vec2 & texcoord - First UV map texture coordinates to be set.
- int surface - Mesh surface number.
Math::vec2 getTexCoord0(int num, int surface)
Returns first UV map texture coordinates for the given triangle vertex of the given surface.Arguments
- int num - Triangle vertex number in the range from 0 to the total number of first UV map texture coordinate entries of the given surface.
To get the total number of first UV map texture coordinate entries for the surface, call the getNumTexCoords0() method.
- int surface - Mesh surface number.
Return value
First UV map texture coordinates.void setTexCoord1(int num, const Math::vec2 & texcoord, int surface)
Sets second UV map texture coordinates for the given triangle vertex of the given surface.Arguments
- int num - Triangle vertex number in the range from 0 to the total number of second UV map texture coordinate entries of the given surface.
To get the total number of second UV map texture coordinate entries for the surface, call the getNumTexCoords1() method.
- const Math::vec2 & texcoord - Second UV map texture coordinates to be set.
- int surface - Mesh surface number.
Math::vec2 getTexCoord1(int num, int surface)
Returns second UV map texture coordinates for the given triangle vertex of the given surface.Arguments
- int num - Triangle vertex number in the range from 0 to the total number of second UV map texture coordinate entries of the given surface.
To get the total number of second UV map texture coordinate entries for the surface, call the getNumTexCoords1() method.
- int surface - Mesh surface number.
Return value
Second UV map texture coordinates.void setTime(float time)
Sets the animation time, in animation frames. The time count starts from the zero frame. If the time is set to be between frames, animation is blended. If the time is set outside the animation frame range, the animation is looped.Arguments
- float time - Animation time.
float getTime()
Returns the current animation time, in animation frames. The time count starts from the zero frame.Return value
Animation time.void setTIndex(int num, int index, int surface)
Sets the new triangle index for the given vertex of the given surfaceArguments
- int num - Vertex number in the range from 0 to the total number of triangle indices for the given surface.
To get the total number of triangle indices, use the getNumTIndices() method.
- int index - Triangle index to be set in the range from 0 to the total number of triangle vertices for the given surface.
To get the total number of triangle vertices for the given surface, use the getNumTVertex() method.
- int surface - Mesh surface number.
int getTIndex(int num, int surface)
Returns the triangle index for the given surface by using the index number.Arguments
- int num - Vertex number in the range from 0 to the total number of triangle indices for the given surface.
To get the total number of triangle indices for the given surface, use the getNumTIndices() method.
- int surface - Mesh surface number.
Return value
Triangle index.void setVertex(int num, const Math::vec3 & vertex, int surface, int target = 0)
Sets the coordinates of the given coordinate vertex of the given surface target.Arguments
- int num - Coordinate vertex number in the range from 0 to the total number of coordinate vertices for the given surface.
To get the total number of coordinate vertices for the given surface, use the getNumCVertex() method.
- const Math::vec3 & vertex - Vertex coordinates to be set.
- int surface - Mesh surface number.
- int target - Surface target number. The default value is 0.
Math::vec3 getVertex(int num, int surface, int target = 0)
Returns coordinates of the given coordinate vertex of the given surface target.Arguments
- int num - Coordinate vertex number in the range from 0 to the total number of coordinate vertices for the given surface.
To get the total number of coordinate vertices for the given surface, use the getNumCVertex() method.
- int surface - Mesh surface number.
- int target - Surface target number. The default value is 0.
Return value
Vertex coordinates.void setWorldBoneChildrenTransform(int bone, const Math::Mat4 & transform)
Sets the transformation for the given bone and all of its children in the world coordinate space (considering node transformations).Arguments
- int bone - Bone number.
- const Math::Mat4 & transform - Transformation matrix in the world space.
void setWorldBoneTransform(int bone, const Math::Mat4 & transform)
Arguments
- int bone - Bone number.
- const Math::Mat4 & transform - Transformation matrix in the world space.
Math::Mat4 getWorldBoneTransform(int bone)
Returns the current transformation matrix applied to the bone in the world coordinate space (considering node transformations).Arguments
- int bone - Bone number.
Return value
Transformation matrix in the world space.int addAnimation(const Ptr<Mesh> & mesh, const char * animation = 0)
Loads the additional animation from an external file.Arguments
- const Ptr<Mesh> & mesh - Path to the animation file.When you import your model with animations from an FBX container, the following path to your *.anim files should be used: <path_to_your_fbx_file>/<file.fbx>/<your_anim_file.anim>
For example: object->addAnimation("models/soldier/soldier.fbx/run.anim");
- const char * animation - Animation name.
Return value
Animation identifier.int addAnimation(const char * name, const char * animation = 0)
Loads the additional animation from an external file.Arguments
- const char * name - Path to the animation file.When you import your model with animations from an FBX container, the following path to your *.anim files should be used: <path_to_your_fbx_file>/<file.fbx>/<your_anim_file.anim>
For example: object->addAnimation("models/soldier/soldier.fbx/run.anim");
- const char * animation - Animation name.
Return value
Animation identifier.int addEmptySurface(const char * name, int num_vertex, int num_indices)
Appends a new empty surface to the current mesh.Arguments
- const char * name - Name of the new surface.
- int num_vertex - Number of vertices of the new surface.
- int num_indices - Number of indices of the new surface.
Return value
Number of the new added surface.int addLayer()
Appends a new animation layer to the current mesh.Return value
Number of the new added animation layer.int addMeshSurface(const char * name, const Ptr<ObjectMeshSkinned> & mesh, int surface, int target = -1)
Appends a new mesh surface to the current mesh.Arguments
- const char * name - Name of the new surface of the current mesh.
- const Ptr<ObjectMeshSkinned> & mesh - Mesh pointer to copy a surface from.
- int surface - Number of mesh surface to copy.
- int target - Number of mesh target to copy. The default value is -1 (all morph targets will be copied).
Return value
Number of the added mesh surface.int addMeshSurface(int dest_surface, const Ptr<ObjectMeshSkinned> & mesh, int surface, int target = -1)
Merges the specified surface from the source ObjectMeshSkinned with the specified destination surface of the mesh.Arguments
- int dest_surface - Number of the destination surface, with which a surface from the source ObjectMeshSkinned is to be merged.
- const Ptr<ObjectMeshSkinned> & mesh - Source ObjectMeshSkinned to copy a surface from.
- int surface - Number of the source mesh surface to copy.
- int target - Number of mesh target to merge. The default value is -1 (all morph targets will be merged).
Return value
Number of the destination mesh surface.int addMeshSurface(const char * name, const Ptr<Mesh> & mesh, int surface, int target = -1)
Appends a new mesh surface to the current mesh by copying the specified surface from the source mesh.Arguments
- const char * name - Name of the new surface of the current mesh.
- const Ptr<Mesh> & mesh - Source mesh to copy a surface from.
- int surface - Number of the source mesh surface to copy.
- int target - Number of mesh target to copy. The default value is -1 (all morph targets will be copied).
Return value
Number of the added mesh surface.int addSurfaceTarget(int surface, const char * name = 0)
Appends a new morph target to the given mesh surface.Arguments
- int surface - Number of the surface, to which the morph target will be appended.
- const char * name - Name of the new morph target.
Return value
Number of the new added morph target.int addSurfaceTarget(int dest_surface, const Ptr<ObjectMeshSkinned> & src_mesh, int src_surface, int src_target = -1)
Appends a new morph target to the given mesh surface by copying it from the specified surface of the source ObjectMeshSkinned.Arguments
- int dest_surface - Number of the surface, to which the morph target will be appended.
- const Ptr<ObjectMeshSkinned> & src_mesh - Source ObjectMeshSkinned to copy the morph target from.
- int src_surface - Number of the surface of the source ObjectMeshSkinned to copy the morph target from.
- int src_target - Number of the morph target to copy. The default value is -1 (all morph targets will be copied).
Return value
Number of the new added morph target.int addTarget(int surface)
Appends a new empty morph target to the given mesh surface.Arguments
- int surface - Number of the surface, to which the morph target will be appended.
Return value
number of the new added morph target.void clearLayer(int layer)
Clears the given animation layer.Arguments
- int layer - Animation layer number.
void copyLayer(int dest, int src)
Copies source layer bones transformations to the destination layer. The copying conditions are the following:
- If the destination layer has more bones than the source one, it will keep its former transformations.
- If the source layer has more bones than destination one, those bones will be added to the destination layer.
Arguments
- int dest - Number of the destination layer in the range from 0 to the total number of animation layers.
To get the total number of animation layers, use the getNumLayers() method.
- int src - Number of the source layer in range from 0 to the total number of animation layers.
To get the total number of animation layers, use the getNumLayers() method.
int createMesh(const char * name, int unique = 0)
Creates a skinned mesh.Arguments
- const char * name - Path to the mesh file.
- int unique - Dynamic flag:
- 0 - If the mesh vertices are changed in run-time, meshes loaded from the same file will be also changed.
- 1 - If the mesh vertices are changed in run-time, meshes loaded from the same file won't be changed
Return value
1 if the mesh is created successfully; otherwise - 0.int findAnimation(const char * name)
Searches for an animation with a given name.Arguments
- const char * name - Animation name.
Return value
Animation number, if found; otherwise, -1.int findBone(const char * name)
Searches for a bone with a given name.Arguments
- const char * name - Bone name.
Return value
bone number if found; otherwise, -1.int findSurfaceTarget(const char * name, int surface)
Searches for a surface morph target with a given name.Arguments
- const char * name - Name of the morph target.
- int surface - Mesh surface number.
Return value
Number of the morph target, if exists; otherwise, -1.void flushMesh()
Flushes mesh geometry to the video memory.void importLayer(int layer)
Copies the current bone state to the given animation layer.Arguments
- int layer - Animation layer number.
void inverseLayer(int dest, int src)
Copies inverse transformations of bones from the source layer to the destination layer.Arguments
- int dest - Number of the destination layer in the range from 0 to the total number of animation layers.
To get the total number of animation layers, use the getNumLayers() method.
- int src - Number of the source layer in the range from 0 to the total number of animation layers.
To get the total number of animation layers, use the getNumLayers() method.
void lerpLayer(int dest, int layer0, int layer1, float weight)
Copies interpolated bone transformations from two source layers to a destination layer.Arguments
- int dest - Number of the destination layer in the range from 0 to the total number of animation layers.
To get the total number of animation layers, use the getNumLayers() method.
- int layer0 - Number of the first source layer in the range from 0 to the total number of animation layers.
To get the total number of animation layers, use the getNumLayers() method.
- int layer1 - Number of the second source layer in range from 0 to the total number of animation layers.
To get the total number of animation layers, use the getNumLayers() method.
- float weight - Interpolation weight.
int loadMesh(const char * name)
Loads a new mesh instead of the current mesh from the .mesh file. This function doesn't change the mesh name.Arguments
- const char * name - The path to the .mesh file.
Return value
1 if the mesh is loaded successfully; otherwise, 0.void mergeMeshSurface(int dest_surface, const Ptr<ObjectMeshSkinned> & src_mesh, int src_surface)
Merges the specified surface from the source ObjectMeshSkinned with the specified destination surface of the mesh.Arguments
- int dest_surface - Number of the destination surface, with which a surface from the source ObjectMeshSkinned is to be merged.
- const Ptr<ObjectMeshSkinned> & src_mesh - Source ObjectMeshSkinned to copy a surface from.
- int src_surface - Number of source mesh surface to merge.
void mulLayer(int dest, int layer0, int layer1, float weight = 1.0f)
Copies multiplied bone transformations from two source layers to the destination layer.Arguments
- int dest - Number of the destination layer in the range from 0 to the total number of animation layers.
To get the total number of animation layers, use the getNumLayers() method.
- int layer0 - Number of the first source layer in the range from 0 to the total number of animation layers.
To get the total number of animation layers, use the getNumLayers() method.
- int layer1 - Number of the second source layer in the range from 0 to the total number of animation layers.
To get the total number of animation layers, use the getNumLayers() method.
- float weight - Interpolation weight.
void play()
Continues playback of the animation, if it was paused, or starts playback if it was stopped.void removeAnimation(int animation)
Removes the given animation.Arguments
- int animation - Animation number.
void removeLayer(int layer)
Removes an animation layer.Arguments
- int layer - Layer number in the range from 0 to the total number of animation layers.
To get the total number of animation layers, use the getNumLayers() method.
void removeTarget(int target, int surface)
Removes the given morph target.Arguments
- int target - Target number in the range from 0 to the total number of morph targets.
To get the total number of morph targets for a given surface, use the getNumTargets() method.
- int surface - Mesh surface number.
int saveMesh(const char * name)
Saves the mesh to .mesh or .anim format.Arguments
- const char * name - Path to the .mesh file.
Return value
1 if the mesh is saved successfully; otherwise, 0.void stop()
Stops animation playback. This function saves the playback position so that playing of the animation can be resumed from the same point.int type()
Returns the type of the node.Return value
Object type identifier.void updateSurfaceBounds(int surface = -1)
Updates mesh surface bounds. This method is to be called to recalculate bounds after changing a mesh surface (e.g. modifying positions of coordinate vertices).Arguments
- int surface - Number of the surface to recalculate bound for. The default value is -1 (all surfaces).