Blender V4.3
collada_utils.cpp File Reference
#include "COLLADABUPlatform.h"
#include "COLLADAFWGeometry.h"
#include "COLLADAFWMeshPrimitive.h"
#include "COLLADAFWMeshVertexData.h"
#include "COLLADAFWNode.h"
#include <set>
#include <string>
#include "MEM_guardedalloc.h"
#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 "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_key.hh"
#include "BKE_layer.hh"
#include "BKE_lib_id.hh"
#include "BKE_material.h"
#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_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 (std::string action_name, std::string ob_name, std::string channel_type, std::string axis_name, 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 (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, 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, std::string key)
 
float bc_get_property (Bone *bone, std::string key, float def)
 
bool bc_get_property_matrix (Bone *bone, std::string key, float mat[4][4])
 
void bc_get_property_vector (Bone *bone, std::string key, float val[3], const float def[3])
 
static bool has_custom_props (Bone *bone, bool enabled, std::string key)
 
void bc_enable_fcurves (AnimData *adt, 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 (Vector &to_vec, const Vector &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 (Vector &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 (Vector &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, 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, 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 (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()

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

◆ bc_add_default_shader()

void bc_add_default_shader ( bContext * C,
Material * ma )

◆ bc_add_global_transform() [1/4]

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

Definition at line 917 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 ( Vector & to_vec,
const BCMatrix & global_transform,
const bool invert )

Definition at line 924 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 ( Vector & to_vec,
const Vector & from_vec,
const BCMatrix & global_transform,
const bool invert )

Definition at line 908 of file collada_utils.cpp.

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

◆ bc_add_node() [1/2]

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

Definition at line 1133 of file collada_utils.cpp.

References bc_add_node().

◆ bc_add_node() [2/2]

static bNode * bc_add_node ( bContext * C,
bNodeTree * ntree,
int node_type,
int locx,
int locy,
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 ( Vector & to_vec,
const BCMatrix & global_transform,
const bool invert )

Definition at line 940 of file collada_utils.cpp.

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

◆ bc_bone_matrix_local_get()

bool bc_bone_matrix_local_get ( Object * ob,
Bone * bone,
Matrix & mat,
bool for_opensim )

◆ bc_bubble_sort_by_Object_name()

void bc_bubble_sort_by_Object_name ( LinkNode * export_set)

Definition at line 333 of file collada_utils.cpp.

References b, LinkNode::next, and node.

Referenced by collada_export().

◆ bc_copy_darray_m4d()

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

Definition at line 1039 of file collada_utils.cpp.

◆ bc_copy_farray_m4()

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

Definition at line 1030 of file collada_utils.cpp.

◆ bc_copy_m4_farray()

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

Definition at line 1021 of file collada_utils.cpp.

◆ bc_copy_m4d_v44()

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

Definition at line 1057 of file collada_utils.cpp.

◆ bc_copy_v44_m4d()

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

Definition at line 1048 of file collada_utils.cpp.

◆ 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 947 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 422 of file collada_utils.cpp.

References copy_v3_v3(), mat4_to_eul(), mat4_to_quat(), and mat4_to_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,
char * bone_name )

◆ bc_get_action_id()

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

◆ bc_get_active_UVLayer()

int bc_get_active_UVLayer ( Object * ob)

◆ bc_get_active_uvlayer_name() [1/2]

static 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 1069 of file collada_utils.cpp.

References bc_CustomData_get_active_layer_name(), CD_PROP_FLOAT2, and CustomData_number_of_layers().

Referenced by bc_get_active_uvlayer_name().

◆ bc_get_active_uvlayer_name() [2/2]

static 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 1086 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 1219 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 ( Color col,
bool with_alpha )

Definition at line 1323 of file collada_utils.cpp.

References col, and color.

◆ 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,
Color & default_color,
bool with_alpha )

◆ bc_get_edit_bone()

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

Definition at line 490 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 78 of file collada_utils.cpp.

Referenced by SkinInfo::borrow_skin_controller_data().

◆ bc_get_IDProperty()

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

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

Definition at line 691 of file collada_utils.cpp.

References IDP_GetPropertyFromGroup(), 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()

Mesh * bc_get_mesh_copy ( BlenderContext & blender_context,
Object * ob,
BC_export_mesh_type export_mesh_type,
bool apply_modifiers,
bool triangulate )

◆ bc_get_property()

float bc_get_property ( Bone * bone,
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 696 of file collada_utils.cpp.

References bc_get_IDProperty(), float, 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,
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 721 of file collada_utils.cpp.

References bc_get_IDProperty(), IDP_ARRAY, and IDP_Array.

◆ bc_get_property_vector()

void bc_get_property_vector ( Bone * bone,
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 736 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 1231 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 1225 of file collada_utils.cpp.

References bc_get_cot().

◆ bc_get_uvlayer_name()

static 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 1095 of file collada_utils.cpp.

References bc_CustomData_get_layer_name(), CD_PROP_FLOAT2, 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 884 of file collada_utils.cpp.

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

◆ bc_has_object_type()

bool bc_has_object_type ( LinkNode * export_set,
short obtype )

Definition at line 319 of file collada_utils.cpp.

References Object::data, LinkNode::next, node, and Object::type.

Referenced by DocumentExporter::exportCurrentScene().

◆ 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 480 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 357 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 400 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 411 of file collada_utils.cpp.

References bc_match_scale().

◆ bc_node_add_link()

static 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 388 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 441 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 1014 of file collada_utils.cpp.

References double_round(), and v.

◆ bc_sanitize_v3() [2/2]

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

Definition at line 1005 of file collada_utils.cpp.

References double(), double_round(), float, 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 658 of file collada_utils.cpp.

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

◆ bc_set_layer() [1/2]

int bc_set_layer ( int bitfield,
int layer )

Definition at line 500 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 505 of file collada_utils.cpp.

◆ bc_set_parent()

◆ bc_test_parent_loop()

int bc_test_parent_loop ( Object * par,
Object * ob )

Definition at line 91 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()

void bc_update_scene ( BlenderContext & blender_context,
float ctime )

◆ bc_url_encode()

std::string bc_url_encode ( std::string data)

Definition at line 380 of file collada_utils.cpp.

References bc_replace_string().

Referenced by DocumentImporter::import().

◆ bc_validateConstraints()

◆ has_custom_props()

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

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

Definition at line 746 of file collada_utils.cpp.

References bc_get_IDProperty().

Referenced by bc_create_restpose_mat().

◆ isInteger()

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

Definition at line 627 of file collada_utils.cpp.

◆ prepare_material_nodetree()

static bNodeTree * prepare_material_nodetree ( Material * ma)
static