Cleanup: move public doc-strings into headers for 'io/collada'
Ref T92709
This commit is contained in:
@@ -126,7 +126,6 @@ bool AnimationExporter::exportAnimations()
|
|||||||
return animation_count;
|
return animation_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* called for each exported object */
|
|
||||||
void AnimationExporter::exportAnimation(Object *ob, BCAnimationSampler &sampler)
|
void AnimationExporter::exportAnimation(Object *ob, BCAnimationSampler &sampler)
|
||||||
{
|
{
|
||||||
bool container_is_open = false;
|
bool container_is_open = false;
|
||||||
@@ -165,16 +164,6 @@ void AnimationExporter::exportAnimation(Object *ob, BCAnimationSampler &sampler)
|
|||||||
close_animation_container(container_is_open);
|
close_animation_container(container_is_open);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Export all animation FCurves of an Object.
|
|
||||||
*
|
|
||||||
* NOTE: This uses the keyframes as sample points,
|
|
||||||
* and exports "baked keyframes" while keeping the tangent information
|
|
||||||
* of the FCurves intact. This works for simple cases, but breaks
|
|
||||||
* especially when negative scales are involved in the animation.
|
|
||||||
* And when parent inverse matrices are involved (when exporting
|
|
||||||
* object hierarchies)
|
|
||||||
*/
|
|
||||||
void AnimationExporter::export_curve_animation_set(Object *ob,
|
void AnimationExporter::export_curve_animation_set(Object *ob,
|
||||||
BCAnimationSampler &sampler,
|
BCAnimationSampler &sampler,
|
||||||
bool export_as_matrix)
|
bool export_as_matrix)
|
||||||
@@ -254,7 +243,6 @@ BC_global_rotation_type AnimationExporter::get_global_rotation_type(Object *ob)
|
|||||||
return (apply_global_rotation) ? BC_DATA_ROTATION : BC_OBJECT_ROTATION;
|
return (apply_global_rotation) ? BC_DATA_ROTATION : BC_OBJECT_ROTATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Write bone animations in transform matrix sources. */
|
|
||||||
void AnimationExporter::export_bone_animations_recursive(Object *ob,
|
void AnimationExporter::export_bone_animations_recursive(Object *ob,
|
||||||
Bone *bone,
|
Bone *bone,
|
||||||
BCAnimationSampler &sampler)
|
BCAnimationSampler &sampler)
|
||||||
@@ -277,14 +265,6 @@ void AnimationExporter::export_bone_animations_recursive(Object *ob,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* In some special cases the exported Curve needs to be replaced
|
|
||||||
* by a modified curve (for collada purposes)
|
|
||||||
* This method checks if a conversion is necessary and if applicable
|
|
||||||
* returns a pointer to the modified BCAnimationCurve.
|
|
||||||
* IMPORTANT: the modified curve must be deleted by the caller when no longer needed
|
|
||||||
* if no conversion is needed this method returns a NULL;
|
|
||||||
*/
|
|
||||||
BCAnimationCurve *AnimationExporter::get_modified_export_curve(Object *ob,
|
BCAnimationCurve *AnimationExporter::get_modified_export_curve(Object *ob,
|
||||||
BCAnimationCurve &curve,
|
BCAnimationCurve &curve,
|
||||||
BCAnimationCurveMap &curves)
|
BCAnimationCurveMap &curves)
|
||||||
@@ -657,9 +637,6 @@ std::string AnimationExporter::collada_source_from_values(
|
|||||||
return source_id;
|
return source_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Create a collada matrix source for a set of samples
|
|
||||||
*/
|
|
||||||
std::string AnimationExporter::collada_source_from_values(
|
std::string AnimationExporter::collada_source_from_values(
|
||||||
BCMatrixSampleMap &samples,
|
BCMatrixSampleMap &samples,
|
||||||
const std::string &anim_id,
|
const std::string &anim_id,
|
||||||
@@ -823,10 +800,6 @@ std::string AnimationExporter::get_collada_name(std::string channel_type) const
|
|||||||
return tm_name;
|
return tm_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Assign sid of the animated parameter or transform for rotation,
|
|
||||||
* axis name is always appended and the value of append_axis is ignored
|
|
||||||
*/
|
|
||||||
std::string AnimationExporter::get_collada_sid(const BCAnimationCurve &curve,
|
std::string AnimationExporter::get_collada_sid(const BCAnimationCurve &curve,
|
||||||
const std::string axis_name)
|
const std::string axis_name)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ class AnimationExporter : COLLADASW::LibraryAnimations {
|
|||||||
|
|
||||||
bool exportAnimations();
|
bool exportAnimations();
|
||||||
|
|
||||||
/* called for each exported object */
|
/** Called for each exported object. */
|
||||||
void operator()(Object *ob);
|
void operator()(Object *ob);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -148,25 +148,34 @@ class AnimationExporter : COLLADASW::LibraryAnimations {
|
|||||||
|
|
||||||
std::vector<std::vector<std::string>> anim_meta;
|
std::vector<std::vector<std::string>> anim_meta;
|
||||||
|
|
||||||
/* Main entry point into Animation export (called for each exported object) */
|
/** Main entry point into Animation export (called for each exported object). */
|
||||||
void exportAnimation(Object *ob, BCAnimationSampler &sampler);
|
void exportAnimation(Object *ob, BCAnimationSampler &sampler);
|
||||||
|
|
||||||
/* export animation as separate trans/rot/scale curves */
|
/**
|
||||||
|
* Export all animation FCurves of an Object.
|
||||||
|
*
|
||||||
|
* \note This uses the keyframes as sample points,
|
||||||
|
* and exports "baked keyframes" while keeping the tangent information
|
||||||
|
* of the FCurves intact. This works for simple cases, but breaks
|
||||||
|
* especially when negative scales are involved in the animation.
|
||||||
|
* And when parent inverse matrices are involved (when exporting
|
||||||
|
* object hierarchies)
|
||||||
|
*/
|
||||||
void export_curve_animation_set(Object *ob, BCAnimationSampler &sampler, bool export_as_matrix);
|
void export_curve_animation_set(Object *ob, BCAnimationSampler &sampler, bool export_as_matrix);
|
||||||
|
|
||||||
/* export one single curve */
|
/** Export one single curve. */
|
||||||
void export_curve_animation(Object *ob, BCAnimationCurve &curve);
|
void export_curve_animation(Object *ob, BCAnimationCurve &curve);
|
||||||
|
|
||||||
/* export animation as matrix data */
|
/** Export animation as matrix data. */
|
||||||
void export_matrix_animation(Object *ob, BCAnimationSampler &sampler);
|
void export_matrix_animation(Object *ob, BCAnimationSampler &sampler);
|
||||||
|
|
||||||
/* step through the bone hierarchy */
|
/** Write bone animations in transform matrix sources (step through the bone hierarchy). */
|
||||||
void export_bone_animations_recursive(Object *ob_arm, Bone *bone, BCAnimationSampler &sampler);
|
void export_bone_animations_recursive(Object *ob_arm, Bone *bone, BCAnimationSampler &sampler);
|
||||||
|
|
||||||
/* Export for one bone */
|
/** Export for one bone. */
|
||||||
void export_bone_animation(Object *ob, Bone *bone, BCFrames &frames, BCMatrixSampleMap &samples);
|
void export_bone_animation(Object *ob, Bone *bone, BCFrames &frames, BCMatrixSampleMap &samples);
|
||||||
|
|
||||||
/* call to the low level collada exporter */
|
/** Call to the low level collada exporter. */
|
||||||
void export_collada_curve_animation(std::string id,
|
void export_collada_curve_animation(std::string id,
|
||||||
std::string name,
|
std::string name,
|
||||||
std::string target,
|
std::string target,
|
||||||
@@ -174,7 +183,7 @@ class AnimationExporter : COLLADASW::LibraryAnimations {
|
|||||||
BCAnimationCurve &curve,
|
BCAnimationCurve &curve,
|
||||||
BC_global_rotation_type global_rotation_type);
|
BC_global_rotation_type global_rotation_type);
|
||||||
|
|
||||||
/* call to the low level collada exporter */
|
/** Call to the low level collada exporter. */
|
||||||
void export_collada_matrix_animation(std::string id,
|
void export_collada_matrix_animation(std::string id,
|
||||||
std::string name,
|
std::string name,
|
||||||
std::string target,
|
std::string target,
|
||||||
@@ -183,29 +192,38 @@ class AnimationExporter : COLLADASW::LibraryAnimations {
|
|||||||
BC_global_rotation_type global_rotation_type,
|
BC_global_rotation_type global_rotation_type,
|
||||||
Matrix &parentinv);
|
Matrix &parentinv);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* In some special cases the exported Curve needs to be replaced
|
||||||
|
* by a modified curve (for collada purposes)
|
||||||
|
* This method checks if a conversion is necessary and if applicable
|
||||||
|
* returns a pointer to the modified BCAnimationCurve.
|
||||||
|
* IMPORTANT: the modified curve must be deleted by the caller when no longer needed
|
||||||
|
* if no conversion is needed this method returns a NULL;
|
||||||
|
*/
|
||||||
BCAnimationCurve *get_modified_export_curve(Object *ob,
|
BCAnimationCurve *get_modified_export_curve(Object *ob,
|
||||||
BCAnimationCurve &curve,
|
BCAnimationCurve &curve,
|
||||||
BCAnimationCurveMap &curves);
|
BCAnimationCurveMap &curves);
|
||||||
|
|
||||||
/* Helper functions */
|
/* Helper functions. */
|
||||||
|
|
||||||
void openAnimationWithClip(std::string id, std::string name);
|
void openAnimationWithClip(std::string id, std::string name);
|
||||||
bool open_animation_container(bool has_container, Object *ob);
|
bool open_animation_container(bool has_container, Object *ob);
|
||||||
void close_animation_container(bool has_container);
|
void close_animation_container(bool has_container);
|
||||||
|
|
||||||
/* Input and Output sources (single valued) */
|
/** Input and Output sources (single valued). */
|
||||||
std::string collada_source_from_values(BC_animation_source_type source_type,
|
std::string collada_source_from_values(BC_animation_source_type source_type,
|
||||||
COLLADASW::InputSemantic::Semantics semantic,
|
COLLADASW::InputSemantic::Semantics semantic,
|
||||||
std::vector<float> &values,
|
std::vector<float> &values,
|
||||||
const std::string &anim_id,
|
const std::string &anim_id,
|
||||||
const std::string axis_name);
|
const std::string axis_name);
|
||||||
|
|
||||||
/* Output sources (matrix data) */
|
/** Output sources (matrix data). * Create a collada matrix source for a set of samples. */
|
||||||
std::string collada_source_from_values(BCMatrixSampleMap &samples,
|
std::string collada_source_from_values(BCMatrixSampleMap &samples,
|
||||||
const std::string &anim_id,
|
const std::string &anim_id,
|
||||||
BC_global_rotation_type global_rotation_type,
|
BC_global_rotation_type global_rotation_type,
|
||||||
Matrix &parentinv);
|
Matrix &parentinv);
|
||||||
|
|
||||||
/* Interpolation sources */
|
/** Interpolation sources. */
|
||||||
std::string collada_linear_interpolation_source(int tot, const std::string &anim_id);
|
std::string collada_linear_interpolation_source(int tot, const std::string &anim_id);
|
||||||
|
|
||||||
/* source ID = animation_name + semantic_suffix */
|
/* source ID = animation_name + semantic_suffix */
|
||||||
@@ -240,6 +258,10 @@ class AnimationExporter : COLLADASW::LibraryAnimations {
|
|||||||
|
|
||||||
std::string get_axis_name(std::string channel, int id);
|
std::string get_axis_name(std::string channel, int id);
|
||||||
std::string get_collada_name(std::string channel_type) const;
|
std::string get_collada_name(std::string channel_type) const;
|
||||||
|
/**
|
||||||
|
* Assign sid of the animated parameter or transform for rotation,
|
||||||
|
* axis name is always appended and the value of append_axis is ignored.
|
||||||
|
*/
|
||||||
std::string get_collada_sid(const BCAnimationCurve &curve, const std::string axis_name);
|
std::string get_collada_sid(const BCAnimationCurve &curve, const std::string axis_name);
|
||||||
|
|
||||||
/* ===================================== */
|
/* ===================================== */
|
||||||
|
|||||||
@@ -81,7 +81,6 @@ void AnimationImporter::add_bezt(FCurve *fcu,
|
|||||||
calchandles_fcurve(fcu);
|
calchandles_fcurve(fcu);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* create one or several fcurves depending on the number of parameters being animated */
|
|
||||||
void AnimationImporter::animation_to_fcurves(COLLADAFW::AnimationCurve *curve)
|
void AnimationImporter::animation_to_fcurves(COLLADAFW::AnimationCurve *curve)
|
||||||
{
|
{
|
||||||
COLLADAFW::FloatOrDoubleArray &input = curve->getInputValues();
|
COLLADAFW::FloatOrDoubleArray &input = curve->getInputValues();
|
||||||
@@ -323,7 +322,6 @@ bool AnimationImporter::write_animation(const COLLADAFW::Animation *anim)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* called on post-process stage after writeVisualScenes */
|
|
||||||
bool AnimationImporter::write_animation_list(const COLLADAFW::AnimationList *animlist)
|
bool AnimationImporter::write_animation_list(const COLLADAFW::AnimationList *animlist)
|
||||||
{
|
{
|
||||||
const COLLADAFW::UniqueId &animlist_id = animlist->getUniqueId();
|
const COLLADAFW::UniqueId &animlist_id = animlist->getUniqueId();
|
||||||
@@ -343,11 +341,6 @@ bool AnimationImporter::write_animation_list(const COLLADAFW::AnimationList *ani
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* \todo refactor read_node_transform to not automatically apply anything,
|
|
||||||
* but rather return the transform matrix, so caller can do with it what is
|
|
||||||
* necessary. Same for \ref get_node_mat
|
|
||||||
*/
|
|
||||||
void AnimationImporter::read_node_transform(COLLADAFW::Node *node, Object *ob)
|
void AnimationImporter::read_node_transform(COLLADAFW::Node *node, Object *ob)
|
||||||
{
|
{
|
||||||
float mat[4][4];
|
float mat[4][4];
|
||||||
@@ -463,7 +456,6 @@ virtual void AnimationImporter::change_eul_to_quat(Object *ob, bAction *act)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* sets the rna_path and array index to curve */
|
|
||||||
void AnimationImporter::modify_fcurve(std::vector<FCurve *> *curves,
|
void AnimationImporter::modify_fcurve(std::vector<FCurve *> *curves,
|
||||||
const char *rna_path,
|
const char *rna_path,
|
||||||
int array_index,
|
int array_index,
|
||||||
@@ -535,8 +527,6 @@ static int get_animation_axis_index(const COLLADABU::Math::Vector3 &axis)
|
|||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* creates the rna_paths and array indices of fcurves from animations using transformation and
|
|
||||||
* bound animation class of each animation. */
|
|
||||||
void AnimationImporter::Assign_transform_animations(
|
void AnimationImporter::Assign_transform_animations(
|
||||||
COLLADAFW::Transformation *transform,
|
COLLADAFW::Transformation *transform,
|
||||||
const COLLADAFW::AnimationList::AnimationBinding *binding,
|
const COLLADAFW::AnimationList::AnimationBinding *binding,
|
||||||
@@ -654,8 +644,6 @@ void AnimationImporter::Assign_transform_animations(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* creates the rna_paths and array indices of fcurves from animations using color and bound
|
|
||||||
* animation class of each animation. */
|
|
||||||
void AnimationImporter::Assign_color_animations(const COLLADAFW::UniqueId &listid,
|
void AnimationImporter::Assign_color_animations(const COLLADAFW::UniqueId &listid,
|
||||||
ListBase *AnimCurves,
|
ListBase *AnimCurves,
|
||||||
const char *anim_type)
|
const char *anim_type)
|
||||||
@@ -765,11 +753,6 @@ float AnimationImporter::convert_to_focal_length(float in_xfov,
|
|||||||
return fov_to_focallength(xfov, sensorx);
|
return fov_to_focallength(xfov, sensorx);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Lens animations must be stored in COLLADA by using FOV,
|
|
||||||
* while blender internally uses focal length.
|
|
||||||
* The imported animation curves must be converted appropriately.
|
|
||||||
*/
|
|
||||||
void AnimationImporter::Assign_lens_animations(const COLLADAFW::UniqueId &listid,
|
void AnimationImporter::Assign_lens_animations(const COLLADAFW::UniqueId &listid,
|
||||||
ListBase *AnimCurves,
|
ListBase *AnimCurves,
|
||||||
const double aspect,
|
const double aspect,
|
||||||
@@ -1403,8 +1386,6 @@ void AnimationImporter::add_bone_animation_sampled(Object *ob,
|
|||||||
chan->rotmode = ROT_MODE_QUAT;
|
chan->rotmode = ROT_MODE_QUAT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if object is animated by checking if animlist_map
|
|
||||||
* holds the animlist_id of node transforms */
|
|
||||||
AnimationImporter::AnimMix *AnimationImporter::get_animation_type(
|
AnimationImporter::AnimMix *AnimationImporter::get_animation_type(
|
||||||
const COLLADAFW::Node *node,
|
const COLLADAFW::Node *node,
|
||||||
std::map<COLLADAFW::UniqueId, const COLLADAFW::Object *> FW_object_map)
|
std::map<COLLADAFW::UniqueId, const COLLADAFW::Object *> FW_object_map)
|
||||||
@@ -1514,7 +1495,6 @@ int AnimationImporter::setAnimType(const COLLADAFW::Animatable *prop, int types,
|
|||||||
return anim_type;
|
return anim_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Is not used anymore. */
|
|
||||||
void AnimationImporter::find_frames_old(std::vector<float> *frames,
|
void AnimationImporter::find_frames_old(std::vector<float> *frames,
|
||||||
COLLADAFW::Node *node,
|
COLLADAFW::Node *node,
|
||||||
COLLADAFW::Transformation::TransformationType tm_type)
|
COLLADAFW::Transformation::TransformationType tm_type)
|
||||||
@@ -1579,9 +1559,6 @@ void AnimationImporter::find_frames_old(std::vector<float> *frames,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* prerequisites:
|
|
||||||
* animlist_map - map animlist id -> animlist
|
|
||||||
* curve_map - map anim id -> curve(s) */
|
|
||||||
Object *AnimationImporter::translate_animation_OLD(
|
Object *AnimationImporter::translate_animation_OLD(
|
||||||
COLLADAFW::Node *node,
|
COLLADAFW::Node *node,
|
||||||
std::map<COLLADAFW::UniqueId, Object *> &object_map,
|
std::map<COLLADAFW::UniqueId, Object *> &object_map,
|
||||||
@@ -1854,9 +1831,6 @@ Object *AnimationImporter::translate_animation_OLD(
|
|||||||
return job;
|
return job;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* internal, better make it private
|
|
||||||
* warning: evaluates only rotation and only assigns matrix transforms now
|
|
||||||
* prerequisites: animlist_map, curve_map */
|
|
||||||
void AnimationImporter::evaluate_transform_at_frame(float mat[4][4],
|
void AnimationImporter::evaluate_transform_at_frame(float mat[4][4],
|
||||||
COLLADAFW::Node *node,
|
COLLADAFW::Node *node,
|
||||||
float fra)
|
float fra)
|
||||||
@@ -1915,7 +1889,6 @@ static void report_class_type_unsupported(const char *path,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* return true to indicate that mat contains a sane value */
|
|
||||||
bool AnimationImporter::evaluate_animation(COLLADAFW::Transformation *tm,
|
bool AnimationImporter::evaluate_animation(COLLADAFW::Transformation *tm,
|
||||||
float mat[4][4],
|
float mat[4][4],
|
||||||
float fra,
|
float fra,
|
||||||
@@ -2063,7 +2036,6 @@ bool AnimationImporter::evaluate_animation(COLLADAFW::Transformation *tm,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* gives a world-space mat of joint at rest position */
|
|
||||||
void AnimationImporter::get_joint_rest_mat(float mat[4][4],
|
void AnimationImporter::get_joint_rest_mat(float mat[4][4],
|
||||||
COLLADAFW::Node *root,
|
COLLADAFW::Node *root,
|
||||||
COLLADAFW::Node *node)
|
COLLADAFW::Node *node)
|
||||||
@@ -2079,7 +2051,6 @@ void AnimationImporter::get_joint_rest_mat(float mat[4][4],
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* gives a world-space mat, end's mat not included */
|
|
||||||
bool AnimationImporter::calc_joint_parent_mat_rest(float mat[4][4],
|
bool AnimationImporter::calc_joint_parent_mat_rest(float mat[4][4],
|
||||||
float par[4][4],
|
float par[4][4],
|
||||||
COLLADAFW::Node *node,
|
COLLADAFW::Node *node,
|
||||||
|
|||||||
@@ -75,7 +75,9 @@ class AnimationImporter : private TransformReader, public AnimationImporterBase
|
|||||||
float value,
|
float value,
|
||||||
eBezTriple_Interpolation ipo = BEZT_IPO_LIN);
|
eBezTriple_Interpolation ipo = BEZT_IPO_LIN);
|
||||||
|
|
||||||
/* create one or several fcurves depending on the number of parameters being animated */
|
/**
|
||||||
|
* Create one or several fcurves depending on the number of parameters being animated.
|
||||||
|
*/
|
||||||
void animation_to_fcurves(COLLADAFW::AnimationCurve *curve);
|
void animation_to_fcurves(COLLADAFW::AnimationCurve *curve);
|
||||||
|
|
||||||
void fcurve_deg_to_rad(FCurve *cu);
|
void fcurve_deg_to_rad(FCurve *cu);
|
||||||
@@ -143,9 +145,14 @@ class AnimationImporter : private TransformReader, public AnimationImporterBase
|
|||||||
void set_import_from_version(std::string import_from_version);
|
void set_import_from_version(std::string import_from_version);
|
||||||
bool write_animation(const COLLADAFW::Animation *anim);
|
bool write_animation(const COLLADAFW::Animation *anim);
|
||||||
|
|
||||||
/* called on post-process stage after writeVisualScenes */
|
/** Called on post-process stage after writeVisualScenes. */
|
||||||
bool write_animation_list(const COLLADAFW::AnimationList *animlist);
|
bool write_animation_list(const COLLADAFW::AnimationList *animlist);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \todo refactor read_node_transform to not automatically apply anything,
|
||||||
|
* but rather return the transform matrix, so caller can do with it what is
|
||||||
|
* necessary. Same for \ref get_node_mat
|
||||||
|
*/
|
||||||
void read_node_transform(COLLADAFW::Node *node, Object *ob);
|
void read_node_transform(COLLADAFW::Node *node, Object *ob);
|
||||||
#if 0
|
#if 0
|
||||||
virtual void change_eul_to_quat(Object *ob, bAction *act);
|
virtual void change_eul_to_quat(Object *ob, bAction *act);
|
||||||
@@ -157,6 +164,10 @@ class AnimationImporter : private TransformReader, public AnimationImporterBase
|
|||||||
std::map<COLLADAFW::UniqueId, const COLLADAFW::Object *> FW_object_map,
|
std::map<COLLADAFW::UniqueId, const COLLADAFW::Object *> FW_object_map,
|
||||||
std::map<COLLADAFW::UniqueId, Material *> uid_material_map);
|
std::map<COLLADAFW::UniqueId, Material *> uid_material_map);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if object is animated by checking if animlist_map
|
||||||
|
* holds the animlist_id of node transforms.
|
||||||
|
*/
|
||||||
AnimMix *get_animation_type(
|
AnimMix *get_animation_type(
|
||||||
const COLLADAFW::Node *node,
|
const COLLADAFW::Node *node,
|
||||||
std::map<COLLADAFW::UniqueId, const COLLADAFW::Object *> FW_object_map);
|
std::map<COLLADAFW::UniqueId, const COLLADAFW::Object *> FW_object_map);
|
||||||
@@ -173,18 +184,31 @@ class AnimationImporter : private TransformReader, public AnimationImporterBase
|
|||||||
COLLADAFW::Node *node,
|
COLLADAFW::Node *node,
|
||||||
COLLADAFW::Transformation *tm);
|
COLLADAFW::Transformation *tm);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the rna_paths and array indices of fcurves from animations using transformation and
|
||||||
|
* bound animation class of each animation.
|
||||||
|
*/
|
||||||
void Assign_transform_animations(COLLADAFW::Transformation *transform,
|
void Assign_transform_animations(COLLADAFW::Transformation *transform,
|
||||||
const COLLADAFW::AnimationList::AnimationBinding *binding,
|
const COLLADAFW::AnimationList::AnimationBinding *binding,
|
||||||
std::vector<FCurve *> *curves,
|
std::vector<FCurve *> *curves,
|
||||||
bool is_joint,
|
bool is_joint,
|
||||||
char *joint_path);
|
char *joint_path);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the rna_paths and array indices of fcurves from animations using color and bound
|
||||||
|
* animation class of each animation.
|
||||||
|
*/
|
||||||
void Assign_color_animations(const COLLADAFW::UniqueId &listid,
|
void Assign_color_animations(const COLLADAFW::UniqueId &listid,
|
||||||
ListBase *AnimCurves,
|
ListBase *AnimCurves,
|
||||||
const char *anim_type);
|
const char *anim_type);
|
||||||
void Assign_float_animations(const COLLADAFW::UniqueId &listid,
|
void Assign_float_animations(const COLLADAFW::UniqueId &listid,
|
||||||
ListBase *AnimCurves,
|
ListBase *AnimCurves,
|
||||||
const char *anim_type);
|
const char *anim_type);
|
||||||
|
/**
|
||||||
|
* Lens animations must be stored in COLLADA by using FOV,
|
||||||
|
* while blender internally uses focal length.
|
||||||
|
* The imported animation curves must be converted appropriately.
|
||||||
|
*/
|
||||||
void Assign_lens_animations(const COLLADAFW::UniqueId &listid,
|
void Assign_lens_animations(const COLLADAFW::UniqueId &listid,
|
||||||
ListBase *AnimCurves,
|
ListBase *AnimCurves,
|
||||||
const double aspect,
|
const double aspect,
|
||||||
@@ -194,14 +218,17 @@ class AnimationImporter : private TransformReader, public AnimationImporterBase
|
|||||||
|
|
||||||
int setAnimType(const COLLADAFW::Animatable *prop, int type, int addition);
|
int setAnimType(const COLLADAFW::Animatable *prop, int type, int addition);
|
||||||
|
|
||||||
|
/** Sets the rna_path and array index to curve. */
|
||||||
void modify_fcurve(std::vector<FCurve *> *curves,
|
void modify_fcurve(std::vector<FCurve *> *curves,
|
||||||
const char *rna_path,
|
const char *rna_path,
|
||||||
int array_index,
|
int array_index,
|
||||||
int scale = 1);
|
int scale = 1);
|
||||||
void unused_fcurve(std::vector<FCurve *> *curves);
|
void unused_fcurve(std::vector<FCurve *> *curves);
|
||||||
/* prerequisites:
|
/**
|
||||||
|
* Prerequisites:
|
||||||
* animlist_map - map animlist id -> animlist
|
* animlist_map - map animlist id -> animlist
|
||||||
* curve_map - map anim id -> curve(s) */
|
* curve_map - map anim id -> curve(s).
|
||||||
|
*/
|
||||||
Object *translate_animation_OLD(COLLADAFW::Node *node,
|
Object *translate_animation_OLD(COLLADAFW::Node *node,
|
||||||
std::map<COLLADAFW::UniqueId, Object *> &object_map,
|
std::map<COLLADAFW::UniqueId, Object *> &object_map,
|
||||||
std::map<COLLADAFW::UniqueId, COLLADAFW::Node *> &root_map,
|
std::map<COLLADAFW::UniqueId, COLLADAFW::Node *> &root_map,
|
||||||
@@ -209,24 +236,27 @@ class AnimationImporter : private TransformReader, public AnimationImporterBase
|
|||||||
Object *par_job = NULL);
|
Object *par_job = NULL);
|
||||||
|
|
||||||
void find_frames(std::vector<float> *frames, std::vector<FCurve *> *curves);
|
void find_frames(std::vector<float> *frames, std::vector<FCurve *> *curves);
|
||||||
|
/** Is not used anymore. */
|
||||||
void find_frames_old(std::vector<float> *frames,
|
void find_frames_old(std::vector<float> *frames,
|
||||||
COLLADAFW::Node *node,
|
COLLADAFW::Node *node,
|
||||||
COLLADAFW::Transformation::TransformationType tm_type);
|
COLLADAFW::Transformation::TransformationType tm_type);
|
||||||
/* internal, better make it private
|
/**
|
||||||
* warning: evaluates only rotation
|
* Internal, better make it private
|
||||||
* prerequisites: animlist_map, curve_map */
|
* warning: evaluates only rotation and only assigns matrix transforms now
|
||||||
|
* prerequisites: animlist_map, curve_map.
|
||||||
|
*/
|
||||||
void evaluate_transform_at_frame(float mat[4][4], COLLADAFW::Node *node, float fra);
|
void evaluate_transform_at_frame(float mat[4][4], COLLADAFW::Node *node, float fra);
|
||||||
|
|
||||||
/* return true to indicate that mat contains a sane value */
|
/** Return true to indicate that mat contains a sane value. */
|
||||||
bool evaluate_animation(COLLADAFW::Transformation *tm,
|
bool evaluate_animation(COLLADAFW::Transformation *tm,
|
||||||
float mat[4][4],
|
float mat[4][4],
|
||||||
float fra,
|
float fra,
|
||||||
const char *node_id);
|
const char *node_id);
|
||||||
|
|
||||||
/* gives a world-space mat of joint at rest position */
|
/** Gives a world-space mat of joint at rest position. */
|
||||||
void get_joint_rest_mat(float mat[4][4], COLLADAFW::Node *root, COLLADAFW::Node *node);
|
void get_joint_rest_mat(float mat[4][4], COLLADAFW::Node *root, COLLADAFW::Node *node);
|
||||||
|
|
||||||
/* gives a world-space mat, end's mat not included */
|
/** * Gives a world-space mat, end's mat not included. */
|
||||||
bool calc_joint_parent_mat_rest(float mat[4][4],
|
bool calc_joint_parent_mat_rest(float mat[4][4],
|
||||||
float par[4][4],
|
float par[4][4],
|
||||||
COLLADAFW::Node *node,
|
COLLADAFW::Node *node,
|
||||||
@@ -239,8 +269,10 @@ class AnimationImporter : private TransformReader, public AnimationImporterBase
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* recursively evaluates joint tree until end is found, mat then is world-space matrix of end
|
/**
|
||||||
* mat must be identity on enter, node must be root */
|
* Recursively evaluates joint tree until end is found, mat then is world-space matrix of end
|
||||||
|
* mat must be identity on enter, node must be root.
|
||||||
|
*/
|
||||||
bool evaluate_joint_world_transform_at_frame(
|
bool evaluate_joint_world_transform_at_frame(
|
||||||
float mat[4][4], float par[4][4], COLLADAFW::Node *node, COLLADAFW::Node *end, float fra);
|
float mat[4][4], float par[4][4], COLLADAFW::Node *node, COLLADAFW::Node *end, float fra);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -40,7 +40,6 @@
|
|||||||
#include "GeometryExporter.h"
|
#include "GeometryExporter.h"
|
||||||
#include "SceneExporter.h"
|
#include "SceneExporter.h"
|
||||||
|
|
||||||
/* write bone nodes */
|
|
||||||
void ArmatureExporter::add_armature_bones(Object *ob_arm,
|
void ArmatureExporter::add_armature_bones(Object *ob_arm,
|
||||||
ViewLayer *view_layer,
|
ViewLayer *view_layer,
|
||||||
SceneExporter *se,
|
SceneExporter *se,
|
||||||
@@ -144,7 +143,6 @@ void ArmatureExporter::find_objects_using_armature(Object *ob_arm,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* parent_mat is armature-space */
|
|
||||||
void ArmatureExporter::add_bone_node(Bone *bone,
|
void ArmatureExporter::add_bone_node(Bone *bone,
|
||||||
Object *ob_arm,
|
Object *ob_arm,
|
||||||
SceneExporter *se,
|
SceneExporter *se,
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ class ArmatureExporter : public COLLADASW::LibraryControllers,
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* write bone nodes */
|
||||||
void add_armature_bones(Object *ob_arm,
|
void add_armature_bones(Object *ob_arm,
|
||||||
ViewLayer *view_layer,
|
ViewLayer *view_layer,
|
||||||
SceneExporter *se,
|
SceneExporter *se,
|
||||||
@@ -83,8 +84,11 @@ class ArmatureExporter : public COLLADASW::LibraryControllers,
|
|||||||
void find_objects_using_armature(Object *ob_arm, std::vector<Object *> &objects, Scene *sce);
|
void find_objects_using_armature(Object *ob_arm, std::vector<Object *> &objects, Scene *sce);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Scene, SceneExporter and the list of child_objects
|
/**
|
||||||
* are required for writing bone parented objects */
|
* Scene, SceneExporter and the list of child_objects
|
||||||
|
* are required for writing bone parented objects.
|
||||||
|
* \param parent_mat: is armature-space.
|
||||||
|
*/
|
||||||
void add_bone_node(Bone *bone,
|
void add_bone_node(Bone *bone,
|
||||||
Object *ob_arm,
|
Object *ob_arm,
|
||||||
SceneExporter *se,
|
SceneExporter *se,
|
||||||
|
|||||||
@@ -220,12 +220,6 @@ int ArmatureImporter::create_bone(SkinInfo *skin,
|
|||||||
return chain_length + 1;
|
return chain_length + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Collada only knows Joints, hence bones at the end of a bone chain
|
|
||||||
* don't have a defined length. This function guesses reasonable
|
|
||||||
* tail locations for the affected bones (nodes which don't have any connected child)
|
|
||||||
* Hint: The extended_bones set gets populated in ArmatureImporter::create_bone
|
|
||||||
*/
|
|
||||||
void ArmatureImporter::fix_leaf_bone_hierarchy(bArmature *armature,
|
void ArmatureImporter::fix_leaf_bone_hierarchy(bArmature *armature,
|
||||||
Bone *bone,
|
Bone *bone,
|
||||||
bool fix_orientation)
|
bool fix_orientation)
|
||||||
@@ -757,11 +751,6 @@ bool ArmatureImporter::node_is_decomposed(const COLLADAFW::Node *node)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* root - if this joint is the top joint in hierarchy, if a joint
|
|
||||||
* is a child of a node (not joint), root should be true since
|
|
||||||
* this is where we build armature bones from
|
|
||||||
*/
|
|
||||||
void ArmatureImporter::add_root_joint(COLLADAFW::Node *node, Object *parent)
|
void ArmatureImporter::add_root_joint(COLLADAFW::Node *node, Object *parent)
|
||||||
{
|
{
|
||||||
root_joints.push_back(node);
|
root_joints.push_back(node);
|
||||||
@@ -786,7 +775,6 @@ void ArmatureImporter::add_root_joint(COLLADAFW::Node *node)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* here we add bones to armatures, having armatures previously created in write_controller */
|
|
||||||
void ArmatureImporter::make_armatures(bContext *C, std::vector<Object *> &objects_to_scale)
|
void ArmatureImporter::make_armatures(bContext *C, std::vector<Object *> &objects_to_scale)
|
||||||
{
|
{
|
||||||
Main *bmain = CTX_data_main(C);
|
Main *bmain = CTX_data_main(C);
|
||||||
@@ -1042,7 +1030,6 @@ void ArmatureImporter::get_rna_path_for_joint(COLLADAFW::Node *node,
|
|||||||
BLI_snprintf(joint_path, count, "pose.bones[\"%s\"]", bone_name_esc);
|
BLI_snprintf(joint_path, count, "pose.bones[\"%s\"]", bone_name_esc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* gives a world-space mat */
|
|
||||||
bool ArmatureImporter::get_joint_bind_mat(float m[4][4], COLLADAFW::Node *joint)
|
bool ArmatureImporter::get_joint_bind_mat(float m[4][4], COLLADAFW::Node *joint)
|
||||||
{
|
{
|
||||||
std::map<COLLADAFW::UniqueId, SkinInfo>::iterator it;
|
std::map<COLLADAFW::UniqueId, SkinInfo>::iterator it;
|
||||||
|
|||||||
@@ -111,6 +111,12 @@ class ArmatureImporter : private TransformReader {
|
|||||||
std::vector<std::string> &layer_labels,
|
std::vector<std::string> &layer_labels,
|
||||||
BoneExtensionMap &extended_bones);
|
BoneExtensionMap &extended_bones);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collada only knows Joints, hence bones at the end of a bone chain
|
||||||
|
* don't have a defined length. This function guesses reasonable
|
||||||
|
* tail locations for the affected bones (nodes which don't have any connected child)
|
||||||
|
* Hint: The extended_bones set gets populated in ArmatureImporter::create_bone
|
||||||
|
*/
|
||||||
void fix_leaf_bone_hierarchy(bArmature *armature, Bone *bone, bool fix_orientation);
|
void fix_leaf_bone_hierarchy(bArmature *armature, Bone *bone, bool fix_orientation);
|
||||||
void fix_leaf_bone(bArmature *armature, EditBone *ebone, BoneExtended *be, bool fix_orientation);
|
void fix_leaf_bone(bArmature *armature, EditBone *ebone, BoneExtended *be, bool fix_orientation);
|
||||||
void fix_parent_connect(bArmature *armature, Bone *bone);
|
void fix_parent_connect(bArmature *armature, Bone *bone);
|
||||||
@@ -152,15 +158,20 @@ class ArmatureImporter : private TransformReader {
|
|||||||
const ImportSettings *import_settings);
|
const ImportSettings *import_settings);
|
||||||
~ArmatureImporter();
|
~ArmatureImporter();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* root - if this joint is the top joint in hierarchy, if a joint
|
||||||
|
* is a child of a node (not joint), root should be true since
|
||||||
|
* this is where we build armature bones from
|
||||||
|
*/
|
||||||
void add_root_joint(COLLADAFW::Node *node, Object *parent);
|
void add_root_joint(COLLADAFW::Node *node, Object *parent);
|
||||||
|
|
||||||
/* here we add bones to armatures, having armatures previously created in write_controller */
|
/** Here we add bones to armatures, having armatures previously created in write_controller. */
|
||||||
void make_armatures(bContext *C, std::vector<Object *> &objects_to_scale);
|
void make_armatures(bContext *C, std::vector<Object *> &objects_to_scale);
|
||||||
|
|
||||||
void make_shape_keys(bContext *C);
|
void make_shape_keys(bContext *C);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* link with meshes, create vertex groups, assign weights */
|
/** Link with meshes, create vertex groups, assign weights. */
|
||||||
void link_armature(Object *ob_arm,
|
void link_armature(Object *ob_arm,
|
||||||
const COLLADAFW::UniqueId &geom_id,
|
const COLLADAFW::UniqueId &geom_id,
|
||||||
const COLLADAFW::UniqueId &controller_data_id);
|
const COLLADAFW::UniqueId &controller_data_id);
|
||||||
@@ -176,7 +187,7 @@ class ArmatureImporter : private TransformReader {
|
|||||||
|
|
||||||
void get_rna_path_for_joint(COLLADAFW::Node *node, char *joint_path, size_t count);
|
void get_rna_path_for_joint(COLLADAFW::Node *node, char *joint_path, size_t count);
|
||||||
|
|
||||||
/* gives a world-space mat */
|
/** Gives a world-space mat. */
|
||||||
bool get_joint_bind_mat(float m[4][4], COLLADAFW::Node *joint);
|
bool get_joint_bind_mat(float m[4][4], COLLADAFW::Node *joint);
|
||||||
|
|
||||||
void set_tags_map(TagsMap &tags_map);
|
void set_tags_map(TagsMap &tags_map);
|
||||||
|
|||||||
@@ -418,11 +418,6 @@ void BCAnimationSampler::generate_transforms(Object *ob, Bone *bone, BCAnimation
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Collect all keyframes from all animation curves related to the object.
|
|
||||||
* The bc_get... functions check for NULL and correct object type.
|
|
||||||
* The #add_keyframes_from() function checks for NULL.
|
|
||||||
*/
|
|
||||||
void BCAnimationSampler::initialize_keyframes(BCFrameSet &frameset, Object *ob)
|
void BCAnimationSampler::initialize_keyframes(BCFrameSet &frameset, Object *ob)
|
||||||
{
|
{
|
||||||
frameset.clear();
|
frameset.clear();
|
||||||
@@ -517,7 +512,6 @@ BCSample &BCSampleFrame::add(Object *ob)
|
|||||||
return *sample;
|
return *sample;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the matrix for the given key, returns Unity when the key does not exist */
|
|
||||||
const BCSample *BCSampleFrame::get_sample(Object *ob) const
|
const BCSample *BCSampleFrame::get_sample(Object *ob) const
|
||||||
{
|
{
|
||||||
BCSampleMap::const_iterator it = sampleMap.find(ob);
|
BCSampleMap::const_iterator it = sampleMap.find(ob);
|
||||||
@@ -537,7 +531,6 @@ const BCMatrix *BCSampleFrame::get_sample_matrix(Object *ob) const
|
|||||||
return &sample->get_matrix();
|
return &sample->get_matrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the matrix for the given Bone, returns Unity when the Object is not sampled. */
|
|
||||||
const BCMatrix *BCSampleFrame::get_sample_matrix(Object *ob, Bone *bone) const
|
const BCMatrix *BCSampleFrame::get_sample_matrix(Object *ob, Bone *bone) const
|
||||||
{
|
{
|
||||||
BCSampleMap::const_iterator it = sampleMap.find(ob);
|
BCSampleMap::const_iterator it = sampleMap.find(ob);
|
||||||
@@ -550,13 +543,11 @@ const BCMatrix *BCSampleFrame::get_sample_matrix(Object *ob, Bone *bone) const
|
|||||||
return bc_bone;
|
return bc_bone;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if the key is in this BCSampleFrame */
|
|
||||||
bool BCSampleFrame::has_sample_for(Object *ob) const
|
bool BCSampleFrame::has_sample_for(Object *ob) const
|
||||||
{
|
{
|
||||||
return sampleMap.find(ob) != sampleMap.end();
|
return sampleMap.find(ob) != sampleMap.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if the Bone is in this BCSampleFrame */
|
|
||||||
bool BCSampleFrame::has_sample_for(Object *ob, Bone *bone) const
|
bool BCSampleFrame::has_sample_for(Object *ob, Bone *bone) const
|
||||||
{
|
{
|
||||||
const BCMatrix *bc_bone = get_sample_matrix(ob, bone);
|
const BCMatrix *bc_bone = get_sample_matrix(ob, bone);
|
||||||
@@ -575,7 +566,6 @@ BCSample &BCSampleFrameContainer::add(Object *ob, int frame_index)
|
|||||||
/* Below are the getters which we need to export the data */
|
/* Below are the getters which we need to export the data */
|
||||||
/* ====================================================== */
|
/* ====================================================== */
|
||||||
|
|
||||||
/* Return either the BCSampleFrame or NULL if frame does not exist. */
|
|
||||||
BCSampleFrame *BCSampleFrameContainer::get_frame(int frame_index)
|
BCSampleFrame *BCSampleFrameContainer::get_frame(int frame_index)
|
||||||
{
|
{
|
||||||
BCSampleFrameMap::iterator it = sample_frames.find(frame_index);
|
BCSampleFrameMap::iterator it = sample_frames.find(frame_index);
|
||||||
@@ -583,7 +573,6 @@ BCSampleFrame *BCSampleFrameContainer::get_frame(int frame_index)
|
|||||||
return frame;
|
return frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return a list of all frames that need to be sampled */
|
|
||||||
int BCSampleFrameContainer::get_frames(std::vector<int> &frames) const
|
int BCSampleFrameContainer::get_frames(std::vector<int> &frames) const
|
||||||
{
|
{
|
||||||
frames.clear(); /* safety; */
|
frames.clear(); /* safety; */
|
||||||
|
|||||||
@@ -89,11 +89,16 @@ class BCSampleFrame {
|
|||||||
BCSample &add(Object *ob);
|
BCSample &add(Object *ob);
|
||||||
|
|
||||||
/* Following methods return NULL if object is not in the sampleMap. */
|
/* Following methods return NULL if object is not in the sampleMap. */
|
||||||
|
|
||||||
|
/** Get the matrix for the given key, returns Unity when the key does not exist. */
|
||||||
const BCSample *get_sample(Object *ob) const;
|
const BCSample *get_sample(Object *ob) const;
|
||||||
const BCMatrix *get_sample_matrix(Object *ob) const;
|
const BCMatrix *get_sample_matrix(Object *ob) const;
|
||||||
|
/** Get the matrix for the given Bone, returns Unity when the Object is not sampled. */
|
||||||
const BCMatrix *get_sample_matrix(Object *ob, Bone *bone) const;
|
const BCMatrix *get_sample_matrix(Object *ob, Bone *bone) const;
|
||||||
|
|
||||||
|
/** Check if the key is in this BCSampleFrame. */
|
||||||
bool has_sample_for(Object *ob) const;
|
bool has_sample_for(Object *ob) const;
|
||||||
|
/** Check if the Bone is in this BCSampleFrame. */
|
||||||
bool has_sample_for(Object *ob, Bone *bone) const;
|
bool has_sample_for(Object *ob, Bone *bone) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -134,8 +139,10 @@ class BCSampleFrameContainer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
BCSample &add(Object *ob, int frame_index);
|
BCSample &add(Object *ob, int frame_index);
|
||||||
BCSampleFrame *get_frame(int frame_index); /* returns NULL if frame does not exist */
|
/** Return either the #BCSampleFrame or NULL if frame does not exist. */
|
||||||
|
BCSampleFrame *get_frame(int frame_index);
|
||||||
|
|
||||||
|
/** Return a list of all frames that need to be sampled. */
|
||||||
int get_frames(std::vector<int> &frames) const;
|
int get_frames(std::vector<int> &frames) const;
|
||||||
int get_frames(Object *ob, BCFrames &frames) const;
|
int get_frames(Object *ob, BCFrames &frames) const;
|
||||||
int get_frames(Object *ob, Bone *bone, BCFrames &frames) const;
|
int get_frames(Object *ob, Bone *bone, BCFrames &frames) const;
|
||||||
@@ -159,6 +166,11 @@ class BCAnimationSampler {
|
|||||||
void generate_transforms(Object *ob, Bone *bone, BCAnimationCurveMap &curves);
|
void generate_transforms(Object *ob, Bone *bone, BCAnimationCurveMap &curves);
|
||||||
|
|
||||||
void initialize_curves(BCAnimationCurveMap &curves, Object *ob);
|
void initialize_curves(BCAnimationCurveMap &curves, Object *ob);
|
||||||
|
/**
|
||||||
|
* Collect all keyframes from all animation curves related to the object.
|
||||||
|
* The bc_get... functions check for NULL and correct object type.
|
||||||
|
* The #add_keyframes_from() function checks for NULL.
|
||||||
|
*/
|
||||||
void initialize_keyframes(BCFrameSet &frameset, Object *ob);
|
void initialize_keyframes(BCFrameSet &frameset, Object *ob);
|
||||||
BCSample &sample_object(Object *ob, int frame_index, bool for_opensim);
|
BCSample &sample_object(Object *ob, int frame_index, bool for_opensim);
|
||||||
void update_animation_curves(BCAnimation &animation,
|
void update_animation_curves(BCAnimation &animation,
|
||||||
|
|||||||
@@ -183,8 +183,6 @@ void BCMatrix::unit()
|
|||||||
quat_to_eul(this->rot, this->q);
|
quat_to_eul(this->rot, this->q);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We need double here because the OpenCollada API needs it.
|
|
||||||
* precision = -1 indicates to not limit the precision. */
|
|
||||||
void BCMatrix::get_matrix(DMatrix &mat, const bool transposed, const int precision) const
|
void BCMatrix::get_matrix(DMatrix &mat, const bool transposed, const int precision) const
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
|
|||||||
@@ -78,6 +78,10 @@ class BCMatrix {
|
|||||||
BCMatrix(Object *ob);
|
BCMatrix(Object *ob);
|
||||||
BCMatrix();
|
BCMatrix();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* We need double here because the OpenCollada API needs it.
|
||||||
|
* precision = -1 indicates to not limit the precision.
|
||||||
|
*/
|
||||||
void get_matrix(DMatrix &matrix, const bool transposed = false, const int precision = -1) const;
|
void get_matrix(DMatrix &matrix, const bool transposed = false, const int precision = -1) const;
|
||||||
void get_matrix(Matrix &matrix,
|
void get_matrix(Matrix &matrix,
|
||||||
const bool transposed = false,
|
const bool transposed = false,
|
||||||
|
|||||||
@@ -39,7 +39,6 @@ void BCSample::add_bone_matrix(Bone *bone, Matrix &mat)
|
|||||||
bonemats[bone] = matrix;
|
bonemats[bone] = matrix;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get channel value */
|
|
||||||
bool BCSample::get_value(std::string channel_target, const int array_index, float *val) const
|
bool BCSample::get_value(std::string channel_target, const int array_index, float *val) const
|
||||||
{
|
{
|
||||||
std::string bname = bc_string_before(channel_target, ".");
|
std::string bname = bc_string_before(channel_target, ".");
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ class BCSample {
|
|||||||
|
|
||||||
void add_bone_matrix(Bone *bone, Matrix &mat);
|
void add_bone_matrix(Bone *bone, Matrix &mat);
|
||||||
|
|
||||||
|
/** Get channel value. */
|
||||||
bool get_value(std::string channel_target, const int array_index, float *val) const;
|
bool get_value(std::string channel_target, const int array_index, float *val) const;
|
||||||
const BCMatrix &get_matrix() const;
|
const BCMatrix &get_matrix() const;
|
||||||
const BCMatrix *get_matrix(Bone *bone) const; /* returns NULL if bone is not animated */
|
const BCMatrix *get_matrix(Bone *bone) const; /* returns NULL if bone is not animated */
|
||||||
|
|||||||
@@ -31,12 +31,6 @@ bool bc_is_base_node(LinkNode *export_set, Object *ob, ViewLayer *view_layer)
|
|||||||
return (root == ob);
|
return (root == ob);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the highest selected ancestor
|
|
||||||
* returns NULL if no ancestor is selected
|
|
||||||
* IMPORTANT: This function expects that all exported objects have set:
|
|
||||||
* ob->id.tag & LIB_TAG_DOIT
|
|
||||||
*/
|
|
||||||
Object *bc_get_highest_exported_ancestor_or_self(LinkNode *export_set,
|
Object *bc_get_highest_exported_ancestor_or_self(LinkNode *export_set,
|
||||||
Object *ob,
|
Object *ob,
|
||||||
ViewLayer *view_layer)
|
ViewLayer *view_layer)
|
||||||
|
|||||||
@@ -38,6 +38,12 @@ static const BC_global_up_axis BC_DEFAULT_UP = BC_GLOBAL_UP_Z;
|
|||||||
|
|
||||||
bool bc_is_in_Export_set(LinkNode *export_set, Object *ob, ViewLayer *view_layer);
|
bool bc_is_in_Export_set(LinkNode *export_set, Object *ob, ViewLayer *view_layer);
|
||||||
bool bc_is_base_node(LinkNode *export_set, Object *ob, ViewLayer *view_layer);
|
bool bc_is_base_node(LinkNode *export_set, Object *ob, ViewLayer *view_layer);
|
||||||
|
/**
|
||||||
|
* Returns the highest selected ancestor
|
||||||
|
* returns NULL if no ancestor is selected
|
||||||
|
* IMPORTANT: This function expects that all exported objects have set:
|
||||||
|
* `ob->id.tag & LIB_TAG_DOIT`
|
||||||
|
*/
|
||||||
Object *bc_get_highest_exported_ancestor_or_self(LinkNode *export_set,
|
Object *bc_get_highest_exported_ancestor_or_self(LinkNode *export_set,
|
||||||
Object *ob,
|
Object *ob,
|
||||||
ViewLayer *view_layer);
|
ViewLayer *view_layer);
|
||||||
|
|||||||
@@ -161,8 +161,6 @@ std::string ControllerExporter::get_controller_id(Key *key, Object *ob)
|
|||||||
return translate_id(id_name(ob)) + MORPH_CONTROLLER_ID_SUFFIX;
|
return translate_id(id_name(ob)) + MORPH_CONTROLLER_ID_SUFFIX;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ob should be of type OB_MESH
|
|
||||||
* both args are required */
|
|
||||||
void ControllerExporter::export_skin_controller(Object *ob, Object *ob_arm)
|
void ControllerExporter::export_skin_controller(Object *ob, Object *ob_arm)
|
||||||
{
|
{
|
||||||
/* joint names
|
/* joint names
|
||||||
@@ -377,7 +375,6 @@ std::string ControllerExporter::add_morph_weights(Key *key, Object *ob)
|
|||||||
return source_id;
|
return source_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Added to implement support for animations. */
|
|
||||||
void ControllerExporter::add_weight_extras(Key *key)
|
void ControllerExporter::add_weight_extras(Key *key)
|
||||||
{
|
{
|
||||||
/* can also try the base element and param alternative */
|
/* can also try the base element and param alternative */
|
||||||
|
|||||||
@@ -91,8 +91,7 @@ class ControllerExporter : public COLLADASW::LibraryControllers,
|
|||||||
|
|
||||||
std::string get_controller_id(Key *key, Object *ob);
|
std::string get_controller_id(Key *key, Object *ob);
|
||||||
|
|
||||||
/* ob should be of type OB_MESH
|
/** `ob` should be of type OB_MESH, both arguments are required. */
|
||||||
* both args are required */
|
|
||||||
void export_skin_controller(Object *ob, Object *ob_arm);
|
void export_skin_controller(Object *ob, Object *ob_arm);
|
||||||
|
|
||||||
void export_morph_controller(Object *ob, Key *key);
|
void export_morph_controller(Object *ob, Key *key);
|
||||||
@@ -107,6 +106,9 @@ class ControllerExporter : public COLLADASW::LibraryControllers,
|
|||||||
|
|
||||||
std::string add_morph_weights(Key *key, Object *ob);
|
std::string add_morph_weights(Key *key, Object *ob);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Added to implement support for animations.
|
||||||
|
*/
|
||||||
void add_weight_extras(Key *key);
|
void add_weight_extras(Key *key);
|
||||||
|
|
||||||
std::string add_joints_source(Object *ob_arm,
|
std::string add_joints_source(Object *ob_arm,
|
||||||
|
|||||||
@@ -320,10 +320,6 @@ void DocumentImporter::translate_anim_recursive(COLLADAFW::Node *node,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* If the imported file was made with Blender, return the Blender version used,
|
|
||||||
* otherwise return an empty std::string
|
|
||||||
*/
|
|
||||||
std::string DocumentImporter::get_import_version(const COLLADAFW::FileInfo *asset)
|
std::string DocumentImporter::get_import_version(const COLLADAFW::FileInfo *asset)
|
||||||
{
|
{
|
||||||
const char AUTORING_TOOL[] = "authoring_tool";
|
const char AUTORING_TOOL[] = "authoring_tool";
|
||||||
@@ -347,10 +343,6 @@ std::string DocumentImporter::get_import_version(const COLLADAFW::FileInfo *asse
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* When this method is called, the writer must write the global document asset.
|
|
||||||
* \return The writer should return true, if writing succeeded, false otherwise.
|
|
||||||
*/
|
|
||||||
bool DocumentImporter::writeGlobalAsset(const COLLADAFW::FileInfo *asset)
|
bool DocumentImporter::writeGlobalAsset(const COLLADAFW::FileInfo *asset)
|
||||||
{
|
{
|
||||||
unit_converter.read_asset(asset);
|
unit_converter.read_asset(asset);
|
||||||
@@ -359,10 +351,6 @@ bool DocumentImporter::writeGlobalAsset(const COLLADAFW::FileInfo *asset)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* When this method is called, the writer must write the scene.
|
|
||||||
* \return The writer should return true, if writing succeeded, false otherwise.
|
|
||||||
*/
|
|
||||||
bool DocumentImporter::writeScene(const COLLADAFW::Scene *scene)
|
bool DocumentImporter::writeScene(const COLLADAFW::Scene *scene)
|
||||||
{
|
{
|
||||||
/* XXX could store the scene id, but do nothing for now */
|
/* XXX could store the scene id, but do nothing for now */
|
||||||
@@ -476,8 +464,6 @@ Object *DocumentImporter::create_instance_node(Object *source_ob,
|
|||||||
return obn;
|
return obn;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* to create constraints off node <extra> tags. Assumes only constraint data in
|
|
||||||
* current <extra> with blender profile. */
|
|
||||||
void DocumentImporter::create_constraints(ExtraTags *et, Object *ob)
|
void DocumentImporter::create_constraints(ExtraTags *et, Object *ob)
|
||||||
{
|
{
|
||||||
if (et && et->isProfile("blender")) {
|
if (et && et->isProfile("blender")) {
|
||||||
@@ -712,10 +698,6 @@ finally:
|
|||||||
return root_objects;
|
return root_objects;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* When this method is called, the writer must write the entire visual scene.
|
|
||||||
* Return The writer should return true, if writing succeeded, false otherwise.
|
|
||||||
*/
|
|
||||||
bool DocumentImporter::writeVisualScene(const COLLADAFW::VisualScene *visualScene)
|
bool DocumentImporter::writeVisualScene(const COLLADAFW::VisualScene *visualScene)
|
||||||
{
|
{
|
||||||
if (mImportStage == Fetching_Controller_data) {
|
if (mImportStage == Fetching_Controller_data) {
|
||||||
@@ -738,11 +720,6 @@ bool DocumentImporter::writeVisualScene(const COLLADAFW::VisualScene *visualScen
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* When this method is called, the writer must handle all nodes contained in the
|
|
||||||
* library nodes.
|
|
||||||
* \return The writer should return true, if writing succeeded, false otherwise.
|
|
||||||
*/
|
|
||||||
bool DocumentImporter::writeLibraryNodes(const COLLADAFW::LibraryNodes *libraryNodes)
|
bool DocumentImporter::writeLibraryNodes(const COLLADAFW::LibraryNodes *libraryNodes)
|
||||||
{
|
{
|
||||||
if (mImportStage == Fetching_Controller_data) {
|
if (mImportStage == Fetching_Controller_data) {
|
||||||
@@ -762,10 +739,6 @@ bool DocumentImporter::writeLibraryNodes(const COLLADAFW::LibraryNodes *libraryN
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* When this method is called, the writer must write the geometry.
|
|
||||||
* \return The writer should return true, if writing succeeded, false otherwise.
|
|
||||||
*/
|
|
||||||
bool DocumentImporter::writeGeometry(const COLLADAFW::Geometry *geom)
|
bool DocumentImporter::writeGeometry(const COLLADAFW::Geometry *geom)
|
||||||
{
|
{
|
||||||
if (mImportStage == Fetching_Controller_data) {
|
if (mImportStage == Fetching_Controller_data) {
|
||||||
@@ -775,10 +748,6 @@ bool DocumentImporter::writeGeometry(const COLLADAFW::Geometry *geom)
|
|||||||
return mesh_importer.write_geometry(geom);
|
return mesh_importer.write_geometry(geom);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* When this method is called, the writer must write the material.
|
|
||||||
* \return The writer should return true, if writing succeeded, false otherwise.
|
|
||||||
*/
|
|
||||||
bool DocumentImporter::writeMaterial(const COLLADAFW::Material *cmat)
|
bool DocumentImporter::writeMaterial(const COLLADAFW::Material *cmat)
|
||||||
{
|
{
|
||||||
if (mImportStage == Fetching_Controller_data) {
|
if (mImportStage == Fetching_Controller_data) {
|
||||||
@@ -821,10 +790,6 @@ void DocumentImporter::write_profile_COMMON(COLLADAFW::EffectCommon *ef, Materia
|
|||||||
matNode.update_material_nodetree();
|
matNode.update_material_nodetree();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* When this method is called, the writer must write the effect.
|
|
||||||
* \return The writer should return true, if writing succeeded, false otherwise.
|
|
||||||
*/
|
|
||||||
bool DocumentImporter::writeEffect(const COLLADAFW::Effect *effect)
|
bool DocumentImporter::writeEffect(const COLLADAFW::Effect *effect)
|
||||||
{
|
{
|
||||||
if (mImportStage == Fetching_Controller_data) {
|
if (mImportStage == Fetching_Controller_data) {
|
||||||
@@ -860,10 +825,6 @@ bool DocumentImporter::writeEffect(const COLLADAFW::Effect *effect)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* When this method is called, the writer must write the camera.
|
|
||||||
* \return The writer should return true, if writing succeeded, false otherwise.
|
|
||||||
*/
|
|
||||||
bool DocumentImporter::writeCamera(const COLLADAFW::Camera *camera)
|
bool DocumentImporter::writeCamera(const COLLADAFW::Camera *camera)
|
||||||
{
|
{
|
||||||
if (mImportStage == Fetching_Controller_data) {
|
if (mImportStage == Fetching_Controller_data) {
|
||||||
@@ -973,10 +934,6 @@ bool DocumentImporter::writeCamera(const COLLADAFW::Camera *camera)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* When this method is called, the writer must write the image.
|
|
||||||
* \return The writer should return true, if writing succeeded, false otherwise.
|
|
||||||
*/
|
|
||||||
bool DocumentImporter::writeImage(const COLLADAFW::Image *image)
|
bool DocumentImporter::writeImage(const COLLADAFW::Image *image)
|
||||||
{
|
{
|
||||||
if (mImportStage == Fetching_Controller_data) {
|
if (mImportStage == Fetching_Controller_data) {
|
||||||
@@ -1013,10 +970,6 @@ bool DocumentImporter::writeImage(const COLLADAFW::Image *image)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* When this method is called, the writer must write the light.
|
|
||||||
* \return The writer should return true, if writing succeeded, false otherwise.
|
|
||||||
*/
|
|
||||||
bool DocumentImporter::writeLight(const COLLADAFW::Light *light)
|
bool DocumentImporter::writeLight(const COLLADAFW::Light *light)
|
||||||
{
|
{
|
||||||
if (mImportStage == Fetching_Controller_data) {
|
if (mImportStage == Fetching_Controller_data) {
|
||||||
@@ -1164,7 +1117,6 @@ bool DocumentImporter::writeLight(const COLLADAFW::Light *light)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* this function is called only for animations that pass COLLADAFW::validate */
|
|
||||||
bool DocumentImporter::writeAnimation(const COLLADAFW::Animation *anim)
|
bool DocumentImporter::writeAnimation(const COLLADAFW::Animation *anim)
|
||||||
{
|
{
|
||||||
if (mImportStage == Fetching_Controller_data) {
|
if (mImportStage == Fetching_Controller_data) {
|
||||||
@@ -1174,7 +1126,6 @@ bool DocumentImporter::writeAnimation(const COLLADAFW::Animation *anim)
|
|||||||
return anim_importer.write_animation(anim);
|
return anim_importer.write_animation(anim);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* called on post-process stage after writeVisualScenes */
|
|
||||||
bool DocumentImporter::writeAnimationList(const COLLADAFW::AnimationList *animationList)
|
bool DocumentImporter::writeAnimationList(const COLLADAFW::AnimationList *animationList)
|
||||||
{
|
{
|
||||||
if (mImportStage == Fetching_Controller_data) {
|
if (mImportStage == Fetching_Controller_data) {
|
||||||
@@ -1186,10 +1137,10 @@ bool DocumentImporter::writeAnimationList(const COLLADAFW::AnimationList *animat
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if WITH_OPENCOLLADA_ANIMATION_CLIP
|
#if WITH_OPENCOLLADA_ANIMATION_CLIP
|
||||||
/* Since opencollada 1.6.68
|
|
||||||
* called on post-process stage after writeVisualScenes */
|
|
||||||
bool DocumentImporter::writeAnimationClip(const COLLADAFW::AnimationClip *animationClip)
|
bool DocumentImporter::writeAnimationClip(const COLLADAFW::AnimationClip *animationClip)
|
||||||
{
|
{
|
||||||
|
/* Since opencollada 1.6.68: called on post-process stage after writeVisualScenes. */
|
||||||
|
|
||||||
if (mImportStage == Fetching_Controller_data) {
|
if (mImportStage == Fetching_Controller_data) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1200,16 +1151,11 @@ bool DocumentImporter::writeAnimationClip(const COLLADAFW::AnimationClip *animat
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
|
||||||
* When this method is called, the writer must write the skin controller data.
|
|
||||||
* \return The writer should return true, if writing succeeded, false otherwise.
|
|
||||||
*/
|
|
||||||
bool DocumentImporter::writeSkinControllerData(const COLLADAFW::SkinControllerData *skin)
|
bool DocumentImporter::writeSkinControllerData(const COLLADAFW::SkinControllerData *skin)
|
||||||
{
|
{
|
||||||
return armature_importer.write_skin_controller_data(skin);
|
return armature_importer.write_skin_controller_data(skin);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* this is called on postprocess, before writeVisualScenes */
|
|
||||||
bool DocumentImporter::writeController(const COLLADAFW::Controller *controller)
|
bool DocumentImporter::writeController(const COLLADAFW::Controller *controller)
|
||||||
{
|
{
|
||||||
if (mImportStage == Fetching_Controller_data) {
|
if (mImportStage == Fetching_Controller_data) {
|
||||||
|
|||||||
@@ -64,6 +64,10 @@ class DocumentImporter : COLLADAFW::IWriter {
|
|||||||
Object *create_camera_object(COLLADAFW::InstanceCamera *, Scene *);
|
Object *create_camera_object(COLLADAFW::InstanceCamera *, Scene *);
|
||||||
Object *create_light_object(COLLADAFW::InstanceLight *, Scene *);
|
Object *create_light_object(COLLADAFW::InstanceLight *, Scene *);
|
||||||
Object *create_instance_node(Object *, COLLADAFW::Node *, COLLADAFW::Node *, Scene *, bool);
|
Object *create_instance_node(Object *, COLLADAFW::Node *, COLLADAFW::Node *, Scene *, bool);
|
||||||
|
/**
|
||||||
|
* To create constraints off node <extra> tags. Assumes only constraint data in
|
||||||
|
* current <extra> with blender profile.
|
||||||
|
*/
|
||||||
void create_constraints(ExtraTags *et, Object *ob);
|
void create_constraints(ExtraTags *et, Object *ob);
|
||||||
std::vector<Object *> *write_node(COLLADAFW::Node *, COLLADAFW::Node *, Scene *, Object *, bool);
|
std::vector<Object *> *write_node(COLLADAFW::Node *, COLLADAFW::Node *, Scene *, Object *, bool);
|
||||||
void write_profile_COMMON(COLLADAFW::EffectCommon *, Material *);
|
void write_profile_COMMON(COLLADAFW::EffectCommon *, Material *);
|
||||||
@@ -86,17 +90,44 @@ class DocumentImporter : COLLADAFW::IWriter {
|
|||||||
*/
|
*/
|
||||||
void finish();
|
void finish();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When this method is called, the writer must write the global document asset.
|
||||||
|
* \return The writer should return true, if writing succeeded, false otherwise.
|
||||||
|
*/
|
||||||
bool writeGlobalAsset(const COLLADAFW::FileInfo *);
|
bool writeGlobalAsset(const COLLADAFW::FileInfo *);
|
||||||
|
/**
|
||||||
|
* If the imported file was made with Blender, return the Blender version used,
|
||||||
|
* otherwise return an empty std::string
|
||||||
|
*/
|
||||||
std::string get_import_version(const COLLADAFW::FileInfo *asset);
|
std::string get_import_version(const COLLADAFW::FileInfo *asset);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When this method is called, the writer must write the scene.
|
||||||
|
* \return The writer should return true, if writing succeeded, false otherwise.
|
||||||
|
*/
|
||||||
bool writeScene(const COLLADAFW::Scene *);
|
bool writeScene(const COLLADAFW::Scene *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When this method is called, the writer must write the entire visual scene.
|
||||||
|
* Return The writer should return true, if writing succeeded, false otherwise.
|
||||||
|
*/
|
||||||
bool writeVisualScene(const COLLADAFW::VisualScene *);
|
bool writeVisualScene(const COLLADAFW::VisualScene *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When this method is called, the writer must handle all nodes contained in the
|
||||||
|
* library nodes.
|
||||||
|
* \return The writer should return true, if writing succeeded, false otherwise.
|
||||||
|
*/
|
||||||
bool writeLibraryNodes(const COLLADAFW::LibraryNodes *);
|
bool writeLibraryNodes(const COLLADAFW::LibraryNodes *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function is called only for animations that pass COLLADAFW::validate.
|
||||||
|
*/
|
||||||
bool writeAnimation(const COLLADAFW::Animation *);
|
bool writeAnimation(const COLLADAFW::Animation *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called on post-process stage after writeVisualScenes.
|
||||||
|
*/
|
||||||
bool writeAnimationList(const COLLADAFW::AnimationList *);
|
bool writeAnimationList(const COLLADAFW::AnimationList *);
|
||||||
|
|
||||||
#if WITH_OPENCOLLADA_ANIMATION_CLIP
|
#if WITH_OPENCOLLADA_ANIMATION_CLIP
|
||||||
@@ -105,20 +136,49 @@ class DocumentImporter : COLLADAFW::IWriter {
|
|||||||
bool writeAnimationClip(const COLLADAFW::AnimationClip *animationClip);
|
bool writeAnimationClip(const COLLADAFW::AnimationClip *animationClip);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When this method is called, the writer must write the geometry.
|
||||||
|
* \return The writer should return true, if writing succeeded, false otherwise.
|
||||||
|
*/
|
||||||
bool writeGeometry(const COLLADAFW::Geometry *);
|
bool writeGeometry(const COLLADAFW::Geometry *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When this method is called, the writer must write the material.
|
||||||
|
* \return The writer should return true, if writing succeeded, false otherwise.
|
||||||
|
*/
|
||||||
bool writeMaterial(const COLLADAFW::Material *);
|
bool writeMaterial(const COLLADAFW::Material *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When this method is called, the writer must write the effect.
|
||||||
|
* \return The writer should return true, if writing succeeded, false otherwise.
|
||||||
|
*/
|
||||||
bool writeEffect(const COLLADAFW::Effect *);
|
bool writeEffect(const COLLADAFW::Effect *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When this method is called, the writer must write the camera.
|
||||||
|
* \return The writer should return true, if writing succeeded, false otherwise.
|
||||||
|
*/
|
||||||
bool writeCamera(const COLLADAFW::Camera *);
|
bool writeCamera(const COLLADAFW::Camera *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When this method is called, the writer must write the image.
|
||||||
|
* \return The writer should return true, if writing succeeded, false otherwise.
|
||||||
|
*/
|
||||||
bool writeImage(const COLLADAFW::Image *);
|
bool writeImage(const COLLADAFW::Image *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When this method is called, the writer must write the light.
|
||||||
|
* \return The writer should return true, if writing succeeded, false otherwise.
|
||||||
|
*/
|
||||||
bool writeLight(const COLLADAFW::Light *);
|
bool writeLight(const COLLADAFW::Light *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When this method is called, the writer must write the skin controller data.
|
||||||
|
* \return The writer should return true, if writing succeeded, false otherwise.
|
||||||
|
*/
|
||||||
bool writeSkinControllerData(const COLLADAFW::SkinControllerData *);
|
bool writeSkinControllerData(const COLLADAFW::SkinControllerData *);
|
||||||
|
|
||||||
|
/** This is called on post-process, before writeVisualScenes. */
|
||||||
bool writeController(const COLLADAFW::Controller *);
|
bool writeController(const COLLADAFW::Controller *);
|
||||||
|
|
||||||
bool writeFormulas(const COLLADAFW::Formulas *);
|
bool writeFormulas(const COLLADAFW::Formulas *);
|
||||||
|
|||||||
@@ -324,7 +324,6 @@ std::string GeometryExporter::makeVertexColorSourceId(std::string &geom_id, char
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* powerful because it handles both cases when there is material and when there's not */
|
|
||||||
void GeometryExporter::create_mesh_primitive_list(short material_index,
|
void GeometryExporter::create_mesh_primitive_list(short material_index,
|
||||||
bool has_uvs,
|
bool has_uvs,
|
||||||
bool has_color,
|
bool has_color,
|
||||||
@@ -441,7 +440,6 @@ void GeometryExporter::create_mesh_primitive_list(short material_index,
|
|||||||
finish_and_delete_primitive_List(is_triangulated, primitive_list);
|
finish_and_delete_primitive_List(is_triangulated, primitive_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* creates <source> for positions */
|
|
||||||
void GeometryExporter::createVertsSource(std::string geom_id, Mesh *me)
|
void GeometryExporter::createVertsSource(std::string geom_id, Mesh *me)
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
@@ -542,7 +540,6 @@ std::string GeometryExporter::makeTexcoordSourceId(std::string &geom_id,
|
|||||||
return getIdBySemantics(geom_id, COLLADASW::InputSemantic::TEXCOORD) + suffix;
|
return getIdBySemantics(geom_id, COLLADASW::InputSemantic::TEXCOORD) + suffix;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* creates <source> for texcoords */
|
|
||||||
void GeometryExporter::createTexcoordsSource(std::string geom_id, Mesh *me)
|
void GeometryExporter::createTexcoordsSource(std::string geom_id, Mesh *me)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -593,7 +590,6 @@ bool operator<(const Normal &a, const Normal &b)
|
|||||||
return a.x < b.x || (a.x == b.x && (a.y < b.y || (a.y == b.y && a.z < b.z)));
|
return a.x < b.x || (a.x == b.x && (a.y < b.y || (a.y == b.y && a.z < b.z)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* creates <source> for normals */
|
|
||||||
void GeometryExporter::createNormalsSource(std::string geom_id, Mesh *me, std::vector<Normal> &nor)
|
void GeometryExporter::createNormalsSource(std::string geom_id, Mesh *me, std::vector<Normal> &nor)
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ class GeometryExporter : COLLADASW::LibraryGeometries {
|
|||||||
|
|
||||||
void createLooseEdgeList(Object *ob, Mesh *me, std::string &geom_id);
|
void createLooseEdgeList(Object *ob, Mesh *me, std::string &geom_id);
|
||||||
|
|
||||||
/* powerful because it handles both cases when there is material and when there's not */
|
/** Powerful because it handles both cases when there is material and when there's not. */
|
||||||
void create_mesh_primitive_list(short material_index,
|
void create_mesh_primitive_list(short material_index,
|
||||||
bool has_uvs,
|
bool has_uvs,
|
||||||
bool has_color,
|
bool has_color,
|
||||||
@@ -81,17 +81,17 @@ class GeometryExporter : COLLADASW::LibraryGeometries {
|
|||||||
std::string &geom_id,
|
std::string &geom_id,
|
||||||
std::vector<BCPolygonNormalsIndices> &norind);
|
std::vector<BCPolygonNormalsIndices> &norind);
|
||||||
|
|
||||||
/* creates <source> for positions */
|
/** Creates <source> for positions. */
|
||||||
void createVertsSource(std::string geom_id, Mesh *me);
|
void createVertsSource(std::string geom_id, Mesh *me);
|
||||||
|
|
||||||
void createVertexColorSource(std::string geom_id, Mesh *me);
|
void createVertexColorSource(std::string geom_id, Mesh *me);
|
||||||
|
|
||||||
std::string makeTexcoordSourceId(std::string &geom_id, int layer_index, bool is_single_layer);
|
std::string makeTexcoordSourceId(std::string &geom_id, int layer_index, bool is_single_layer);
|
||||||
|
|
||||||
/* creates <source> for texcoords */
|
/** Creates <source> for texcoords. */
|
||||||
void createTexcoordsSource(std::string geom_id, Mesh *me);
|
void createTexcoordsSource(std::string geom_id, Mesh *me);
|
||||||
|
|
||||||
/* creates <source> for normals */
|
/** Creates <source> for normals. */
|
||||||
void createNormalsSource(std::string geom_id, Mesh *me, std::vector<Normal> &nor);
|
void createNormalsSource(std::string geom_id, Mesh *me, std::vector<Normal> &nor);
|
||||||
|
|
||||||
void create_normals(std::vector<Normal> &nor,
|
void create_normals(std::vector<Normal> &nor,
|
||||||
|
|||||||
@@ -91,7 +91,6 @@ void MaterialNode::setShaderType()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* returns null if material already has a node tree */
|
|
||||||
bNodeTree *MaterialNode::prepare_material_nodetree()
|
bNodeTree *MaterialNode::prepare_material_nodetree()
|
||||||
{
|
{
|
||||||
if (material->nodetree) {
|
if (material->nodetree) {
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ class MaterialNode {
|
|||||||
bNode *shader_node;
|
bNode *shader_node;
|
||||||
bNode *output_node;
|
bNode *output_node;
|
||||||
|
|
||||||
|
/** Returns null if material already has a node tree. */
|
||||||
bNodeTree *prepare_material_nodetree();
|
bNodeTree *prepare_material_nodetree();
|
||||||
bNode *add_node(int node_type, int locx, int locy, std::string label);
|
bNode *add_node(int node_type, int locx, int locy, std::string label);
|
||||||
void add_link(bNode *from_node, int from_index, bNode *to_node, int to_index);
|
void add_link(bNode *from_node, int from_index, bNode *to_node, int to_index);
|
||||||
|
|||||||
@@ -267,7 +267,6 @@ void MeshImporter::print_index_list(COLLADAFW::IndexList &index_list)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* checks if mesh has supported primitive types: lines, polylist, triangles, triangle_fans */
|
|
||||||
bool MeshImporter::is_nice_mesh(COLLADAFW::Mesh *mesh)
|
bool MeshImporter::is_nice_mesh(COLLADAFW::Mesh *mesh)
|
||||||
{
|
{
|
||||||
COLLADAFW::MeshPrimitiveArray &prim_arr = mesh->getMeshPrimitives();
|
COLLADAFW::MeshPrimitiveArray &prim_arr = mesh->getMeshPrimitives();
|
||||||
@@ -356,12 +355,6 @@ void MeshImporter::read_vertices(COLLADAFW::Mesh *mesh, Mesh *me)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* =====================================================================
|
|
||||||
* condition 1: The Primitive has normals
|
|
||||||
* condition 2: The number of normals equals the number of faces.
|
|
||||||
* return true if both conditions apply.
|
|
||||||
* return false otherwise.
|
|
||||||
* ===================================================================== */
|
|
||||||
bool MeshImporter::primitive_has_useable_normals(COLLADAFW::MeshPrimitive *mp)
|
bool MeshImporter::primitive_has_useable_normals(COLLADAFW::MeshPrimitive *mp)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -385,10 +378,6 @@ bool MeshImporter::primitive_has_useable_normals(COLLADAFW::MeshPrimitive *mp)
|
|||||||
return has_useable_normals;
|
return has_useable_normals;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* =====================================================================
|
|
||||||
* Assume that only TRIANGLES, TRIANGLE_FANS, POLYLIST and POLYGONS
|
|
||||||
* have faces. (to be verified)
|
|
||||||
* ===================================================================== */
|
|
||||||
bool MeshImporter::primitive_has_faces(COLLADAFW::MeshPrimitive *mp)
|
bool MeshImporter::primitive_has_faces(COLLADAFW::MeshPrimitive *mp)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -420,12 +409,6 @@ static std::string extract_vcolname(const COLLADAFW::String &collada_id)
|
|||||||
return colname;
|
return colname;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* =================================================================
|
|
||||||
* Return the number of faces by summing up
|
|
||||||
* the face-counts of the parts.
|
|
||||||
* hint: This is done because `mesh->getFacesCount()` does
|
|
||||||
* count loose edges as extra faces, which is not what we want here.
|
|
||||||
* ================================================================= */
|
|
||||||
void MeshImporter::allocate_poly_data(COLLADAFW::Mesh *collada_mesh, Mesh *me)
|
void MeshImporter::allocate_poly_data(COLLADAFW::Mesh *collada_mesh, Mesh *me)
|
||||||
{
|
{
|
||||||
COLLADAFW::MeshPrimitiveArray &prim_arr = collada_mesh->getMeshPrimitives();
|
COLLADAFW::MeshPrimitiveArray &prim_arr = collada_mesh->getMeshPrimitives();
|
||||||
@@ -554,13 +537,6 @@ unsigned int MeshImporter::get_loose_edge_count(COLLADAFW::Mesh *mesh)
|
|||||||
return loose_edge_count;
|
return loose_edge_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* =================================================================
|
|
||||||
* This function is copied from source/blender/editors/mesh/mesh_data.c
|
|
||||||
*
|
|
||||||
* TODO: (As discussed with sergey-) :
|
|
||||||
* Maybe move this function to blenderkernel/intern/mesh.c
|
|
||||||
* and add definition to BKE_mesh.c
|
|
||||||
* ================================================================= */
|
|
||||||
void MeshImporter::mesh_add_edges(Mesh *mesh, int len)
|
void MeshImporter::mesh_add_edges(Mesh *mesh, int len)
|
||||||
{
|
{
|
||||||
CustomData edata;
|
CustomData edata;
|
||||||
@@ -594,12 +570,6 @@ void MeshImporter::mesh_add_edges(Mesh *mesh, int len)
|
|||||||
mesh->totedge = totedge;
|
mesh->totedge = totedge;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* =================================================================
|
|
||||||
* Read all loose edges.
|
|
||||||
* Important: This function assumes that all edges from existing
|
|
||||||
* faces have already been generated and added to me->medge
|
|
||||||
* So this function MUST be called after read_faces() (see below)
|
|
||||||
* ================================================================= */
|
|
||||||
void MeshImporter::read_lines(COLLADAFW::Mesh *mesh, Mesh *me)
|
void MeshImporter::read_lines(COLLADAFW::Mesh *mesh, Mesh *me)
|
||||||
{
|
{
|
||||||
unsigned int loose_edge_count = get_loose_edge_count(mesh);
|
unsigned int loose_edge_count = get_loose_edge_count(mesh);
|
||||||
@@ -633,13 +603,6 @@ void MeshImporter::read_lines(COLLADAFW::Mesh *mesh, Mesh *me)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* =======================================================================
|
|
||||||
* Read all faces from TRIANGLES, TRIANGLE_FANS, POLYLIST, POLYGON
|
|
||||||
* Important: This function MUST be called before read_lines()
|
|
||||||
* Otherwise we will lose all edges from faces (see read_lines() above)
|
|
||||||
*
|
|
||||||
* TODO: import uv set names
|
|
||||||
* ======================================================================== */
|
|
||||||
void MeshImporter::read_polys(COLLADAFW::Mesh *collada_mesh, Mesh *me)
|
void MeshImporter::read_polys(COLLADAFW::Mesh *collada_mesh, Mesh *me)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
@@ -965,11 +928,6 @@ static void bc_remove_materials_from_object(Object *ob, Mesh *me)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the list of Users of the given Mesh object.
|
|
||||||
* NOTE: This function uses the object user flag to control
|
|
||||||
* which objects have already been processed.
|
|
||||||
*/
|
|
||||||
std::vector<Object *> MeshImporter::get_all_users_of(Mesh *reference_mesh)
|
std::vector<Object *> MeshImporter::get_all_users_of(Mesh *reference_mesh)
|
||||||
{
|
{
|
||||||
std::vector<Object *> mesh_users;
|
std::vector<Object *> mesh_users;
|
||||||
@@ -985,24 +943,6 @@ std::vector<Object *> MeshImporter::get_all_users_of(Mesh *reference_mesh)
|
|||||||
return mesh_users;
|
return mesh_users;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* During import all materials have been assigned to Object.
|
|
||||||
* Now we iterate over the imported objects and optimize
|
|
||||||
* the assignments as follows:
|
|
||||||
*
|
|
||||||
* for each imported geometry:
|
|
||||||
* if number of users is 1:
|
|
||||||
* get the user (object)
|
|
||||||
* move the materials from Object to Data
|
|
||||||
* else:
|
|
||||||
* determine which materials are assigned to the first user
|
|
||||||
* check if all other users have the same materials in the same order
|
|
||||||
* if the check is positive:
|
|
||||||
* Add the materials of the first user to the geometry
|
|
||||||
* adjust all other users accordingly.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void MeshImporter::optimize_material_assignements()
|
void MeshImporter::optimize_material_assignements()
|
||||||
{
|
{
|
||||||
for (Object *ob : imported_objects) {
|
for (Object *ob : imported_objects) {
|
||||||
@@ -1035,14 +975,6 @@ void MeshImporter::optimize_material_assignements()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* We do not know in advance which objects will share geometries.
|
|
||||||
* And we do not know either if the objects which share geometries
|
|
||||||
* come along with different materials. So we first create the objects
|
|
||||||
* and assign the materials to Object, then in a later cleanup we decide
|
|
||||||
* which materials shall be moved to the created geometries. Also see
|
|
||||||
* optimize_material_assignements() above.
|
|
||||||
*/
|
|
||||||
void MeshImporter::assign_material_to_geom(
|
void MeshImporter::assign_material_to_geom(
|
||||||
COLLADAFW::MaterialBinding cmaterial,
|
COLLADAFW::MaterialBinding cmaterial,
|
||||||
std::map<COLLADAFW::UniqueId, Material *> &uid_material_map,
|
std::map<COLLADAFW::UniqueId, Material *> &uid_material_map,
|
||||||
@@ -1165,7 +1097,6 @@ Object *MeshImporter::create_mesh_object(
|
|||||||
return ob;
|
return ob;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* create a mesh storing a pointer in a map so it can be retrieved later by geometry UID */
|
|
||||||
bool MeshImporter::write_geometry(const COLLADAFW::Geometry *geom)
|
bool MeshImporter::write_geometry(const COLLADAFW::Geometry *geom)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|||||||
@@ -122,23 +122,60 @@ class MeshImporter : public MeshImporterBase {
|
|||||||
void print_index_list(COLLADAFW::IndexList &index_list);
|
void print_index_list(COLLADAFW::IndexList &index_list);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/** Checks if mesh has supported primitive types: lines, polylist, triangles, triangle_fans. */
|
||||||
bool is_nice_mesh(COLLADAFW::Mesh *mesh);
|
bool is_nice_mesh(COLLADAFW::Mesh *mesh);
|
||||||
|
|
||||||
void read_vertices(COLLADAFW::Mesh *mesh, Mesh *me);
|
void read_vertices(COLLADAFW::Mesh *mesh, Mesh *me);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Condition 1: The Primitive has normals
|
||||||
|
* condition 2: The number of normals equals the number of faces.
|
||||||
|
* return true if both conditions apply.
|
||||||
|
* return false otherwise.
|
||||||
|
*/
|
||||||
bool primitive_has_useable_normals(COLLADAFW::MeshPrimitive *mp);
|
bool primitive_has_useable_normals(COLLADAFW::MeshPrimitive *mp);
|
||||||
|
/**
|
||||||
|
* Assume that only TRIANGLES, TRIANGLE_FANS, POLYLIST and POLYGONS
|
||||||
|
* have faces. (to be verified).
|
||||||
|
*/
|
||||||
bool primitive_has_faces(COLLADAFW::MeshPrimitive *mp);
|
bool primitive_has_faces(COLLADAFW::MeshPrimitive *mp);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function is copied from source/blender/editors/mesh/mesh_data.c
|
||||||
|
*
|
||||||
|
* TODO: (As discussed with sergey-) :
|
||||||
|
* Maybe move this function to blenderkernel/intern/mesh.c
|
||||||
|
* and add definition to BKE_mesh.c.
|
||||||
|
*/
|
||||||
static void mesh_add_edges(Mesh *mesh, int len);
|
static void mesh_add_edges(Mesh *mesh, int len);
|
||||||
|
|
||||||
unsigned int get_loose_edge_count(COLLADAFW::Mesh *mesh);
|
unsigned int get_loose_edge_count(COLLADAFW::Mesh *mesh);
|
||||||
|
|
||||||
CustomData create_edge_custom_data(EdgeHash *eh);
|
CustomData create_edge_custom_data(EdgeHash *eh);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the number of faces by summing up
|
||||||
|
* the face-counts of the parts.
|
||||||
|
* hint: This is done because `mesh->getFacesCount()` does
|
||||||
|
* count loose edges as extra faces, which is not what we want here.
|
||||||
|
*/
|
||||||
void allocate_poly_data(COLLADAFW::Mesh *collada_mesh, Mesh *me);
|
void allocate_poly_data(COLLADAFW::Mesh *collada_mesh, Mesh *me);
|
||||||
|
|
||||||
/* TODO: import uv set names */
|
/* TODO: import uv set names */
|
||||||
|
/**
|
||||||
|
* Read all faces from TRIANGLES, TRIANGLE_FANS, POLYLIST, POLYGON
|
||||||
|
* Important: This function MUST be called before read_lines()
|
||||||
|
* Otherwise we will lose all edges from faces (see read_lines() above)
|
||||||
|
*
|
||||||
|
* TODO: import uv set names.
|
||||||
|
*/
|
||||||
void read_polys(COLLADAFW::Mesh *mesh, Mesh *me);
|
void read_polys(COLLADAFW::Mesh *mesh, Mesh *me);
|
||||||
|
/**
|
||||||
|
* Read all loose edges.
|
||||||
|
* Important: This function assumes that all edges from existing
|
||||||
|
* faces have already been generated and added to me->medge
|
||||||
|
* So this function MUST be called after read_faces() (see below)
|
||||||
|
*/
|
||||||
void read_lines(COLLADAFW::Mesh *mesh, Mesh *me);
|
void read_lines(COLLADAFW::Mesh *mesh, Mesh *me);
|
||||||
unsigned int get_vertex_count(COLLADAFW::Polygons *mp, int index);
|
unsigned int get_vertex_count(COLLADAFW::Polygons *mp, int index);
|
||||||
|
|
||||||
@@ -146,6 +183,11 @@ class MeshImporter : public MeshImporterBase {
|
|||||||
|
|
||||||
bool is_flat_face(unsigned int *nind, COLLADAFW::MeshVertexData &nor, int count);
|
bool is_flat_face(unsigned int *nind, COLLADAFW::MeshVertexData &nor, int count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the list of Users of the given Mesh object.
|
||||||
|
* NOTE: This function uses the object user flag to control
|
||||||
|
* which objects have already been processed.
|
||||||
|
*/
|
||||||
std::vector<Object *> get_all_users_of(Mesh *reference_mesh);
|
std::vector<Object *> get_all_users_of(Mesh *reference_mesh);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -159,8 +201,34 @@ class MeshImporter : public MeshImporterBase {
|
|||||||
|
|
||||||
virtual Mesh *get_mesh_by_geom_uid(const COLLADAFW::UniqueId &geom_uid);
|
virtual Mesh *get_mesh_by_geom_uid(const COLLADAFW::UniqueId &geom_uid);
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* During import all materials have been assigned to Object.
|
||||||
|
* Now we iterate over the imported objects and optimize
|
||||||
|
* the assignments as follows:
|
||||||
|
*
|
||||||
|
* for each imported geometry:
|
||||||
|
* if number of users is 1:
|
||||||
|
* get the user (object)
|
||||||
|
* move the materials from Object to Data
|
||||||
|
* else:
|
||||||
|
* determine which materials are assigned to the first user
|
||||||
|
* check if all other users have the same materials in the same order
|
||||||
|
* if the check is positive:
|
||||||
|
* Add the materials of the first user to the geometry
|
||||||
|
* adjust all other users accordingly.
|
||||||
|
*
|
||||||
|
*/
|
||||||
void optimize_material_assignements();
|
void optimize_material_assignements();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* We do not know in advance which objects will share geometries.
|
||||||
|
* And we do not know either if the objects which share geometries
|
||||||
|
* come along with different materials. So we first create the objects
|
||||||
|
* and assign the materials to Object, then in a later cleanup we decide
|
||||||
|
* which materials shall be moved to the created geometries. Also see
|
||||||
|
* optimize_material_assignements() above.
|
||||||
|
*/
|
||||||
void assign_material_to_geom(COLLADAFW::MaterialBinding cmaterial,
|
void assign_material_to_geom(COLLADAFW::MaterialBinding cmaterial,
|
||||||
std::map<COLLADAFW::UniqueId, Material *> &uid_material_map,
|
std::map<COLLADAFW::UniqueId, Material *> &uid_material_map,
|
||||||
Object *ob,
|
Object *ob,
|
||||||
@@ -172,7 +240,7 @@ class MeshImporter : public MeshImporterBase {
|
|||||||
bool isController,
|
bool isController,
|
||||||
std::map<COLLADAFW::UniqueId, Material *> &uid_material_map);
|
std::map<COLLADAFW::UniqueId, Material *> &uid_material_map);
|
||||||
|
|
||||||
/* create a mesh storing a pointer in a map so it can be retrieved later by geometry UID */
|
/** Create a mesh storing a pointer in a map so it can be retrieved later by geometry UID. */
|
||||||
bool write_geometry(const COLLADAFW::Geometry *geom);
|
bool write_geometry(const COLLADAFW::Geometry *geom);
|
||||||
std::string *get_geometry_name(const std::string &mesh_name);
|
std::string *get_geometry_name(const std::string &mesh_name);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -53,9 +53,6 @@ template<class T> static const char *bc_get_joint_name(T *node)
|
|||||||
return id.empty() ? node->getOriginalId().c_str() : id.c_str();
|
return id.empty() ? node->getOriginalId().c_str() : id.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is used to store data passed in write_controller_data.
|
|
||||||
* Arrays from COLLADAFW::SkinControllerData lose ownership, so do this class members
|
|
||||||
* so that arrays don't get freed until we free them explicitly. */
|
|
||||||
SkinInfo::SkinInfo() = default;
|
SkinInfo::SkinInfo() = default;
|
||||||
|
|
||||||
SkinInfo::SkinInfo(const SkinInfo &skin)
|
SkinInfo::SkinInfo(const SkinInfo &skin)
|
||||||
@@ -77,7 +74,6 @@ SkinInfo::SkinInfo(UnitConverter *conv) : unit_converter(conv), ob_arm(nullptr),
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
/* nobody owns the data after this, so it should be freed manually with releaseMemory */
|
|
||||||
template<class T> void SkinInfo::transfer_array_data(T &src, T &dest)
|
template<class T> void SkinInfo::transfer_array_data(T &src, T &dest)
|
||||||
{
|
{
|
||||||
dest.setData(src.getData(), src.getCount());
|
dest.setData(src.getData(), src.getCount());
|
||||||
@@ -85,7 +81,6 @@ template<class T> void SkinInfo::transfer_array_data(T &src, T &dest)
|
|||||||
dest.yieldOwnerShip();
|
dest.yieldOwnerShip();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* when src is const we cannot src.yieldOwnerShip, this is used by copy constructor */
|
|
||||||
void SkinInfo::transfer_int_array_data_const(const COLLADAFW::IntValuesArray &src,
|
void SkinInfo::transfer_int_array_data_const(const COLLADAFW::IntValuesArray &src,
|
||||||
COLLADAFW::IntValuesArray &dest)
|
COLLADAFW::IntValuesArray &dest)
|
||||||
{
|
{
|
||||||
@@ -124,9 +119,6 @@ void SkinInfo::free()
|
|||||||
// weights.releaseMemory();
|
// weights.releaseMemory();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* using inverse bind matrices to construct armature
|
|
||||||
* it is safe to invert them to get the original matrices
|
|
||||||
* because if they are inverse matrices, they can be inverted */
|
|
||||||
void SkinInfo::add_joint(const COLLADABU::Math::Matrix4 &matrix)
|
void SkinInfo::add_joint(const COLLADABU::Math::Matrix4 &matrix)
|
||||||
{
|
{
|
||||||
JointData jd;
|
JointData jd;
|
||||||
@@ -152,7 +144,6 @@ void SkinInfo::set_controller(const COLLADAFW::SkinController *co)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* called from write_controller */
|
|
||||||
Object *SkinInfo::create_armature(Main *bmain, Scene *scene, ViewLayer *view_layer)
|
Object *SkinInfo::create_armature(Main *bmain, Scene *scene, ViewLayer *view_layer)
|
||||||
{
|
{
|
||||||
ob_arm = bc_add_object(bmain, scene, view_layer, OB_ARMATURE, nullptr);
|
ob_arm = bc_add_object(bmain, scene, view_layer, OB_ARMATURE, nullptr);
|
||||||
@@ -193,11 +184,6 @@ const COLLADAFW::UniqueId &SkinInfo::get_controller_uid()
|
|||||||
return controller_uid;
|
return controller_uid;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check if this skin controller references a joint or any descendant of it
|
|
||||||
*
|
|
||||||
* some nodes may not be referenced by SkinController,
|
|
||||||
* in this case to determine if the node belongs to this armature,
|
|
||||||
* we need to search down the tree */
|
|
||||||
bool SkinInfo::uses_joint_or_descendant(COLLADAFW::Node *node)
|
bool SkinInfo::uses_joint_or_descendant(COLLADAFW::Node *node)
|
||||||
{
|
{
|
||||||
const COLLADAFW::UniqueId &uid = node->getUniqueId();
|
const COLLADAFW::UniqueId &uid = node->getUniqueId();
|
||||||
|
|||||||
@@ -35,9 +35,11 @@
|
|||||||
#include "TransformReader.h"
|
#include "TransformReader.h"
|
||||||
#include "collada_internal.h"
|
#include "collada_internal.h"
|
||||||
|
|
||||||
/* This is used to store data passed in write_controller_data.
|
/**
|
||||||
* Arrays from COLLADAFW::SkinControllerData lose ownership, so do this class members
|
* This is used to store data passed in write_controller_data.
|
||||||
* so that arrays don't get freed until we free them explicitly. */
|
* Arrays from #COLLADAFW::SkinControllerData lose ownership, so do this class members
|
||||||
|
* so that arrays don't get freed until we free them explicitly.
|
||||||
|
*/
|
||||||
class SkinInfo {
|
class SkinInfo {
|
||||||
private:
|
private:
|
||||||
/* to build armature bones from inverse bind matrices */
|
/* to build armature bones from inverse bind matrices */
|
||||||
@@ -69,10 +71,10 @@ class SkinInfo {
|
|||||||
SkinInfo(const SkinInfo &skin);
|
SkinInfo(const SkinInfo &skin);
|
||||||
SkinInfo(UnitConverter *conv);
|
SkinInfo(UnitConverter *conv);
|
||||||
|
|
||||||
/* nobody owns the data after this, so it should be freed manually with releaseMemory */
|
/** Nobody owns the data after this, so it should be freed manually with releaseMemory. */
|
||||||
template<typename T> void transfer_array_data(T &src, T &dest);
|
template<typename T> void transfer_array_data(T &src, T &dest);
|
||||||
|
|
||||||
/* when src is const we cannot src.yieldOwnerShip, this is used by copy constructor */
|
/** When src is const we cannot `src.yieldOwnerShip`, this is used by copy constructor. */
|
||||||
void transfer_int_array_data_const(const COLLADAFW::IntValuesArray &src,
|
void transfer_int_array_data_const(const COLLADAFW::IntValuesArray &src,
|
||||||
COLLADAFW::IntValuesArray &dest);
|
COLLADAFW::IntValuesArray &dest);
|
||||||
|
|
||||||
@@ -83,14 +85,16 @@ class SkinInfo {
|
|||||||
|
|
||||||
void free();
|
void free();
|
||||||
|
|
||||||
/* using inverse bind matrices to construct armature
|
/**
|
||||||
|
* Using inverse bind matrices to construct armature
|
||||||
* it is safe to invert them to get the original matrices
|
* it is safe to invert them to get the original matrices
|
||||||
* because if they are inverse matrices, they can be inverted */
|
* because if they are inverse matrices, they can be inverted.
|
||||||
|
*/
|
||||||
void add_joint(const COLLADABU::Math::Matrix4 &matrix);
|
void add_joint(const COLLADABU::Math::Matrix4 &matrix);
|
||||||
|
|
||||||
void set_controller(const COLLADAFW::SkinController *co);
|
void set_controller(const COLLADAFW::SkinController *co);
|
||||||
|
|
||||||
/* called from write_controller */
|
/** Called from write_controller. */
|
||||||
Object *create_armature(Main *bmain, Scene *scene, ViewLayer *view_layer);
|
Object *create_armature(Main *bmain, Scene *scene, ViewLayer *view_layer);
|
||||||
|
|
||||||
Object *set_armature(Object *ob_arm);
|
Object *set_armature(Object *ob_arm);
|
||||||
@@ -101,11 +105,13 @@ class SkinInfo {
|
|||||||
|
|
||||||
const COLLADAFW::UniqueId &get_controller_uid();
|
const COLLADAFW::UniqueId &get_controller_uid();
|
||||||
|
|
||||||
/* check if this skin controller references a joint or any descendant of it
|
/**
|
||||||
|
* Check if this skin controller references a joint or any descendant of it
|
||||||
*
|
*
|
||||||
* some nodes may not be referenced by SkinController,
|
* some nodes may not be referenced by SkinController,
|
||||||
* in this case to determine if the node belongs to this armature,
|
* in this case to determine if the node belongs to this armature,
|
||||||
* we need to search down the tree */
|
* we need to search down the tree.
|
||||||
|
*/
|
||||||
bool uses_joint_or_descendant(COLLADAFW::Node *node);
|
bool uses_joint_or_descendant(COLLADAFW::Node *node);
|
||||||
|
|
||||||
void link_armature(bContext *C,
|
void link_armature(bContext *C,
|
||||||
|
|||||||
@@ -213,7 +213,6 @@ void clear_global_id_map()
|
|||||||
global_id_map.clear();
|
global_id_map.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Look at documentation of translate_map */
|
|
||||||
std::string translate_id(const char *idString)
|
std::string translate_id(const char *idString)
|
||||||
{
|
{
|
||||||
std::string id = std::string(idString);
|
std::string id = std::string(idString);
|
||||||
|
|||||||
@@ -76,6 +76,7 @@ class UnitConverter {
|
|||||||
extern void clear_global_id_map();
|
extern void clear_global_id_map();
|
||||||
/** Look at documentation of translate_map */
|
/** Look at documentation of translate_map */
|
||||||
extern std::string translate_id(const std::string &id);
|
extern std::string translate_id(const std::string &id);
|
||||||
|
/** Look at documentation of translate_map */
|
||||||
extern std::string translate_id(const char *idString);
|
extern std::string translate_id(const char *idString);
|
||||||
|
|
||||||
extern std::string id_name(void *id);
|
extern std::string id_name(void *id);
|
||||||
|
|||||||
@@ -92,9 +92,10 @@ float bc_get_float_value(const COLLADAFW::FloatOrDoubleArray &array, unsigned in
|
|||||||
return array.getDoubleValues()->getData()[index];
|
return array.getDoubleValues()->getData()[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* copied from /editors/object/object_relations.c */
|
|
||||||
int bc_test_parent_loop(Object *par, Object *ob)
|
int bc_test_parent_loop(Object *par, Object *ob)
|
||||||
{
|
{
|
||||||
|
/* Copied from /editors/object/object_relations.c */
|
||||||
|
|
||||||
/* test if 'ob' is a parent somewhere in par's parents */
|
/* test if 'ob' is a parent somewhere in par's parents */
|
||||||
|
|
||||||
if (par == nullptr) {
|
if (par == nullptr) {
|
||||||
@@ -289,9 +290,10 @@ bool bc_has_object_type(LinkNode *export_set, short obtype)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Use bubble sort algorithm for sorting the export set */
|
|
||||||
void bc_bubble_sort_by_Object_name(LinkNode *export_set)
|
void bc_bubble_sort_by_Object_name(LinkNode *export_set)
|
||||||
{
|
{
|
||||||
|
/* Use bubble sort algorithm for sorting the export set. */
|
||||||
|
|
||||||
bool sorted = false;
|
bool sorted = false;
|
||||||
LinkNode *node;
|
LinkNode *node;
|
||||||
for (node = export_set; node->next && !sorted; node = node->next) {
|
for (node = export_set; node->next && !sorted; node = node->next) {
|
||||||
@@ -312,11 +314,6 @@ void bc_bubble_sort_by_Object_name(LinkNode *export_set)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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.
|
|
||||||
*/
|
|
||||||
bool bc_is_root_bone(Bone *aBone, bool deform_bones_only)
|
bool bc_is_root_bone(Bone *aBone, bool deform_bones_only)
|
||||||
{
|
{
|
||||||
if (deform_bones_only) {
|
if (deform_bones_only) {
|
||||||
@@ -386,9 +383,6 @@ void bc_match_scale(std::vector<Object *> *objects_done,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Convenience function to get only the needed components of a matrix
|
|
||||||
*/
|
|
||||||
void bc_decompose(float mat[4][4], float *loc, float eul[3], float quat[4], float *size)
|
void bc_decompose(float mat[4][4], float *loc, float eul[3], float quat[4], float *size)
|
||||||
{
|
{
|
||||||
if (size) {
|
if (size) {
|
||||||
@@ -408,17 +402,6 @@ void bc_decompose(float mat[4][4], float *loc, float eul[3], float quat[4], floa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* 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)
|
|
||||||
*/
|
|
||||||
void bc_rotate_from_reference_quat(float quat_to[4], float quat_from[4], float mat_to[4][4])
|
void bc_rotate_from_reference_quat(float quat_to[4], float quat_from[4], float mat_to[4][4])
|
||||||
{
|
{
|
||||||
float qd[4];
|
float qd[4];
|
||||||
@@ -457,9 +440,6 @@ void bc_triangulate_mesh(Mesh *me)
|
|||||||
BM_mesh_free(bm);
|
BM_mesh_free(bm);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* A bone is a leaf when it has no children or all children are not connected.
|
|
||||||
*/
|
|
||||||
bool bc_is_leaf_bone(Bone *bone)
|
bool bc_is_leaf_bone(Bone *bone)
|
||||||
{
|
{
|
||||||
for (Bone *child = (Bone *)bone->childbase.first; child; child = child->next) {
|
for (Bone *child = (Bone *)bone->childbase.first; child; child = child->next) {
|
||||||
@@ -501,11 +481,6 @@ int bc_set_layer(int bitfield, int layer, bool enable)
|
|||||||
return bitfield;
|
return bitfield;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This method creates a new extension map when needed.
|
|
||||||
* \note The ~BoneExtensionManager destructor takes care
|
|
||||||
* to delete the created maps when the manager is removed.
|
|
||||||
*/
|
|
||||||
BoneExtensionMap &BoneExtensionManager::getExtensionMap(bArmature *armature)
|
BoneExtensionMap &BoneExtensionManager::getExtensionMap(bArmature *armature)
|
||||||
{
|
{
|
||||||
std::string key = armature->id.name;
|
std::string key = armature->id.name;
|
||||||
@@ -697,9 +672,6 @@ int BoneExtended::get_use_connect()
|
|||||||
return this->use_connect;
|
return this->use_connect;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Stores a 4*4 matrix as a custom bone property array of size 16
|
|
||||||
*/
|
|
||||||
void bc_set_IDPropertyMatrix(EditBone *ebone, const char *key, float mat[4][4])
|
void bc_set_IDPropertyMatrix(EditBone *ebone, const char *key, float mat[4][4])
|
||||||
{
|
{
|
||||||
IDProperty *idgroup = (IDProperty *)ebone->prop;
|
IDProperty *idgroup = (IDProperty *)ebone->prop;
|
||||||
@@ -745,19 +717,11 @@ static void bc_set_IDProperty(EditBone *ebone, const char *key, float value)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a custom property when it exists.
|
|
||||||
* This function is also used to check if a property exists.
|
|
||||||
*/
|
|
||||||
IDProperty *bc_get_IDProperty(Bone *bone, std::string key)
|
IDProperty *bc_get_IDProperty(Bone *bone, std::string key)
|
||||||
{
|
{
|
||||||
return (bone->prop == nullptr) ? nullptr : IDP_GetPropertyFromGroup(bone->prop, key.c_str());
|
return (bone->prop == nullptr) ? nullptr : IDP_GetPropertyFromGroup(bone->prop, key.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Read a custom bone property and convert to float
|
|
||||||
* Return def if the property does not exist.
|
|
||||||
*/
|
|
||||||
float bc_get_property(Bone *bone, std::string key, float def)
|
float bc_get_property(Bone *bone, std::string key, float def)
|
||||||
{
|
{
|
||||||
float result = def;
|
float result = def;
|
||||||
@@ -780,14 +744,6 @@ float bc_get_property(Bone *bone, std::string key, float def)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 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
|
|
||||||
*/
|
|
||||||
bool bc_get_property_matrix(Bone *bone, std::string key, float mat[4][4])
|
bool bc_get_property_matrix(Bone *bone, std::string key, float mat[4][4])
|
||||||
{
|
{
|
||||||
IDProperty *property = bc_get_IDProperty(bone, key);
|
IDProperty *property = bc_get_IDProperty(bone, key);
|
||||||
@@ -803,9 +759,6 @@ bool bc_get_property_matrix(Bone *bone, std::string key, float mat[4][4])
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* get a vector that is stored in 3 custom properties (used in Blender <= 2.78)
|
|
||||||
*/
|
|
||||||
void bc_get_property_vector(Bone *bone, std::string key, float val[3], const float def[3])
|
void bc_get_property_vector(Bone *bone, std::string key, float val[3], const float def[3])
|
||||||
{
|
{
|
||||||
val[0] = bc_get_property(bone, key + "_x", def[0]);
|
val[0] = bc_get_property(bone, key + "_x", def[0]);
|
||||||
@@ -1014,12 +967,6 @@ void bc_apply_global_transform(Vector &to_vec, const BCMatrix &global_transform,
|
|||||||
mul_v3_m4v3(to_vec, transform, to_vec);
|
mul_v3_m4v3(to_vec, transform, to_vec);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 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
|
|
||||||
*/
|
|
||||||
void bc_create_restpose_mat(BCExportSettings &export_settings,
|
void bc_create_restpose_mat(BCExportSettings &export_settings,
|
||||||
Bone *bone,
|
Bone *bone,
|
||||||
float to_mat[4][4],
|
float to_mat[4][4],
|
||||||
|
|||||||
@@ -143,6 +143,12 @@ extern char *bc_CustomData_get_layer_name(const CustomData *data, int type, int
|
|||||||
extern char *bc_CustomData_get_active_layer_name(const CustomData *data, int type);
|
extern char *bc_CustomData_get_active_layer_name(const CustomData *data, int type);
|
||||||
|
|
||||||
extern void bc_bubble_sort_by_Object_name(LinkNode *export_set);
|
extern void bc_bubble_sort_by_Object_name(LinkNode *export_set);
|
||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
extern bool bc_is_root_bone(Bone *aBone, bool deform_bones_only);
|
extern bool bc_is_root_bone(Bone *aBone, bool deform_bones_only);
|
||||||
extern int bc_get_active_UVLayer(Object *ob);
|
extern int bc_get_active_UVLayer(Object *ob);
|
||||||
|
|
||||||
@@ -200,12 +206,29 @@ extern void bc_match_scale(std::vector<Object *> *objects_done,
|
|||||||
UnitConverter &bc_unit,
|
UnitConverter &bc_unit,
|
||||||
bool scale_to_scene);
|
bool scale_to_scene);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convenience function to get only the needed components of a matrix.
|
||||||
|
*/
|
||||||
extern void bc_decompose(float mat[4][4], float *loc, float eul[3], float quat[4], float *size);
|
extern void bc_decompose(float mat[4][4], float *loc, float eul[3], float quat[4], float *size);
|
||||||
|
/**
|
||||||
|
* 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).
|
||||||
|
*/
|
||||||
extern void bc_rotate_from_reference_quat(float quat_to[4],
|
extern void bc_rotate_from_reference_quat(float quat_to[4],
|
||||||
float quat_from[4],
|
float quat_from[4],
|
||||||
float mat_to[4][4]);
|
float mat_to[4][4]);
|
||||||
|
|
||||||
extern void bc_triangulate_mesh(Mesh *me);
|
extern void bc_triangulate_mesh(Mesh *me);
|
||||||
|
/**
|
||||||
|
* A bone is a leaf when it has no children or all children are not connected.
|
||||||
|
*/
|
||||||
extern bool bc_is_leaf_bone(Bone *bone);
|
extern bool bc_is_leaf_bone(Bone *bone);
|
||||||
extern EditBone *bc_get_edit_bone(bArmature *armature, char *name);
|
extern EditBone *bc_get_edit_bone(bArmature *armature, char *name);
|
||||||
extern int bc_set_layer(int bitfield, int layer, bool enable);
|
extern int bc_set_layer(int bitfield, int layer, bool enable);
|
||||||
@@ -224,12 +247,34 @@ void bc_copy_v44_m4d(std::vector<std::vector<double>> &r, double (&a)[4][4]);
|
|||||||
void bc_sanitize_v3(double v[3], int precision);
|
void bc_sanitize_v3(double v[3], int precision);
|
||||||
void bc_sanitize_v3(float v[3], int precision);
|
void bc_sanitize_v3(float v[3], int precision);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a custom property when it exists.
|
||||||
|
* This function is also used to check if a property exists.
|
||||||
|
*/
|
||||||
extern IDProperty *bc_get_IDProperty(Bone *bone, std::string key);
|
extern IDProperty *bc_get_IDProperty(Bone *bone, std::string key);
|
||||||
extern void bc_set_IDProperty(EditBone *ebone, const char *key, float value);
|
extern void bc_set_IDProperty(EditBone *ebone, const char *key, float value);
|
||||||
|
/**
|
||||||
|
* Stores a 4*4 matrix as a custom bone property array of size 16.
|
||||||
|
*/
|
||||||
extern void bc_set_IDPropertyMatrix(EditBone *ebone, const char *key, float mat[4][4]);
|
extern void bc_set_IDPropertyMatrix(EditBone *ebone, const char *key, float mat[4][4]);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read a custom bone property and convert to float
|
||||||
|
* Return def if the property does not exist.
|
||||||
|
*/
|
||||||
extern float bc_get_property(Bone *bone, std::string key, float def);
|
extern float bc_get_property(Bone *bone, std::string key, float def);
|
||||||
|
/**
|
||||||
|
* Get a vector that is stored in 3 custom properties (used in Blender <= 2.78).
|
||||||
|
*/
|
||||||
extern void bc_get_property_vector(Bone *bone, std::string key, float val[3], const float def[3]);
|
extern void bc_get_property_vector(Bone *bone, std::string key, float val[3], const float def[3]);
|
||||||
|
/**
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
extern bool bc_get_property_matrix(Bone *bone, std::string key, float mat[4][4]);
|
extern bool bc_get_property_matrix(Bone *bone, std::string key, float mat[4][4]);
|
||||||
|
|
||||||
extern void bc_enable_fcurves(bAction *act, char *bone_name);
|
extern void bc_enable_fcurves(bAction *act, char *bone_name);
|
||||||
@@ -258,6 +303,12 @@ extern void bc_apply_global_transform(Matrix &to_mat,
|
|||||||
extern void bc_apply_global_transform(Vector &to_vec,
|
extern void bc_apply_global_transform(Vector &to_vec,
|
||||||
const BCMatrix &global_transform,
|
const BCMatrix &global_transform,
|
||||||
const bool invert = false);
|
const bool invert = false);
|
||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
extern void bc_create_restpose_mat(BCExportSettings &export_settings,
|
extern void bc_create_restpose_mat(BCExportSettings &export_settings,
|
||||||
Bone *bone,
|
Bone *bone,
|
||||||
float to_mat[4][4],
|
float to_mat[4][4],
|
||||||
@@ -364,6 +415,11 @@ class BoneExtensionManager {
|
|||||||
std::map<std::string, BoneExtensionMap *> extended_bone_maps;
|
std::map<std::string, BoneExtensionMap *> extended_bone_maps;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
/**
|
||||||
|
* This method creates a new extension map when needed.
|
||||||
|
* \note The ~BoneExtensionManager destructor takes care
|
||||||
|
* to delete the created maps when the manager is removed.
|
||||||
|
*/
|
||||||
BoneExtensionMap &getExtensionMap(bArmature *armature);
|
BoneExtensionMap &getExtensionMap(bArmature *armature);
|
||||||
~BoneExtensionManager();
|
~BoneExtensionManager();
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user