Blender V4.5
collada_utils.cpp File Reference
#include "COLLADAFWMeshVertexData.h"
#include "COLLADAFWNode.h"
#include <set>
#include <string>
#include "DNA_armature_types.h"
#include "DNA_constraint_types.h"
#include "DNA_customdata_types.h"
#include "DNA_key_types.h"
#include "DNA_mesh_types.h"
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "BLI_linklist.h"
#include "BLI_listbase.h"
#include "BLI_math_matrix.h"
#include "BLI_string.h"
#include "BKE_action.hh"
#include "BKE_armature.hh"
#include "BKE_constraint.h"
#include "BKE_context.hh"
#include "BKE_customdata.hh"
#include "BKE_global.hh"
#include "BKE_idprop.hh"
#include "BKE_key.hh"
#include "BKE_layer.hh"
#include "BKE_lib_id.hh"
#include "BKE_material.hh"
#include "BKE_mesh.hh"
#include "BKE_mesh_legacy_convert.hh"
#include "BKE_mesh_runtime.hh"
#include "BKE_mesh_wrapper.hh"
#include "BKE_node.hh"
#include "BKE_node_legacy_types.hh"
#include "BKE_node_runtime.hh"
#include "BKE_object.hh"
#include "BKE_scene.hh"
#include "ANIM_action.hh"
#include "ANIM_action_legacy.hh"
#include "ANIM_bone_collections.hh"
#include "ED_node.hh"
#include "ED_object.hh"
#include "ED_screen.hh"
#include "WM_api.hh"
#include "WM_types.hh"
#include "bmesh.hh"
#include "bmesh_tools.hh"
#include "DEG_depsgraph.hh"
#include "DEG_depsgraph_query.hh"
#include "BlenderContext.h"
#include "ExportSettings.h"
#include "ExtraTags.h"
#include "collada_utils.h"

Go to the source code of this file.

Functions

