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
8
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
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Brightness Control the brightness and contrast of the input color Vector Map input vector components with curves Camera Retrieve information about the camera and how it relates to the current shading point s position Clamp a value between a minimum and a maximum Vector Perform vector math operation Invert Color
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Gabor Generate Gabor noise Gradient Generate interpolated color and intensity values based on the input vector Magic Generate a psychedelic color texture Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a or normal between camera
#define C
Definition RandGen.cpp:29
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_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
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