| 
									
										
										
										
											2011-02-23 10:52:22 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2010-10-05 00:05:14 +00:00
										 |  |  |  * This program is free software; you can redistribute it and/or | 
					
						
							|  |  |  |  * modify it under the terms of the GNU General Public License | 
					
						
							|  |  |  |  * as published by the Free Software Foundation; either version 2 | 
					
						
							|  |  |  |  * of the License, or (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  |  * along with this program; if not, write to the Free Software Foundation, | 
					
						
							|  |  |  |  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2011-02-27 20:30:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-18 08:08:12 +11:00
										 |  |  | /** \file
 | 
					
						
							|  |  |  |  * \ingroup collada | 
					
						
							| 
									
										
										
										
											2011-02-27 20:30:35 +00:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-12 06:25:04 +00:00
										 |  |  | /* COLLADABU_ASSERT, may be able to remove later */ | 
					
						
							|  |  |  | #include "COLLADABUPlatform.h"
 | 
					
						
							| 
									
										
										
										
											2010-10-05 00:05:14 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "TransformReader.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-20 16:43:48 +00:00
										 |  |  | TransformReader::TransformReader(UnitConverter *conv) : unit_converter(conv) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   /* pass */ | 
					
						
							| 
									
										
										
										
											2012-06-12 22:05:33 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2010-10-05 00:05:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | void TransformReader::get_node_mat(float mat[4][4], | 
					
						
							|  |  |  |                                    COLLADAFW::Node *node, | 
					
						
							|  |  |  |                                    std::map<COLLADAFW::UniqueId, Animation> *animation_map, | 
					
						
							|  |  |  |                                    Object *ob) | 
					
						
							| 
									
										
										
										
											2017-03-21 18:05:10 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   get_node_mat(mat, node, animation_map, ob, NULL); | 
					
						
							| 
									
										
										
										
											2017-03-21 18:05:10 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | void TransformReader::get_node_mat(float mat[4][4], | 
					
						
							|  |  |  |                                    COLLADAFW::Node *node, | 
					
						
							|  |  |  |                                    std::map<COLLADAFW::UniqueId, Animation> *animation_map, | 
					
						
							|  |  |  |                                    Object *ob, | 
					
						
							|  |  |  |                                    float parent_mat[4][4]) | 
					
						
							| 
									
										
										
										
											2010-10-05 00:05:14 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   float cur[4][4]; | 
					
						
							|  |  |  |   float copy[4][4]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   unit_m4(mat); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   for (unsigned int i = 0; i < node->getTransformations().getCount(); i++) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     COLLADAFW::Transformation *tm = node->getTransformations()[i]; | 
					
						
							|  |  |  |     COLLADAFW::Transformation::TransformationType type = tm->getTransformationType(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     switch (type) { | 
					
						
							|  |  |  |       case COLLADAFW::Transformation::MATRIX: | 
					
						
							| 
									
										
										
										
											2020-10-10 18:19:55 +11:00
										 |  |  |         /* When matrix AND Trans/Rot/Scale are defined for a node,
 | 
					
						
							|  |  |  |          * then this is considered as redundant information. | 
					
						
							|  |  |  |          * So if we find a Matrix we use that and return. */ | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |         dae_matrix_to_mat4(tm, mat); | 
					
						
							|  |  |  |         if (parent_mat) { | 
					
						
							|  |  |  |           mul_m4_m4m4(mat, parent_mat, mat); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       case COLLADAFW::Transformation::TRANSLATE: | 
					
						
							|  |  |  |         dae_translate_to_mat4(tm, cur); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case COLLADAFW::Transformation::ROTATE: | 
					
						
							|  |  |  |         dae_rotate_to_mat4(tm, cur); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case COLLADAFW::Transformation::SCALE: | 
					
						
							|  |  |  |         dae_scale_to_mat4(tm, cur); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case COLLADAFW::Transformation::LOOKAT: | 
					
						
							|  |  |  |         fprintf(stderr, "|!     LOOKAT transformations are not supported yet.\n"); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case COLLADAFW::Transformation::SKEW: | 
					
						
							|  |  |  |         fprintf(stderr, "|!     SKEW transformations are not supported yet.\n"); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     copy_m4_m4(copy, mat); | 
					
						
							|  |  |  |     mul_m4_m4m4(mat, copy, cur); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (animation_map) { | 
					
						
							| 
									
										
										
										
											2020-10-10 18:19:55 +11:00
										 |  |  |       /* AnimationList that drives this Transformation */ | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |       const COLLADAFW::UniqueId &anim_list_id = tm->getAnimationList(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-10 18:19:55 +11:00
										 |  |  |       /* store this so later we can link animation data with ob */ | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |       Animation anim = {ob, node, tm}; | 
					
						
							|  |  |  |       (*animation_map)[anim_list_id] = anim; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (parent_mat) { | 
					
						
							|  |  |  |     mul_m4_m4m4(mat, parent_mat, mat); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-10-05 00:05:14 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-11 14:29:01 +00:00
										 |  |  | void TransformReader::dae_rotate_to_mat4(COLLADAFW::Transformation *tm, float m[4][4]) | 
					
						
							| 
									
										
										
										
											2010-10-05 00:05:14 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   COLLADAFW::Rotate *ro = (COLLADAFW::Rotate *)tm; | 
					
						
							|  |  |  |   COLLADABU::Math::Vector3 &axis = ro->getRotationAxis(); | 
					
						
							|  |  |  |   const float angle = (float)DEG2RAD(ro->getRotationAngle()); | 
					
						
							|  |  |  |   const float ax[] = {(float)axis[0], (float)axis[1], (float)axis[2]}; | 
					
						
							|  |  |  |   // float quat[4];
 | 
					
						
							|  |  |  |   // axis_angle_to_quat(quat, axis, angle);
 | 
					
						
							|  |  |  |   // quat_to_mat4(m, quat);
 | 
					
						
							|  |  |  |   axis_angle_to_mat4(m, ax, angle); | 
					
						
							| 
									
										
										
										
											2010-10-05 00:05:14 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-11 14:29:01 +00:00
										 |  |  | void TransformReader::dae_translate_to_mat4(COLLADAFW::Transformation *tm, float m[4][4]) | 
					
						
							| 
									
										
										
										
											2010-10-05 00:05:14 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   COLLADAFW::Translate *tra = (COLLADAFW::Translate *)tm; | 
					
						
							|  |  |  |   COLLADABU::Math::Vector3 &t = tra->getTranslation(); | 
					
						
							| 
									
										
										
										
											2010-10-05 00:05:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   unit_m4(m); | 
					
						
							| 
									
										
										
										
											2010-10-05 00:05:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   m[3][0] = (float)t[0]; | 
					
						
							|  |  |  |   m[3][1] = (float)t[1]; | 
					
						
							|  |  |  |   m[3][2] = (float)t[2]; | 
					
						
							| 
									
										
										
										
											2010-10-05 00:05:14 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-11 14:29:01 +00:00
										 |  |  | void TransformReader::dae_scale_to_mat4(COLLADAFW::Transformation *tm, float m[4][4]) | 
					
						
							| 
									
										
										
										
											2010-10-05 00:05:14 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   COLLADABU::Math::Vector3 &s = ((COLLADAFW::Scale *)tm)->getScale(); | 
					
						
							|  |  |  |   float size[3] = {(float)s[0], (float)s[1], (float)s[2]}; | 
					
						
							|  |  |  |   size_to_mat4(m, size); | 
					
						
							| 
									
										
										
										
											2010-10-05 00:05:14 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-11 14:29:01 +00:00
										 |  |  | void TransformReader::dae_matrix_to_mat4(COLLADAFW::Transformation *tm, float m[4][4]) | 
					
						
							| 
									
										
										
										
											2010-10-05 00:05:14 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2020-09-04 12:26:24 +02:00
										 |  |  |   UnitConverter::dae_matrix_to_mat4_(m, ((COLLADAFW::Matrix *)tm)->getMatrix()); | 
					
						
							| 
									
										
										
										
											2010-10-05 00:05:14 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void TransformReader::dae_translate_to_v3(COLLADAFW::Transformation *tm, float v[3]) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   dae_vector3_to_v3(((COLLADAFW::Translate *)tm)->getTranslation(), v); | 
					
						
							| 
									
										
										
										
											2010-10-05 00:05:14 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void TransformReader::dae_scale_to_v3(COLLADAFW::Transformation *tm, float v[3]) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   dae_vector3_to_v3(((COLLADAFW::Scale *)tm)->getScale(), v); | 
					
						
							| 
									
										
										
										
											2010-10-05 00:05:14 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void TransformReader::dae_vector3_to_v3(const COLLADABU::Math::Vector3 &v3, float v[3]) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   v[0] = v3.x; | 
					
						
							|  |  |  |   v[1] = v3.y; | 
					
						
							|  |  |  |   v[2] = v3.z; | 
					
						
							| 
									
										
										
										
											2010-10-05 00:49:39 +00:00
										 |  |  | } |