float bc_get_float_value (const COLLADAFW::FloatOrDoubleArray &array, uint index)
int bc_test_parent_loop (Object *par, Object *ob)
bool bc_validateConstraints (bConstraint *con)
bool bc_set_parent (Object *ob, Object *par, bContext *C, bool is_parent_space)
std::vector< bAction * > bc_getSceneActions (const bContext *C, Object *ob, bool all_actions)
std::string bc_get_action_id (const std::string &action_name, const std::string &ob_name, const std::string &channel_type, const std::string &axis_name, const std::string &axis_separator)
void bc_update_scene (BlenderContext &blender_context, float ctime)
Objectbc_add_object (Main *bmain, Scene *scene, ViewLayer *view_layer, int type, const char *name)
static void bc_add_armature_collections (COLLADAFW::Node *node, ExtraTags *node_extra_tags, bArmature *arm)
Objectbc_add_armature (COLLADAFW::Node *node, ExtraTags *node_extra_tags, Main *bmain, Scene *scene, ViewLayer *view_layer, int type, const char *name)
Meshbc_get_mesh_copy (BlenderContext &blender_context, Object *ob, BC_export_mesh_type export_mesh_type, bool apply_modifiers, bool triangulate)
Objectbc_get_assigned_armature (Object *ob)
bool bc_has_object_type (LinkNode *export_set, short obtype)
void bc_bubble_sort_by_Object_name (LinkNode *export_set)
bool bc_is_root_bone (Bone *aBone, bool deform_bones_only)
int bc_get_active_UVLayer (Object *ob)
std::string bc_url_encode (const std::string &data)
std::string bc_replace_string (std::string data, const std::string &pattern, const std::string &replacement)
void bc_match_scale (Object *ob, UnitConverter &bc_unit, bool scale_to_scene)
void bc_match_scale (std::vector< Object * > *objects_done, UnitConverter &bc_unit, bool scale_to_scene)
void bc_decompose (float mat[4][4], float *loc, float eul[3], float quat[4], float *size)
void bc_rotate_from_reference_quat (float quat_to[4], float quat_from[4], float mat_to[4][4])
void bc_triangulate_mesh (Mesh *mesh)
bool bc_is_leaf_bone (Bone *bone)
EditBonebc_get_edit_bone (bArmature *armature, const char *name)
int bc_set_layer (int bitfield, int layer)
int bc_set_layer (int bitfield, int layer, bool enable)
bool isInteger (const std::string &s)
void bc_set_IDPropertyMatrix (EditBone *ebone, const char *key, float mat[4][4])
IDPropertybc_get_IDProperty (Bone *bone, const std::string &key)
float bc_get_property (Bone *bone, const std::string &key, float def)
bool bc_get_property_matrix (Bone *bone, const std::string &key, float mat[4][4])
void bc_get_property_vector (Bone *bone, const std::string &key, float val[3], const float def[3])
static bool has_custom_props (Bone *bone, bool enabled, const std::string &key)
void bc_enable_fcurves (AnimData *adt, const char *bone_name)
bool bc_bone_matrix_local_get (Object *ob, Bone *bone, Matrix &mat, bool for_opensim)
bool bc_is_animated (BCMatrixSampleMap &values)
bool bc_has_animations (Object *ob)
bool bc_has_animations (Scene *sce, LinkNode *export_set)
void bc_add_global_transform (Matrix &to_mat, const Matrix &from_mat, const BCMatrix &global_transform, const bool invert)
void bc_add_global_transform (VectorVector &to_vec, const VectorVector &from_vec, const BCMatrix &global_transform, const bool invert)
void bc_add_global_transform (Matrix &to_mat, const BCMatrix &global_transform, const bool invert)
void bc_add_global_transform (VectorVector &to_vec, const BCMatrix &global_transform, const bool invert)
void bc_apply_global_transform (Matrix &to_mat, const BCMatrix &global_transform, const bool invert)
void bc_apply_global_transform (VectorVector &to_vec, const BCMatrix &global_transform, const bool invert)
void bc_create_restpose_mat (BCExportSettings &export_settings, Bone *bone, float to_mat[4][4], float from_mat[4][4], bool use_local_space)
void bc_sanitize_v3 (float v[3], int precision)
void bc_sanitize_v3 (double v[3], int precision)
void bc_copy_m4_farray (float r[4][4], float *a)
void bc_copy_farray_m4 (float *r, float a[4][4])
void bc_copy_darray_m4d (double *r, double a[4][4])
void bc_copy_v44_m4d (std::vector< std::vector< double > > &r, double(&a)[4][4])
void bc_copy_m4d_v44 (double(&r)[4][4], std::vector< std::vector< double > > &a)
static std::string bc_get_active_uvlayer_name (Mesh *mesh)
static std::string bc_get_active_uvlayer_name (Object *ob)
static std::string bc_get_uvlayer_name (Mesh *mesh, int layer)
static bNodeTreeprepare_material_nodetree (Material *ma)
static bNodebc_add_node (bContext *C, bNodeTree *ntree, int node_type, int locx, int locy, const std::string &label)
static bNodebc_add_node (bContext *C, bNodeTree *ntree, int node_type, int locx, int locy)
static void bc_node_add_link (bNodeTree *ntree, bNode *from_node, int from_index, bNode *to_node, int to_index)
void bc_add_default_shader (bContext *C, Material *ma)
COLLADASW::ColorOrTexture bc_get_base_color (Material *ma)
COLLADASW::ColorOrTexture bc_get_emission (Material *ma)
COLLADASW::ColorOrTexture bc_get_ambient (Material *ma)
COLLADASW::ColorOrTexture bc_get_specular (Material *ma)
COLLADASW::ColorOrTexture bc_get_reflective (Material *ma)
double bc_get_alpha (Material *ma)
double bc_get_ior (Material *ma)
double bc_get_shininess (Material *ma)
double bc_get_reflectivity (Material *ma)
bool bc_get_float_from_shader (bNode *shader, double &val, std::string nodeid)
COLLADASW::ColorOrTexture bc_get_cot_from_shader (bNode *shader, std::string nodeid, const Color &default_color, bool with_alpha)
bNodebc_get_master_shader (Material *ma)
COLLADASW::ColorOrTexture bc_get_cot (float r, float g, float b, float a)
COLLADASW::ColorOrTexture bc_get_cot (const Color col, bool with_alpha)

