Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGaia Clary <gaia.clary@machinimatrix.org>2013-02-11 02:14:56 +0400
committerGaia Clary <gaia.clary@machinimatrix.org>2013-02-11 02:14:56 +0400
commit22dbb675c156a24880e3b1803a0f5abde53af4b8 (patch)
tree9c36399f029fc48a4e05be92e5db4075e375c600 /source/blender/collada/collada_utils.cpp
parent1ba194aeddef7a4d2859d7587b60c70c03387b1c (diff)
Fix #33437 Collada: Added scale matching for Scene imports.
Diffstat (limited to 'source/blender/collada/collada_utils.cpp')
-rw-r--r--source/blender/collada/collada_utils.cpp62
1 files changed, 60 insertions, 2 deletions
diff --git a/source/blender/collada/collada_utils.cpp b/source/blender/collada/collada_utils.cpp
index ab8491dde01..84bb33929c1 100644
--- a/source/blender/collada/collada_utils.cpp
+++ b/source/blender/collada/collada_utils.cpp
@@ -295,11 +295,69 @@ std::string bc_url_encode(std::string data) {
}
std::string bc_replace_string(std::string data, const std::string& pattern,
- const std::string& replacement) {
+ const std::string& replacement) {
size_t pos = 0;
- while ((pos = data.find(pattern, pos)) != std::string::npos) {
+ while((pos = data.find(pattern, pos)) != std::string::npos) {
data.replace(pos, pattern.length(), replacement);
pos += replacement.length();
}
return data;
}
+
+/**
+ Calculate a rescale factor such that the imported scene's scale
+ is preserved. I.e. 1 meter in the import will also be
+ 1 meter in the curretn scene.
+ XXX : I am not sure if it is correct to map 1 Blender Unit
+ to 1 Meter for unit type NONE. But it looks reasonable to me.
+*/
+void bc_match_scale(std::vector<Object *> *objects_done,
+ Scene &sce,
+ UnitConverter &unit_converter) {
+
+ Object *ob = NULL;
+
+ PointerRNA scene_ptr, unit_settings;
+ PropertyRNA *system_ptr, *scale_ptr;
+ RNA_id_pointer_create(&sce.id, &scene_ptr);
+
+ unit_settings = RNA_pointer_get(&scene_ptr, "unit_settings");
+ system_ptr = RNA_struct_find_property(&unit_settings, "system");
+ scale_ptr = RNA_struct_find_property(&unit_settings, "scale_length");
+
+ int type = RNA_property_enum_get(&unit_settings, system_ptr);
+
+ float bl_scale;
+
+ switch(type) {
+ case USER_UNIT_NONE : bl_scale = 1.0; // map 1 Blender unit to 1 Meter
+ break;
+ case USER_UNIT_METRIC : bl_scale = RNA_property_float_get(&unit_settings, scale_ptr);
+ break;
+ default : bl_scale = RNA_property_float_get(&unit_settings, scale_ptr);
+ // it looks like the conversion to Imperial is done implicitly.
+ // So nothing to do here.
+ break;
+ }
+
+ float size_mat3[3][3];
+ float size_mat4[4][4];
+
+ float scale_conv = unit_converter.getLinearMeter() / bl_scale;
+
+ float rescale[3];
+ rescale[0] = rescale[1] = rescale[2] = scale_conv;
+
+ size_to_mat3(size_mat3, rescale);
+ copy_m4_m3(size_mat4, size_mat3);
+
+ for (std::vector<Object *>::iterator it = objects_done->begin(); it != objects_done->end(); ++it) {
+ ob = *it;
+ mult_m4_m4m4(ob->obmat, ob->obmat, size_mat4);
+ ob->obmat[3][0] = ob->loc[0] * rescale[0];
+ ob->obmat[3][1] = ob->loc[1] * rescale[1];
+ ob->obmat[3][2] = ob->loc[2] * rescale[2];
+ BKE_object_apply_mat4(ob, ob->obmat, 0, 0);
+ }
+
+}