Blender V4.5
collada_utils.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
8
9#pragma once
10
11#include "COLLADAFWFloatOrDoubleArray.h"
12#include "COLLADAFWTypes.h"
13#include "COLLADASWColorOrTexture.h"
14
15#include <algorithm>
16#include <map>
17#include <set>
18#include <vector>
19
20#include "DNA_anim_types.h"
21#include "DNA_camera_types.h"
23#include "DNA_light_types.h"
24#include "DNA_mesh_types.h"
25#include "DNA_object_types.h"
26
28#include "DNA_scene_types.h"
29#include "DNA_texture_types.h"
30
31#include "RNA_access.hh"
32
33#include "BLI_linklist.h"
34
35#include "BKE_context.hh"
36#include "BKE_main.hh"
37#include "BKE_node.hh"
38#include "BKE_object.hh"
39#include "BKE_scene.hh"
40
41#include "BCSampleData.h"
42#include "BlenderContext.h"
43#include "ExportSettings.h"
44#include "collada_internal.h"
45
46constexpr int LIMITTED_PRECISION = 6;
47
48using UidImageMap = std::map<COLLADAFW::UniqueId, Image *>;
49using KeyImageMap = std::map<std::string, Image *>;
50using TexIndexTextureArrayMap = std::map<COLLADAFW::TextureMapId, std::vector<MTex *>>;
51using BCObjectSet = std::set<Object *>;
52
53namespace COLLADAFW {
54class Node;
55}
56class ExtraTags;
57
58extern void bc_update_scene(BlenderContext &blender_context, float ctime);
59
60/* Action helpers */
61
62std::vector<bAction *> bc_getSceneActions(const bContext *C, Object *ob, bool all_actions);
63
64/* Action and Animdata helpers */
65
66/* Return Object's Action or nullptr. */
68{
69 return (ob->adt && ob->adt->action) ? ob->adt->action : nullptr;
70}
71
72/* Return Light's AnimData or nullptr. */
74{
75 if (ob->type != OB_LAMP) {
76 return nullptr;
77 }
78
79 Light *lamp = (Light *)ob->data;
80 return lamp->adt;
81}
82
83/* Return Camera's AnimData or nullptr. */
85{
86 if (ob->type != OB_CAMERA) {
87 return nullptr;
88 }
89
90 const Camera *camera = (const Camera *)ob->data;
91 return camera->adt;
92}
93
94/* Return Material's AnimData or nullptr. */
96{
97 if (ma == nullptr) {
98 return nullptr;
99 }
100
101 return ma->adt;
102}
103
104std::string bc_get_action_id(const std::string &action_name,
105 const std::string &ob_name,
106 const std::string &channel_type,
107 const std::string &axis_name,
108 const std::string &axis_separator = "_");
109
110extern float bc_get_float_value(const COLLADAFW::FloatOrDoubleArray &array, unsigned int index);
111extern int bc_test_parent_loop(Object *par, Object *ob);
112
113extern bool bc_validateConstraints(bConstraint *con);
114
115bool bc_set_parent(Object *ob, Object *par, bContext *C, bool is_parent_space = true);
116extern Object *bc_add_object(
117 Main *bmain, Scene *scene, ViewLayer *view_layer, int type, const char *name);
118extern Object *bc_add_armature(COLLADAFW::Node *node,
119 ExtraTags *node_extra_tags,
120 Main *bmain,
121 Scene *scene,
122 ViewLayer *view_layer,
123 int type,
124 const char *name);
125extern Mesh *bc_get_mesh_copy(BlenderContext &blender_context,
126 Object *ob,
127 BC_export_mesh_type export_mesh_type,
128 bool apply_modifiers,
129 bool triangulate);
130
132extern bool bc_has_object_type(LinkNode *export_set, short obtype);
133
134extern const char *bc_CustomData_get_layer_name(const CustomData *data,
135 eCustomDataType type,
136 int n);
137extern const char *bc_CustomData_get_active_layer_name(const CustomData *data,
138 eCustomDataType type);
139
140extern void bc_bubble_sort_by_Object_name(LinkNode *export_set);
147extern bool bc_is_root_bone(Bone *aBone, bool deform_bones_only);
148extern int bc_get_active_UVLayer(Object *ob);
149
150inline std::string bc_string_after(const std::string &s, const std::string &probe)
151{
152 size_t i = s.rfind(probe);
153 if (i != std::string::npos) {
154 return (s.substr(i + probe.length(), s.length() - i));
155 }
156 return s;
157}
158
159inline std::string bc_string_before(const std::string &s, const std::string &probe)
160{
161 size_t i = s.find(probe);
162 if (i != std::string::npos) {
163 return s.substr(0, i);
164 }
165 return s;
166}
167
168inline bool bc_startswith(std::string const &value, std::string const &starting)
169{
170 if (starting.size() > value.size()) {
171 return false;
172 }
173 return (value.substr(0, starting.size()) == starting);
174}
175
176inline bool bc_endswith(const std::string &value, const std::string &ending)
177{
178 if (ending.size() > value.size()) {
179 return false;
180 }
181
182 return value.compare(value.size() - ending.size(), ending.size(), ending) == 0;
183}
184
185#if 0 /* UNUSED */
186inline bool bc_endswith(std::string const &value, std::string const &ending)
187{
188 if (ending.size() > value.size()) {
189 return false;
190 }
191 return std::equal(ending.rbegin(), ending.rend(), value.rbegin());
192}
193#endif
194
195extern std::string bc_replace_string(std::string data,
196 const std::string &pattern,
197 const std::string &replacement);
198extern std::string bc_url_encode(const std::string &data);
204extern void bc_match_scale(Object *ob, UnitConverter &bc_unit, bool scale_to_scene);
205extern void bc_match_scale(std::vector<Object *> *objects_done,
206 UnitConverter &bc_unit,
207 bool scale_to_scene);
208
212extern void bc_decompose(float mat[4][4], float *loc, float eul[3], float quat[4], float *size);
224extern void bc_rotate_from_reference_quat(float quat_to[4],
225 float quat_from[4],
226 float mat_to[4][4]);
227
228extern void bc_triangulate_mesh(Mesh *mesh);
232extern bool bc_is_leaf_bone(Bone *bone);
233extern EditBone *bc_get_edit_bone(bArmature *armature, const char *name);
234extern int bc_set_layer(int bitfield, int layer, bool enable);
235extern int bc_set_layer(int bitfield, int layer);
236
237inline bool bc_in_range(float a, float b, float range)
238{
239 return fabsf(a - b) < range;
240}
241void bc_copy_m4_farray(float r[4][4], float *a);
242void bc_copy_farray_m4(float *r, float a[4][4]);
243void bc_copy_darray_m4d(double *r, double a[4][4]);
244void bc_copy_m4d_v44(double (&r)[4][4], std::vector<std::vector<double>> &a);
245void bc_copy_v44_m4d(std::vector<std::vector<double>> &r, double (&a)[4][4]);
246
247void bc_sanitize_v3(double v[3], int precision);
248void bc_sanitize_v3(float v[3], int precision);
249
254extern IDProperty *bc_get_IDProperty(Bone *bone, const std::string &key);
255extern void bc_set_IDProperty(EditBone *ebone, const char *key, float value);
259extern void bc_set_IDPropertyMatrix(EditBone *ebone, const char *key, float mat[4][4]);
260
265extern float bc_get_property(Bone *bone, const std::string &key, float def);
269extern void bc_get_property_vector(Bone *bone,
270 const std::string &key,
271 float val[3],
272 const float def[3]);
281extern bool bc_get_property_matrix(Bone *bone, const std::string &key, float mat[4][4]);
282
283extern void bc_enable_fcurves(bAction *act, const char *bone_name);
284extern bool bc_bone_matrix_local_get(Object *ob, Bone *bone, Matrix &mat, bool for_opensim);
285extern bool bc_is_animated(BCMatrixSampleMap &values);
286extern bool bc_has_animations(Scene *sce, LinkNode *export_set);
287extern bool bc_has_animations(Object *ob);
288
289extern void bc_add_global_transform(Matrix &to_mat,
290 const Matrix &from_mat,
291 const BCMatrix &global_transform,
292 bool invert = false);
293extern void bc_add_global_transform(Vector &to_vec,
294 const Vector &from_vec,
295 const BCMatrix &global_transform,
296 bool invert = false);
297extern void bc_add_global_transform(Vector &to_vec,
298 const BCMatrix &global_transform,
299 bool invert = false);
300extern void bc_add_global_transform(Matrix &to_mat,
301 const BCMatrix &global_transform,
302 bool invert = false);
303extern void bc_apply_global_transform(Matrix &to_mat,
304 const BCMatrix &global_transform,
305 bool invert = false);
306extern void bc_apply_global_transform(Vector &to_vec,
307 const BCMatrix &global_transform,
308 bool invert = false);
315extern void bc_create_restpose_mat(BCExportSettings &export_settings,
316 Bone *bone,
317 float to_mat[4][4],
318 float from_mat[4][4],
319 bool use_local_space);
320
322 private:
323 std::vector<Object *> base_objects;
324
325 public:
326 void add(Object *ob)
327 {
328 base_objects.push_back(ob);
329 }
330
331 bool contains(Object *ob)
332 {
333 std::vector<Object *>::iterator it = std::find(base_objects.begin(), base_objects.end(), ob);
334 return (it != base_objects.end());
335 }
336
337 int size()
338 {
339 return base_objects.size();
340 }
341
342 Object *get(int index)
343 {
344 return base_objects[index];
345 }
346};
347
349 std::vector<unsigned int> normal_indices;
350
351 public:
352 void add_index(unsigned int index)
353 {
354 normal_indices.push_back(index);
355 }
356
357 unsigned int operator[](unsigned int i)
358 {
359 return normal_indices[i];
360 }
361};
362
364
365 private:
366 char name[MAXBONENAME];
367 int chain_length;
368 bool is_leaf;
369 float tail[3];
370 float roll;
371
372 std::vector<std::string> bone_collections;
373
374 int use_connect;
375 bool has_custom_tail;
376 bool has_custom_roll;
377
378 public:
384 BoneExtended(EditBone *aBone);
385
386 void set_name(const char *aName);
387 char *get_name();
388
389 void set_chain_length(int aLength);
390 int get_chain_length();
391
392 void set_leaf_bone(bool state);
393 bool is_leaf_bone();
394
395 void set_bone_collections(std::vector<std::string> bone_collections);
396 const std::vector<std::string> &get_bone_collections();
397
398 void set_roll(float roll);
399 bool has_roll();
400 float get_roll();
401
402 void set_tail(const float vec[]);
403 float *get_tail();
404 bool has_tail();
405
406 void set_use_connect(int use_connect);
407 int get_use_connect();
408};
409
410/* a map to store bone extension maps
411 * std:string : an armature name
412 * BoneExtended * : a map that contains extra data for bones
413 */
414using BoneExtensionMap = std::map<std::string, BoneExtended *>;
415
416/*
417 * A class to organize bone extension data for multiple Armatures.
418 * this is needed for the case where a Collada file contains 2 or more
419 * separate armatures.
420 */
422 private:
423 std::map<std::string, BoneExtensionMap *> extended_bone_maps;
424
425 public:
433};
434
437
438COLLADASW::ColorOrTexture bc_get_base_color(Material *ma);
439COLLADASW::ColorOrTexture bc_get_emission(Material *ma);
440COLLADASW::ColorOrTexture bc_get_ambient(Material *ma);
441COLLADASW::ColorOrTexture bc_get_specular(Material *ma);
442COLLADASW::ColorOrTexture bc_get_reflective(Material *ma);
443
444double bc_get_reflectivity(Material *ma);
445double bc_get_alpha(Material *ma);
446double bc_get_ior(Material *ma);
447double bc_get_shininess(Material *ma);
448
449bool bc_get_float_from_shader(bNode *shader, double &val, std::string nodeid);
450COLLADASW::ColorOrTexture bc_get_cot_from_shader(bNode *shader,
451 std::string nodeid,
452 const Color &default_color,
453 bool with_alpha = true);
454
455COLLADASW::ColorOrTexture bc_get_cot(float r, float g, float b, float a);
456COLLADASW::ColorOrTexture bc_get_cot(const Color col, bool with_alpha = true);
std::map< int, const BCMatrix * > BCMatrixSampleMap
General operations, lookup, etc. for blender objects.
float[3] Vector
float[4][4] Matrix
float[4] Color
#define MAXBONENAME
Object is a sort of wrapper for general info.
@ OB_CAMERA
@ OB_LAMP
BC_export_mesh_type
#define C
Definition RandGen.cpp:29
BMesh const char void * data
ATTR_WARN_UNUSED_RESULT const BMVert * v
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition btDbvt.cpp:52
void add_index(unsigned int index)
unsigned int operator[](unsigned int i)
void set_use_connect(int use_connect)
void set_roll(float roll)
const std::vector< std::string > & get_bone_collections()
void set_bone_collections(std::vector< std::string > bone_collections)
void set_tail(const float vec[])
void set_leaf_bone(bool state)
float * get_tail()
BoneExtended(EditBone *aBone)
void set_chain_length(int aLength)
void set_name(const char *aName)
BoneExtensionMap & getExtensionMap(bArmature *armature)
void add(Object *ob)
bool contains(Object *ob)
Object * get(int index)
Class for saving <extra> tags for a specific UniqueId.
Definition ExtraTags.h:17
Object * bc_add_object(Main *bmain, Scene *scene, ViewLayer *view_layer, int type, const char *name)
COLLADASW::ColorOrTexture bc_get_cot_from_shader(bNode *shader, std::string nodeid, const Color &default_color, bool with_alpha=true)
COLLADASW::ColorOrTexture bc_get_specular(Material *ma)
COLLADASW::ColorOrTexture bc_get_ambient(Material *ma)
IDProperty * bc_get_IDProperty(Bone *bone, const std::string &key)
void bc_copy_farray_m4(float *r, float a[4][4])
const char * bc_CustomData_get_active_layer_name(const CustomData *data, eCustomDataType type)
bool bc_is_root_bone(Bone *aBone, bool deform_bones_only)
double bc_get_alpha(Material *ma)
AnimData * bc_getSceneLightAnimData(Object *ob)
bool bc_set_parent(Object *ob, Object *par, bContext *C, bool is_parent_space=true)
bNode * bc_get_master_shader(Material *ma)
std::vector< bAction * > bc_getSceneActions(const bContext *C, Object *ob, bool all_actions)
COLLADASW::ColorOrTexture bc_get_cot(float r, float g, float b, float a)
AnimData * bc_getSceneCameraAnimData(Object *ob)
std::string bc_url_encode(const std::string &data)
constexpr int LIMITTED_PRECISION
COLLADASW::ColorOrTexture bc_get_emission(Material *ma)
COLLADASW::ColorOrTexture bc_get_reflective(Material *ma)
std::string bc_get_action_id(const std::string &action_name, const std::string &ob_name, const std::string &channel_type, const std::string &axis_name, const std::string &axis_separator="_")
const char * bc_CustomData_get_layer_name(const CustomData *data, eCustomDataType type, int n)
bool bc_in_range(float a, float b, float range)
std::map< std::string, Image * > KeyImageMap
void bc_rotate_from_reference_quat(float quat_to[4], float quat_from[4], float mat_to[4][4])
double bc_get_reflectivity(Material *ma)
std::map< COLLADAFW::TextureMapId, std::vector< MTex * > > TexIndexTextureArrayMap
bool bc_endswith(const std::string &value, const std::string &ending)
void bc_copy_m4d_v44(double(&r)[4][4], std::vector< std::vector< double > > &a)
void bc_match_scale(Object *ob, UnitConverter &bc_unit, bool scale_to_scene)
void bc_set_IDProperty(EditBone *ebone, const char *key, float value)
bAction * bc_getSceneObjectAction(Object *ob)
AnimData * bc_getSceneMaterialAnimData(Material *ma)
std::set< Object * > BCObjectSet
Object * bc_get_assigned_armature(Object *ob)
void bc_add_global_transform(Matrix &to_mat, const Matrix &from_mat, const BCMatrix &global_transform, bool invert=false)
float bc_get_property(Bone *bone, const std::string &key, float def)
void bc_add_default_shader(bContext *C, Material *ma)
bool bc_startswith(std::string const &value, std::string const &starting)
Object * bc_add_armature(COLLADAFW::Node *node, ExtraTags *node_extra_tags, Main *bmain, Scene *scene, ViewLayer *view_layer, int type, const char *name)
void bc_set_IDPropertyMatrix(EditBone *ebone, const char *key, float mat[4][4])
std::string bc_string_before(const std::string &s, const std::string &probe)
bool bc_is_animated(BCMatrixSampleMap &values)
int bc_set_layer(int bitfield, int layer, bool enable)
void bc_triangulate_mesh(Mesh *mesh)
void bc_create_restpose_mat(BCExportSettings &export_settings, Bone *bone, float to_mat[4][4], float from_mat[4][4], bool use_local_space)
bool bc_get_float_from_shader(bNode *shader, double &val, std::string nodeid)
int bc_get_active_UVLayer(Object *ob)
void bc_bubble_sort_by_Object_name(LinkNode *export_set)
EditBone * bc_get_edit_bone(bArmature *armature, const char *name)
bool bc_validateConstraints(bConstraint *con)
Mesh * bc_get_mesh_copy(BlenderContext &blender_context, Object *ob, BC_export_mesh_type export_mesh_type, bool apply_modifiers, bool triangulate)
std::string bc_string_after(const std::string &s, const std::string &probe)
bool bc_has_animations(Scene *sce, LinkNode *export_set)
double bc_get_shininess(Material *ma)
std::map< COLLADAFW::UniqueId, Image * > UidImageMap
COLLADASW::ColorOrTexture bc_get_base_color(Material *ma)
float bc_get_float_value(const COLLADAFW::FloatOrDoubleArray &array, unsigned int index)
double bc_get_ior(Material *ma)
void bc_get_property_vector(Bone *bone, const std::string &key, float val[3], const float def[3])
void bc_copy_v44_m4d(std::vector< std::vector< double > > &r, double(&a)[4][4])
void bc_update_scene(BlenderContext &blender_context, float ctime)
void bc_sanitize_v3(double v[3], int precision)
std::string bc_replace_string(std::string data, const std::string &pattern, const std::string &replacement)
bool bc_bone_matrix_local_get(Object *ob, Bone *bone, Matrix &mat, bool for_opensim)
void bc_apply_global_transform(Matrix &to_mat, const BCMatrix &global_transform, bool invert=false)
std::map< std::string, BoneExtended * > BoneExtensionMap
void bc_copy_darray_m4d(double *r, double a[4][4])
void bc_enable_fcurves(bAction *act, const char *bone_name)
void bc_decompose(float mat[4][4], float *loc, float eul[3], float quat[4], float *size)
void bc_copy_m4_farray(float r[4][4], float *a)
bool bc_get_property_matrix(Bone *bone, const std::string &key, float mat[4][4])
bool bc_has_object_type(LinkNode *export_set, short obtype)
bool bc_is_leaf_bone(Bone *bone)
int bc_test_parent_loop(Object *par, Object *ob)
#define fabsf(x)
uint col
CCL_NAMESPACE_BEGIN ccl_device float invert(const float color, const float factor)
Definition invert.h:11
static ulong state[N]
bAction * action
struct AnimData * adt
struct AnimData * adt
struct AnimData * adt
struct AnimData * adt
i
Definition text_draw.cc:230