Function Documentation

◆ bc_add_armature()

Object * bc_add_armature ( COLLADAFW::Node * node,
ExtraTags * node_extra_tags,
Main * bmain,
Scene * scene,
ViewLayer * view_layer,
int type,
const char * name )

◆ bc_add_armature_collections()

void bc_add_armature_collections ( COLLADAFW::Node * node,
ExtraTags * node_extra_tags,
bArmature * arm )
static

◆ bc_add_default_shader()

◆ bc_add_global_transform() [1/4]

void bc_add_global_transform ( Matrix & to_mat,
const BCMatrix & global_transform,
const bool invert )

Definition at line 906 of file collada_utils.cpp.

References BCMatrix::add_transform(), BCMatrix::get_matrix(), and invert().

◆ bc_add_global_transform() [2/4]

void bc_add_global_transform ( Matrix & to_mat,
const Matrix & from_mat,
const BCMatrix & global_transform,
const bool invert )

◆ bc_add_global_transform() [3/4]

void bc_add_global_transform ( VectorVector & to_vec,
const BCMatrix & global_transform,
const bool invert )

Definition at line 913 of file collada_utils.cpp.

References copy_v3_v3(), BCMatrix::get_matrix(), invert(), and mul_v3_m4v3().

◆ bc_add_global_transform() [4/4]

void bc_add_global_transform ( VectorVector & to_vec,
const VectorVector & from_vec,
const BCMatrix & global_transform,
const bool invert )

Definition at line 897 of file collada_utils.cpp.

References bc_add_global_transform(), copy_v3_v3(), and invert().

◆ bc_add_node() [1/2]

bNode * bc_add_node ( bContext * C,
bNodeTree * ntree,
int node_type,
int locx,
int locy )
static

Definition at line 1122 of file collada_utils.cpp.

References bc_add_node(), and C.

◆ bc_add_node() [2/2]

bNode * bc_add_node ( bContext * C,
bNodeTree * ntree,
int node_type,
int locx,
int locy,
const std::string & label )
static

◆ bc_add_object()

◆ bc_apply_global_transform() [1/2]

void bc_apply_global_transform ( Matrix & to_mat,
const BCMatrix & global_transform,
const bool invert )

◆ bc_apply_global_transform() [2/2]

void bc_apply_global_transform ( VectorVector & to_vec,
const BCMatrix & global_transform,
const bool invert )

Definition at line 929 of file collada_utils.cpp.

References BCMatrix::get_matrix(), invert(), mul_v3_m4v3(), and transform().

◆ bc_bone_matrix_local_get()

◆ bc_bubble_sort_by_Object_name()

void bc_bubble_sort_by_Object_name ( LinkNode * export_set)

Definition at line 327 of file collada_utils.cpp.

References b, Object::id, LinkNode::link, ID::name, and LinkNode::next.

Referenced by collada_export().

◆ bc_copy_darray_m4d()

void bc_copy_darray_m4d ( double * r,
double a[4][4] )

Definition at line 1028 of file collada_utils.cpp.

References i.

◆ bc_copy_farray_m4()

void bc_copy_farray_m4 ( float * r,
float a[4][4] )

Definition at line 1019 of file collada_utils.cpp.

References i.

◆ bc_copy_m4_farray()

void bc_copy_m4_farray ( float r[4][4],
float * a )

Definition at line 1010 of file collada_utils.cpp.

References i.

◆ bc_copy_m4d_v44()

void bc_copy_m4d_v44 ( double(&) r[4][4],
std::vector< std::vector< double > > & a )

Definition at line 1046 of file collada_utils.cpp.

References i.

◆ bc_copy_v44_m4d()

void bc_copy_v44_m4d ( std::vector< std::vector< double > > & r,
double(&) a[4][4] )

Definition at line 1037 of file collada_utils.cpp.

References i.

◆ bc_create_restpose_mat()

void bc_create_restpose_mat ( BCExportSettings & export_settings,
Bone * bone,
float to_mat[4][4],
float from_mat[4][4],
bool use_local_space )

