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