diff options
author | Gaia Clary <gaia.clary@machinimatrix.org> | 2013-02-11 02:14:56 +0400 |
---|---|---|
committer | Gaia Clary <gaia.clary@machinimatrix.org> | 2013-02-11 02:14:56 +0400 |
commit | 22dbb675c156a24880e3b1803a0f5abde53af4b8 (patch) | |
tree | 9c36399f029fc48a4e05be92e5db4075e375c600 /source/blender/collada/collada_utils.cpp | |
parent | 1ba194aeddef7a4d2859d7587b60c70c03387b1c (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.cpp | 62 |
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); + } + +} |