Blender V4.3
AnimationExporter.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
7#include <math.h>
8#include <stdio.h>
9#include <stdlib.h>
10
11#include "BCAnimationCurve.h"
12
13#include "DNA_action_types.h"
14#include "DNA_anim_types.h"
15#include "DNA_armature_types.h"
16#include "DNA_camera_types.h"
18#include "DNA_curve_types.h"
19#include "DNA_light_types.h"
20#include "DNA_material_types.h"
21#include "DNA_object_types.h"
22#include "DNA_scene_types.h"
23
24#include "BLI_listbase.h"
25#include "BLI_string.h"
26#include "BLI_utildefines.h"
27
28#include "BIK_api.h"
29#include "BKE_action.hh" /* pose functions */
30#include "BKE_armature.hh"
31#include "BKE_constraint.h"
32#include "BKE_fcurve.hh"
33#include "BKE_object.hh"
34#include "BKE_scene.hh"
35#include "ED_object.hh"
36
37#include "MEM_guardedalloc.h"
38
39#include "RNA_access.hh"
40
41#include "COLLADASWBaseInputElement.h"
42#include "COLLADASWConstants.h"
43#include "COLLADASWInputList.h"
44#include "COLLADASWInstanceGeometry.h"
45#include "COLLADASWLibraryAnimations.h"
46#include "COLLADASWParamBase.h"
47#include "COLLADASWParamTemplate.h"
48#include "COLLADASWPrimitves.h"
49#include "COLLADASWSampler.h"
50#include "COLLADASWSource.h"
51#include "COLLADASWVertices.h"
52
53#include "BCAnimationSampler.h"
54#include "EffectExporter.h"
55#include "collada_internal.h"
56
57#include "IK_solver.h"
58
59#include <algorithm> /* std::find */
60#include <map>
61#include <vector>
62
68
74
75class AnimationExporter : COLLADASW::LibraryAnimations {
76 private:
77 COLLADASW::StreamWriter *sw;
78 BCExportSettings &export_settings;
79
80 BC_global_rotation_type get_global_rotation_type(Object *ob);
81
82 public:
83 AnimationExporter(COLLADASW::StreamWriter *sw, BCExportSettings &export_settings)
84 : COLLADASW::LibraryAnimations(sw), sw(sw), export_settings(export_settings)
85 {
86 }
87
88 bool exportAnimations();
89
91 void operator()(Object *ob);
92
93 protected:
95
97
99
100 void write_bone_animation(Object *ob_arm, Bone *bone);
101
102 void sample_and_write_bone_animation(Object *ob_arm, Bone *bone, int transform_type);
103
105
106 void sample_animation(float *v,
107 std::vector<float> &frames,
108 int type,
109 Bone *bone,
110 Object *ob_arm,
111 bPoseChannel *pChan);
112
113 void sample_animation(std::vector<float[4][4]> &mats,
114 std::vector<float> &frames,
115 Bone *bone,
116 Object *ob_arm,
117 bPoseChannel *pChan);
118
119 /* dae_bone_animation -> add_bone_animation
120 * (blend this into dae_bone_animation) */
121 void dae_bone_animation(std::vector<float> &fra,
122 float *v,
123 int tm_type,
124 int axis,
125 std::string ob_name,
126 std::string bone_name);
127
128 void dae_baked_animation(std::vector<float> &fra, Object *ob_arm, Bone *bone);
129
130 void dae_baked_object_animation(std::vector<float> &fra, Object *ob);
131
132 float convert_time(float frame);
133
134 float convert_angle(float angle);
135
136 std::vector<std::vector<std::string>> anim_meta;
137
140
151 void export_curve_animation_set(Object *ob, BCAnimationSampler &sampler, bool export_as_matrix);
152
155
158
161
163 void export_bone_animation(Object *ob, Bone *bone, BCFrames &frames, BCMatrixSampleMap &samples);
164
166 void export_collada_curve_animation(std::string id,
167 std::string name,
168 std::string target,
169 std::string axis,
170 BCAnimationCurve &curve,
171 BC_global_rotation_type global_rotation_type);
172
174 void export_collada_matrix_animation(std::string id,
175 std::string name,
176 std::string target,
177 BCFrames &frames,
178 BCMatrixSampleMap &samples,
179 BC_global_rotation_type global_rotation_type,
180 Matrix &parentinv);
181
191 BCAnimationCurve &curve,
192 BCAnimationCurveMap &curves);
193
194 /* Helper functions. */
195
196 void openAnimationWithClip(std::string id, std::string name);
197 bool open_animation_container(bool has_container, Object *ob);
198 void close_animation_container(bool has_container);
199
202 COLLADASW::InputSemantic::Semantics semantic,
203 std::vector<float> &values,
204 const std::string &anim_id,
205 const std::string axis_name);
206
209 const std::string &anim_id,
210 BC_global_rotation_type global_rotation_type,
211 Matrix &parentinv);
212
214 std::string collada_linear_interpolation_source(int tot, const std::string &anim_id);
215
216 /* source ID = animation_name + semantic_suffix */
217
218 std::string get_semantic_suffix(COLLADASW::InputSemantic::Semantics semantic);
219
220 void add_source_parameters(COLLADASW::SourceBase::ParameterNameList &param,
221 COLLADASW::InputSemantic::Semantics semantic,
222 bool is_rot,
223 const std::string axis,
224 bool transform);
225
227 COLLADASW::InputSemantic::Semantics semantic,
228 bool is_angle,
229 float *values);
231 float sample_frame,
232 COLLADASW::InputSemantic::Semantics semantic,
233 bool is_angle,
234 float *values);
235
236 std::string collada_tangent_from_curve(COLLADASW::InputSemantic::Semantics semantic,
237 BCAnimationCurve &curve,
238 const std::string &anim_id,
239 const std::string axis_name);
240
241 std::string collada_interpolation_source(const BCAnimationCurve &curve,
242 const std::string &anim_id,
243 std::string axis_name,
244 bool *has_tangents);
245
246 std::string get_axis_name(std::string channel, int id);
247 std::string get_collada_name(std::string channel_type) const;
252 std::string get_collada_sid(const BCAnimationCurve &curve, const std::string axis_name);
253
254 /* ===================================== */
255 /* Currently unused or not (yet?) needed */
256 /* ===================================== */
257
258 bool is_bone_deform_group(Bone *bone);
259
260#if 0
261 BC_animation_transform_type _get_transform_type(const std::string path);
262 void get_eul_source_for_quat(std::vector<float> &cache, Object *ob);
263#endif
264
265#ifdef WITH_MORPH_ANIMATION
267#endif
268};
BC_animation_source_type
@ BC_SOURCE_TYPE_TIMEFRAME
@ BC_SOURCE_TYPE_VALUE
@ BC_SOURCE_TYPE_ANGLE
BC_global_rotation_type
@ BC_DATA_ROTATION
@ BC_OBJECT_ROTATION
@ BC_NO_ROTATION
std::map< BCCurveKey, BCAnimationCurve * > BCAnimationCurveMap
std::vector< float > BCFrames
std::map< int, const BCMatrix * > BCMatrixSampleMap
Blender kernel action and pose functionality.
General operations, lookup, etc. for blender objects.
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
ATTR_WARN_UNUSED_RESULT const BMVert * v
void export_collada_matrix_animation(std::string id, std::string name, std::string target, BCFrames &frames, BCMatrixSampleMap &samples, BC_global_rotation_type global_rotation_type, Matrix &parentinv)
std::string get_axis_name(std::string channel, int id)
std::string collada_interpolation_source(const BCAnimationCurve &curve, const std::string &anim_id, std::string axis_name, bool *has_tangents)
void add_source_parameters(COLLADASW::SourceBase::ParameterNameList &param, COLLADASW::InputSemantic::Semantics semantic, bool is_rot, const std::string axis, bool transform)
void close_animation_container(bool has_container)
void openAnimationWithClip(std::string id, std::string name)
void export_object_constraint_animation(Object *ob)
void write_bone_animation(Object *ob_arm, Bone *bone)
void sample_and_write_bone_animation_matrix(Object *ob_arm, Bone *bone)
bool open_animation_container(bool has_container, Object *ob)
void export_collada_curve_animation(std::string id, std::string name, std::string target, std::string axis, BCAnimationCurve &curve, BC_global_rotation_type global_rotation_type)
void exportAnimation(Object *ob, BCAnimationSampler &sampler)
float convert_angle(float angle)
void operator()(Object *ob)
void write_bone_animation_matrix(Object *ob_arm, Bone *bone)
void export_matrix_animation(Object *ob, BCAnimationSampler &sampler)
void export_curve_animation_set(Object *ob, BCAnimationSampler &sampler, bool export_as_matrix)
void dae_baked_object_animation(std::vector< float > &fra, Object *ob)
void sample_and_write_bone_animation(Object *ob_arm, Bone *bone, int transform_type)
bool is_bone_deform_group(Bone *bone)
void export_bone_animations_recursive(Object *ob_arm, Bone *bone, BCAnimationSampler &sampler)
AnimationExporter(COLLADASW::StreamWriter *sw, BCExportSettings &export_settings)
void export_bone_animation(Object *ob, Bone *bone, BCFrames &frames, BCMatrixSampleMap &samples)
BCAnimationCurve * get_modified_export_curve(Object *ob, BCAnimationCurve &curve, BCAnimationCurveMap &curves)
void export_curve_animation(Object *ob, BCAnimationCurve &curve)
void export_morph_animation(Object *ob)
std::string get_collada_name(std::string channel_type) const
std::string collada_linear_interpolation_source(int tot, const std::string &anim_id)
std::string get_collada_sid(const BCAnimationCurve &curve, const std::string axis_name)
void sample_animation(float *v, std::vector< float > &frames, int type, Bone *bone, Object *ob_arm, bPoseChannel *pChan)
std::vector< std::vector< std::string > > anim_meta
void sample_animation(std::vector< float[4][4]> &mats, std::vector< float > &frames, Bone *bone, Object *ob_arm, bPoseChannel *pChan)
std::string get_semantic_suffix(COLLADASW::InputSemantic::Semantics semantic)
int get_point_in_curve(const BCAnimationCurve &curve, float sample_frame, COLLADASW::InputSemantic::Semantics semantic, bool is_angle, float *values)
std::string collada_tangent_from_curve(COLLADASW::InputSemantic::Semantics semantic, BCAnimationCurve &curve, const std::string &anim_id, const std::string axis_name)
int get_point_in_curve(BCBezTriple &bezt, COLLADASW::InputSemantic::Semantics semantic, bool is_angle, float *values)
std::string collada_source_from_values(BC_animation_source_type source_type, COLLADASW::InputSemantic::Semantics semantic, std::vector< float > &values, const std::string &anim_id, const std::string axis_name)
void dae_baked_animation(std::vector< float > &fra, Object *ob_arm, Bone *bone)
float convert_time(float frame)
void dae_bone_animation(std::vector< float > &fra, float *v, int tm_type, int axis, std::string ob_name, std::string bone_name)
local_group_size(16, 16) .push_constant(Type local_group_size(16, 16) .push_constant(Type input_tx sampler(1, ImageType::FLOAT_2D, "matte_tx") .image(0