Check if custom information about bind matrix exists and modify the from_mat accordingly.

Note
This is old style for Blender <= 2.78 only kept for compatibility.

Definition at line 936 of file collada_utils.cpp.

References b, bc_decompose(), bc_get_IDProperty(), bc_get_property(), bc_get_property_vector(), copy_m4_m4(), DEG2RADF, has_custom_props(), loc_eulO_size_to_mat4(), Bone::parent, and rot.

◆ bc_decompose()

void bc_decompose ( float mat[4][4],
float * loc,
float eul[3],
float quat[4],
float * size )

Convenience function to get only the needed components of a matrix.

Definition at line 416 of file collada_utils.cpp.

References copy_v3_v3(), mat4_to_eul(), mat4_to_quat(), mat4_to_size(), and size().

Referenced by TransformWriter::add_joint_transform(), TransformWriter::add_node_transform_ob(), and bc_create_restpose_mat().

◆ bc_enable_fcurves()

void bc_enable_fcurves ( AnimData * adt,
const char * bone_name )

◆ bc_get_action_id()

std::string bc_get_action_id ( const std::string & action_name,
const std::string & ob_name,
const std::string & channel_type,
const std::string & axis_name,
const std::string & axis_separator )

◆ bc_get_active_UVLayer()

int bc_get_active_UVLayer ( Object * ob)

◆ bc_get_active_uvlayer_name() [1/2]

std::string bc_get_active_uvlayer_name ( Mesh * mesh)
static

Returns name of Active UV Layer or empty String if no active UV Layer defined

Definition at line 1058 of file collada_utils.cpp.

References bc_CustomData_get_active_layer_name(), CD_PROP_FLOAT2, Mesh::corner_data, and CustomData_number_of_layers().

Referenced by bc_get_active_uvlayer_name().

◆ bc_get_active_uvlayer_name() [2/2]

std::string bc_get_active_uvlayer_name ( Object * ob)
static

Returns name of Active UV Layer or empty String if no active UV Layer defined. Assuming the Object is of type MESH

Definition at line 1075 of file collada_utils.cpp.

References bc_get_active_uvlayer_name(), and Object::data.

◆ bc_get_alpha()

double bc_get_alpha ( Material * ma)

◆ bc_get_ambient()

COLLADASW::ColorOrTexture bc_get_ambient ( Material * ma)

Definition at line 1208 of file collada_utils.cpp.

References bc_get_cot().

◆ bc_get_assigned_armature()

◆ bc_get_base_color()

COLLADASW::ColorOrTexture bc_get_base_color ( Material * ma)

◆ bc_get_cot() [1/2]

COLLADASW::ColorOrTexture bc_get_cot ( const Color col,
bool with_alpha )

Definition at line 1312 of file collada_utils.cpp.

References col.

◆ bc_get_cot() [2/2]

COLLADASW::ColorOrTexture bc_get_cot ( float r,
float g,
float b,
float a )

◆ bc_get_cot_from_shader()

COLLADASW::ColorOrTexture bc_get_cot_from_shader ( bNode * shader,
std::string nodeid,
const Color & default_color,
bool with_alpha )

◆ bc_get_edit_bone()

EditBone * bc_get_edit_bone ( bArmature * armature,
const char * name )

Definition at line 484 of file collada_utils.cpp.

References bArmature::edbo, LISTBASE_FOREACH, and STREQ.

◆ bc_get_emission()

COLLADASW::ColorOrTexture bc_get_emission ( Material * ma)

◆ bc_get_float_from_shader()

bool bc_get_float_from_shader ( bNode * shader,
double & val,
std::string nodeid )

◆ bc_get_float_value()

float bc_get_float_value ( const COLLADAFW::FloatOrDoubleArray & array,
uint index )

Definition at line 72 of file collada_utils.cpp.

Referenced by SkinInfo::borrow_skin_controller_data().

◆ bc_get_IDProperty()

IDProperty * bc_get_IDProperty ( Bone * bone,
const std::string & key )

Get a custom property when it exists. This function is also used to check if a property exists.

Definition at line 680 of file collada_utils.cpp.

References IDP_GetPropertyFromGroup(), nullptr, and Bone::prop.

Referenced by bc_create_restpose_mat(), bc_get_property(), bc_get_property_matrix(), and has_custom_props().

◆ bc_get_ior()

double bc_get_ior ( Material * ma)

◆ bc_get_master_shader()

◆ bc_get_mesh_copy()

◆ bc_get_property()

float bc_get_property ( Bone * bone,
const std::string & key,
float def )

Read a custom bone property and convert to float Return def if the property does not exist.

Definition at line 685 of file collada_utils.cpp.

References bc_get_IDProperty(), IDP_Bool, IDP_BOOLEAN, IDP_DOUBLE, IDP_Double, IDP_FLOAT, IDP_Float, IDP_INT, IDP_Int, and result.

Referenced by bc_create_restpose_mat(), and bc_get_property_vector().

◆ bc_get_property_matrix()

bool bc_get_property_matrix ( Bone * bone,
const std::string & key,
float mat[4][4] )

Read a custom bone property and convert to matrix Return true if conversion was successful

Return false if:

  • the property does not exist
  • is not an array of size 16

Definition at line 710 of file collada_utils.cpp.

References bc_get_IDProperty(), i, IDP_ARRAY, and IDP_Array.

◆ bc_get_property_vector()

void bc_get_property_vector ( Bone * bone,
const std::string & key,
float val[3],
const float def[3] )

Get a vector that is stored in 3 custom properties (used in Blender <= 2.78).

Definition at line 725 of file collada_utils.cpp.

References bc_get_property().

Referenced by bc_create_restpose_mat().

◆ bc_get_reflective()

COLLADASW::ColorOrTexture bc_get_reflective ( Material * ma)

Definition at line 1220 of file collada_utils.cpp.

References bc_get_cot().

◆ bc_get_reflectivity()

double bc_get_reflectivity ( Material * ma)

◆ bc_get_shininess()

double bc_get_shininess ( Material * ma)

◆ bc_get_specular()

COLLADASW::ColorOrTexture bc_get_specular ( Material * ma)

Definition at line 1214 of file collada_utils.cpp.

References bc_get_cot().

◆ bc_get_uvlayer_name()

std::string bc_get_uvlayer_name ( Mesh * mesh,
int layer )
static

Returns UV Layer name or empty string if layer index is out of range

Definition at line 1084 of file collada_utils.cpp.

References bc_CustomData_get_layer_name(), CD_PROP_FLOAT2, Mesh::corner_data, and CustomData_number_of_layers().

◆ bc_getSceneActions()

std::vector< bAction * > bc_getSceneActions ( const bContext * C,
Object * ob,
bool all_actions )

◆ bc_has_animations() [1/2]

◆ bc_has_animations() [2/2]

bool bc_has_animations ( Scene * sce,
LinkNode * export_set )

Definition at line 873 of file collada_utils.cpp.

References bc_has_animations(), LinkNode::link, and LinkNode::next.

◆ bc_has_object_type()

bool bc_has_object_type ( LinkNode * export_set,
short obtype )

◆ bc_is_animated()

bool bc_is_animated ( BCMatrixSampleMap & values)

◆ bc_is_leaf_bone()

bool bc_is_leaf_bone ( Bone * bone)

A bone is a leaf when it has no children or all children are not connected.

Definition at line 474 of file collada_utils.cpp.

References BONE_CONNECTED, Bone::childbase, and LISTBASE_FOREACH.

◆ bc_is_root_bone()

bool bc_is_root_bone ( Bone * aBone,
bool deform_bones_only )

Check if a bone is the top most exportable bone in the bone hierarchy. When deform_bones_only == false, then only bones with NO parent can be root bones. Otherwise the top most deform bones in the hierarchy are root bones.

Definition at line 351 of file collada_utils.cpp.

References BONE_NO_DEFORM, Bone::flag, and Bone::parent.

◆ bc_match_scale() [1/2]

void bc_match_scale ( Object * ob,
UnitConverter & bc_unit,
bool scale_to_scene )

Calculate a re-scale factor such that the imported scene's scale is preserved. I.e. 1 meter in the import will also be 1 meter in the current scene.

Definition at line 394 of file collada_utils.cpp.

References BKE_object_apply_mat4(), UnitConverter::get_rotation(), UnitConverter::get_scale(), mul_m4_m4m4(), and Object::runtime.

Referenced by bc_match_scale(), and DocumentImporter::finish().

◆ bc_match_scale() [2/2]

void bc_match_scale ( std::vector< Object * > * objects_done,
UnitConverter & bc_unit,
bool scale_to_scene )

Definition at line 405 of file collada_utils.cpp.

References bc_match_scale().

◆ bc_node_add_link()

void bc_node_add_link ( bNodeTree * ntree,
bNode * from_node,
int from_index,
bNode * to_node,
int to_index )
static

◆ bc_replace_string()

std::string bc_replace_string ( std::string data,
const std::string & pattern,
const std::string & replacement )

Definition at line 382 of file collada_utils.cpp.

References data, and pos.

Referenced by bc_url_encode().

◆ bc_rotate_from_reference_quat()

void bc_rotate_from_reference_quat ( float quat_to[4],
float quat_from[4],
float mat_to[4][4] )

Create rotation_quaternion from a delta rotation and a reference quat

Input: mat_from: The rotation matrix before rotation mat_to : The rotation matrix after rotation qref : the quat corresponding to mat_from

Output: rot : the calculated result (quaternion).

Definition at line 435 of file collada_utils.cpp.

References invert_m4_m4(), mat4_to_quat(), mul_m4_m4m4(), mul_qt_qtqt(), and quat_to_mat4().

◆ bc_sanitize_v3() [1/2]

void bc_sanitize_v3 ( double v[3],
int precision )

Definition at line 1003 of file collada_utils.cpp.

References double_round(), i, and v.

◆ bc_sanitize_v3() [2/2]

void bc_sanitize_v3 ( float v[3],
int precision )

Definition at line 994 of file collada_utils.cpp.

References double_round(), i, and v.

Referenced by TransformWriter::add_node_transform_ob().

◆ bc_set_IDPropertyMatrix()

void bc_set_IDPropertyMatrix ( EditBone * ebone,
const char * key,
float mat[4][4] )

Stores a 4*4 matrix as a custom bone property array of size 16.

Definition at line 647 of file collada_utils.cpp.

References blender::bke::idprop::create(), blender::bke::idprop::create_group(), data, IDP_AddToGroup(), and EditBone::prop.

◆ bc_set_layer() [1/2]

int bc_set_layer ( int bitfield,
int layer )

Definition at line 494 of file collada_utils.cpp.

References bc_set_layer().

Referenced by bc_set_layer().

◆ bc_set_layer() [2/2]

int bc_set_layer ( int bitfield,
int layer,
bool enable )

Definition at line 499 of file collada_utils.cpp.

◆ bc_set_parent()

◆ bc_test_parent_loop()

int bc_test_parent_loop ( Object * par,
Object * ob )

Definition at line 85 of file collada_utils.cpp.

References bc_test_parent_loop(), and Object::parent.

Referenced by bc_test_parent_loop().

◆ bc_triangulate_mesh()

◆ bc_update_scene()

◆ bc_url_encode()

std::string bc_url_encode ( const std::string & data)

Definition at line 374 of file collada_utils.cpp.

References bc_replace_string(), and data.

Referenced by DocumentImporter::import().

◆ bc_validateConstraints()

◆ has_custom_props()

bool has_custom_props ( Bone * bone,
bool enabled,
const std::string & key )
static

Check if vector exist stored in 3 custom properties (used in Blender <= 2.78)

Definition at line 735 of file collada_utils.cpp.

References bc_get_IDProperty(), and enabled.

Referenced by bc_create_restpose_mat().

◆ isInteger()

bool isInteger ( const std::string & s)
inline

Definition at line 616 of file collada_utils.cpp.

◆ prepare_material_nodetree()

bNodeTree * prepare_material_nodetree ( Material * ma)
static