From a545998c8445420b601594fc7eb84a357b361990 Mon Sep 17 00:00:00 2001 From: Arystanbek Dyussenov Date: Thu, 3 Jun 2010 17:41:33 +0000 Subject: Merge -c 29009,29081,29189 from COLLADA branch into trunk. --- source/blender/collada/DocumentExporter.cpp | 35 +++- source/blender/collada/DocumentExporter.h | 23 +++ source/blender/collada/DocumentImporter.cpp | 258 ++++++++++++++++++++++------ source/blender/collada/DocumentImporter.h | 23 +++ source/blender/collada/SConscript | 26 +++ source/blender/collada/collada.cpp | 23 +++ source/blender/collada/collada.h | 23 +++ source/blender/collada/collada_internal.h | 23 +++ 8 files changed, 375 insertions(+), 59 deletions(-) (limited to 'source') diff --git a/source/blender/collada/DocumentExporter.cpp b/source/blender/collada/DocumentExporter.cpp index 03d372977de..cf539ecf67c 100644 --- a/source/blender/collada/DocumentExporter.cpp +++ b/source/blender/collada/DocumentExporter.cpp @@ -1,3 +1,26 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * 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. + * + * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed. + * + * ***** END GPL LICENSE BLOCK ***** + */ #include #include #include @@ -638,8 +661,8 @@ public: source.setAccessorCount(totuv); source.setAccessorStride(2); COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); - param.push_back("X"); - param.push_back("Y"); + param.push_back("S"); + param.push_back("T"); source.prepareToAppendValues(); @@ -908,7 +931,7 @@ public: Object *ob_arm = get_assigned_armature(ob); bArmature *arm = (bArmature*)ob_arm->data; - const std::string& controller_id = get_controller_id(ob_arm); + const std::string& controller_id = get_controller_id(ob_arm, ob); COLLADASW::InstanceController ins(mSW); ins.setUrl(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, controller_id)); @@ -1051,9 +1074,9 @@ private: TransformWriter::add_node_transform(node, mat, NULL); } - std::string get_controller_id(Object *ob_arm) + std::string get_controller_id(Object *ob_arm, Object *ob) { - return translate_id(id_name(ob_arm)) + SKIN_CONTROLLER_ID_SUFFIX; + return translate_id(id_name(ob_arm)) + "_" + translate_id(id_name(ob)) + SKIN_CONTROLLER_ID_SUFFIX; } // ob should be of type OB_MESH @@ -1087,7 +1110,7 @@ private: if (!me->dvert) return; std::string controller_name = id_name(ob_arm); - std::string controller_id = get_controller_id(ob_arm); + std::string controller_id = get_controller_id(ob_arm, ob); openSkin(controller_id, controller_name, COLLADABU::URI(COLLADABU::Utils::EMPTY_STRING, get_geometry_id(ob))); diff --git a/source/blender/collada/DocumentExporter.h b/source/blender/collada/DocumentExporter.h index 1a0c292a3dd..bb6d400fdf1 100644 --- a/source/blender/collada/DocumentExporter.h +++ b/source/blender/collada/DocumentExporter.h @@ -1,3 +1,26 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * 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. + * + * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov. + * + * ***** END GPL LICENSE BLOCK ***** + */ struct Scene; class DocumentExporter diff --git a/source/blender/collada/DocumentImporter.cpp b/source/blender/collada/DocumentImporter.cpp index 3c86d205c6e..b4185c5021f 100644 --- a/source/blender/collada/DocumentImporter.cpp +++ b/source/blender/collada/DocumentImporter.cpp @@ -1,3 +1,26 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * 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. + * + * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Nathan Letwory. + * + * ***** END GPL LICENSE BLOCK ***** + */ // TODO: // * name imported objects // * import object rotation as euler @@ -396,8 +419,6 @@ private: std::vector root_joints; std::map joint_parent_map; - std::vector armature_objects; - MeshImporterBase *mesh_importer; AnimationImporterBase *anim_importer; @@ -506,13 +527,11 @@ private: joint_data.push_back(jd); } - // called from write_controller - Object *create_armature(const COLLADAFW::SkinController* co, Scene *scene) + void set_controller(const COLLADAFW::SkinController* co) { - ob_arm = add_object(scene, OB_ARMATURE); - controller_uid = co->getUniqueId(); + // fill in joint UIDs const COLLADAFW::UniqueIdArray& joint_uids = co->getJoints(); for (unsigned int i = 0; i < joint_uids.getCount(); i++) { joint_data[i].joint_uid = joint_uids[i]; @@ -524,7 +543,21 @@ private: // now we'll be able to get inv bind matrix from joint id // joint_id_to_joint_index_map[joint_ids[i]] = i; } + } + + // called from write_controller + Object *create_armature(Scene *scene) + { + ob_arm = add_object(scene, OB_ARMATURE); + return ob_arm; + } + + Object* set_armature(Object *ob_arm) + { + if (this->ob_arm) + return this->ob_arm; + this->ob_arm = ob_arm; return ob_arm; } @@ -552,10 +585,12 @@ private: return controller_uid; } + // check if this skin controller references a joint or any descendant of it + // // some nodes may not be referenced by SkinController, // in this case to determine if the node belongs to this armature, // we need to search down the tree - bool uses_joint(COLLADAFW::Node *node) + bool uses_joint_or_descendant(COLLADAFW::Node *node) { const COLLADAFW::UniqueId& uid = node->getUniqueId(); std::vector::iterator it; @@ -566,7 +601,7 @@ private: COLLADAFW::NodePointerArray& children = node->getChildNodes(); for (unsigned int i = 0; i < children.getCount(); i++) { - if (this->uses_joint(children[i])) + if (uses_joint_or_descendant(children[i])) return true; } @@ -658,6 +693,38 @@ private: return parent; } + void find_root_joints(const std::vector &root_joints, + std::map& joint_by_uid, + std::vector& result) + { + std::vector::const_iterator it; + for (it = root_joints.begin(); it != root_joints.end(); it++) { + COLLADAFW::Node *root = *it; + std::vector::iterator ji; + for (ji = joint_data.begin(); ji != joint_data.end(); ji++) { + COLLADAFW::Node *joint = joint_by_uid[(*ji).joint_uid]; + if (find_node_in_tree(joint, root)) { + if (std::find(result.begin(), result.end(), root) == result.end()) + result.push_back(root); + } + } + } + } + + bool find_node_in_tree(COLLADAFW::Node *node, COLLADAFW::Node *tree_root) + { + if (node == tree_root) + return true; + + COLLADAFW::NodePointerArray& children = tree_root->getChildNodes(); + for (unsigned int i = 0; i < children.getCount(); i++) { + if (find_node_in_tree(node, children[i])) + return true; + } + + return false; + } + }; std::map skin_by_data_uid; // data UID = skin controller data UID @@ -841,7 +908,7 @@ private: for (sit = skin_by_data_uid.begin(); sit != skin_by_data_uid.end(); sit++) { SkinInfo& skin = sit->second; - if (skin.uses_joint(joint)) { + if (skin.uses_joint_or_descendant(joint)) { bPoseChannel *pchan = skin.get_pose_channel_from_node(joint); if (pchan) { @@ -909,7 +976,70 @@ private: // - exit edit mode // - set a sphere shape to leaf bones - Object *ob_arm = skin.get_armature(); + Object *ob_arm = NULL; + + /* + * find if there's another skin sharing at least one bone with this skin + * if so, use that skin's armature + */ + + /* + Pseudocode: + + find_node_in_tree(node, root_joint) + + skin::find_root_joints(root_joints): + std::vector root_joints; + for each root in root_joints: + for each joint in joints: + if find_node_in_tree(joint, root): + if (std::find(root_joints.begin(), root_joints.end(), root) == root_joints.end()) + root_joints.push_back(root); + + for (each skin B with armature) { + find all root joints for skin B + + for each joint X in skin A: + for each root joint R in skin B: + if (find_node_in_tree(X, R)) { + shared = 1; + goto endloop; + } + } + + endloop: + */ + + SkinInfo *a = &skin; + Object *shared = NULL; + std::vector skin_root_joints; + + std::map::iterator it; + for (it = skin_by_data_uid.begin(); it != skin_by_data_uid.end(); it++) { + SkinInfo *b = &it->second; + if (b == a || b->get_armature() == NULL) + continue; + + skin_root_joints.clear(); + + b->find_root_joints(root_joints, joint_by_uid, skin_root_joints); + + std::vector::iterator ri; + for (ri = skin_root_joints.begin(); ri != skin_root_joints.end(); ri++) { + if (a->uses_joint_or_descendant(*ri)) { + shared = b->get_armature(); + break; + } + } + + if (shared != NULL) + break; + } + + if (shared) + ob_arm = skin.set_armature(shared); + else + ob_arm = skin.create_armature(scene); // enter armature edit mode ED_armature_to_edit(ob_arm); @@ -921,15 +1051,23 @@ private: // min_angle = 360.0f; // minimum angle between bone head-tail and a row of bone matrix // create bones + /* + TODO: + check if bones have already been created for a given joint + */ + + std::vector::iterator ri; + for (ri = root_joints.begin(); ri != root_joints.end(); ri++) { + // for shared armature check if bone tree is already created + if (shared && std::find(skin_root_joints.begin(), skin_root_joints.end(), *ri) != skin_root_joints.end()) + continue; - std::vector::iterator it; - for (it = root_joints.begin(); it != root_joints.end(); it++) { // since root_joints may contain joints for multiple controllers, we need to filter - if (skin.uses_joint(*it)) { - create_bone(skin, *it, NULL, (*it)->getChildNodes().getCount(), NULL, (bArmature*)ob_arm->data); + if (skin.uses_joint_or_descendant(*ri)) { + create_bone(skin, *ri, NULL, (*ri)->getChildNodes().getCount(), NULL, (bArmature*)ob_arm->data); - if (joint_parent_map.find((*it)->getUniqueId()) != joint_parent_map.end() && !skin.get_parent()) - skin.set_parent(joint_parent_map[(*it)->getUniqueId()]); + if (joint_parent_map.find((*ri)->getUniqueId()) != joint_parent_map.end() && !skin.get_parent()) + skin.set_parent(joint_parent_map[(*ri)->getUniqueId()]); } } @@ -1071,10 +1209,8 @@ public: const COLLADAFW::UniqueId& skin_id = controller->getUniqueId(); if (controller->getControllerType() == COLLADAFW::Controller::CONTROLLER_TYPE_SKIN) { - COLLADAFW::SkinController *co = (COLLADAFW::SkinController*)controller; - - // to find geom id by controller id + // to be able to find geom id by controller id geom_uid_by_controller_uid[skin_id] = co->getSource(); const COLLADAFW::UniqueId& data_uid = co->getSkinControllerData(); @@ -1083,9 +1219,7 @@ public: return true; } - Object *ob_arm = skin_by_data_uid[data_uid].create_armature(co, scene); - - armature_objects.push_back(ob_arm); + skin_by_data_uid[data_uid].set_controller(co); } // morph controller else { @@ -1110,7 +1244,7 @@ public: for (it = skin_by_data_uid.begin(); it != skin_by_data_uid.end(); it++) { SkinInfo& skin = it->second; - if (skin.uses_joint(node)) + if (skin.uses_joint_or_descendant(node)) return skin.get_armature(); } @@ -1122,19 +1256,6 @@ public: BLI_snprintf(joint_path, count, "pose.bones[\"%s\"]", get_joint_name(node)); } -#if 0 - void fix_animation() - { - /* Change Euler rotation to Quaternion for bone animation */ - std::vector::iterator it; - for (it = armature_objects.begin(); it != armature_objects.end(); it++) { - Object *ob = *it; - if (!ob || !ob->adt || !ob->adt->action) continue; - anim_importer->change_eul_to_quat(ob, ob->adt->action); - } - } -#endif - // gives a world-space mat bool get_joint_bind_mat(float m[][4], COLLADAFW::Node *joint) { @@ -1207,7 +1328,7 @@ private: } #endif - void getUV(int uv_set_index, int uv_index[2], float *uv) + void getUV(int uv_index[2], float *uv) { switch(mVData->getType()) { case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT: @@ -1258,7 +1379,7 @@ private: } #endif - void set_face_uv(MTFace *mtface, UVDataWrapper &uvs, int uv_set_index, + void set_face_uv(MTFace *mtface, UVDataWrapper &uvs, COLLADAFW::IndexList& index_list, unsigned int *tris_indices) { int uv_indices[4][2]; @@ -1273,12 +1394,12 @@ private: uv_indices[i][1] = uv_index * 2 + 1; } - uvs.getUV(uv_set_index, uv_indices[0], mtface->uv[0]); - uvs.getUV(uv_set_index, uv_indices[1], mtface->uv[1]); - uvs.getUV(uv_set_index, uv_indices[2], mtface->uv[2]); + uvs.getUV(uv_indices[0], mtface->uv[0]); + uvs.getUV(uv_indices[1], mtface->uv[1]); + uvs.getUV(uv_indices[2], mtface->uv[2]); } - void set_face_uv(MTFace *mtface, UVDataWrapper &uvs, int uv_set_index, + void set_face_uv(MTFace *mtface, UVDataWrapper &uvs, COLLADAFW::IndexList& index_list, int index, bool quad) { int uv_indices[4][2]; @@ -1293,11 +1414,11 @@ private: uv_indices[i][1] = uv_index * 2 + 1; } - uvs.getUV(uv_set_index, uv_indices[0], mtface->uv[0]); - uvs.getUV(uv_set_index, uv_indices[1], mtface->uv[1]); - uvs.getUV(uv_set_index, uv_indices[2], mtface->uv[2]); + uvs.getUV(uv_indices[0], mtface->uv[0]); + uvs.getUV(uv_indices[1], mtface->uv[1]); + uvs.getUV(uv_indices[2], mtface->uv[2]); - if (quad) uvs.getUV(uv_set_index, uv_indices[3], mtface->uv[3]); + if (quad) uvs.getUV(uv_indices[3], mtface->uv[3]); #ifdef COLLADA_DEBUG /*if (quad) { @@ -1497,13 +1618,13 @@ private: // allocate UV layers unsigned int totuvset = mesh->getUVCoords().getInputInfosArray().getCount(); - for (i = 0; i < totuvset; i++) { - if (mesh->getUVCoords().getLength(i) == 0) { - totuvset = 0; - break; - } - } - + // for (i = 0; i < totuvset; i++) { + // if (mesh->getUVCoords().getLength(i) == 0) { + // totuvset = 0; + // break; + // } + // } + for (i = 0; i < totuvset; i++) { CustomData_add_layer(&me->fdata, CD_MTFACE, CD_CALLOC, NULL, me->totface); //this->set_layername_map[i] = CustomData_get_layer_name(&me->fdata, CD_MTFACE, i); @@ -1560,6 +1681,7 @@ private: set_face_indices(mface, indices, false); indices += 3; +#if 0 for (k = 0; k < totuvset; k++) { if (!index_list_array.empty() && index_list_array[k]) { // get mtface by face index and uv set index @@ -1567,6 +1689,15 @@ private: set_face_uv(&mtface[face_index], uvs, k, *index_list_array[k], index, false); } } +#else + for (k = 0; k < index_list_array.getCount(); k++) { + int uvset_index = index_list_array[k]->getSetIndex(); + + // get mtface by face index and uv set index + MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, uvset_index); + set_face_uv(&mtface[face_index], uvs, *index_list_array[k], index, false); + } +#endif test_index_face(mface, &me->fdata, face_index, 3); @@ -1598,6 +1729,7 @@ private: // set mtface for each uv set // it is assumed that all primitives have equal number of UV sets +#if 0 for (k = 0; k < totuvset; k++) { if (!index_list_array.empty() && index_list_array[k]) { // get mtface by face index and uv set index @@ -1605,6 +1737,15 @@ private: set_face_uv(&mtface[face_index], uvs, k, *index_list_array[k], index, mface->v4 != 0); } } +#else + for (k = 0; k < index_list_array.getCount(); k++) { + int uvset_index = index_list_array[k]->getSetIndex(); + + // get mtface by face index and uv set index + MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, uvset_index); + set_face_uv(&mtface[face_index], uvs, *index_list_array[k], index, mface->v4 != 0); + } +#endif test_index_face(mface, &me->fdata, face_index, vcount); @@ -1640,6 +1781,7 @@ private: set_face_indices(mface, tri_indices, false); +#if 0 for (unsigned int l = 0; l < totuvset; l++) { if (!index_list_array.empty() && index_list_array[l]) { // get mtface by face index and uv set index @@ -1647,6 +1789,16 @@ private: set_face_uv(&mtface[face_index], uvs, l, *index_list_array[l], uv_indices); } } +#else + for (unsigned int l = 0; l < index_list_array.getCount(); l++) { + int uvset_index = index_list_array[l]->getSetIndex(); + + // get mtface by face index and uv set index + MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, uvset_index); + set_face_uv(&mtface[face_index], uvs, *index_list_array[l], uv_indices); + } +#endif + test_index_face(mface, &me->fdata, face_index, 3); diff --git a/source/blender/collada/DocumentImporter.h b/source/blender/collada/DocumentImporter.h index 5dee101eb2d..babf8f65d7f 100644 --- a/source/blender/collada/DocumentImporter.h +++ b/source/blender/collada/DocumentImporter.h @@ -1,3 +1,26 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * 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. + * + * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov. + * + * ***** END GPL LICENSE BLOCK ***** + */ struct Main; struct bContext; diff --git a/source/blender/collada/SConscript b/source/blender/collada/SConscript index 6a1c71c9c86..b86e7312698 100644 --- a/source/blender/collada/SConscript +++ b/source/blender/collada/SConscript @@ -1,4 +1,30 @@ #!/usr/bin/python +# $Id$ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# The Original Code is Copyright (C) 2006, Blender Foundation +# All rights reserved. +# +# The Original Code is: all of this file. +# +# Contributor(s): Arystanbek Dyussenov, Nathan Letwory. +# +# ***** END GPL LICENSE BLOCK ***** + Import ('env') sources = env.Glob('*.cpp') diff --git a/source/blender/collada/collada.cpp b/source/blender/collada/collada.cpp index 5aed51c0ba2..a519db3332c 100644 --- a/source/blender/collada/collada.cpp +++ b/source/blender/collada/collada.cpp @@ -1,3 +1,26 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * 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. + * + * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov. + * + * ***** END GPL LICENSE BLOCK ***** + */ #include "BKE_main.h" #include "BKE_scene.h" #include "BKE_context.h" diff --git a/source/blender/collada/collada.h b/source/blender/collada/collada.h index cccca072b40..1c724bef6a6 100644 --- a/source/blender/collada/collada.h +++ b/source/blender/collada/collada.h @@ -1,3 +1,26 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * 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. + * + * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov. + * + * ***** END GPL LICENSE BLOCK ***** + */ #ifndef BLENDER_COLLADA_H #define BLENDER_COLLADA_H diff --git a/source/blender/collada/collada_internal.h b/source/blender/collada/collada_internal.h index 278cd37ac66..242fce749c4 100644 --- a/source/blender/collada/collada_internal.h +++ b/source/blender/collada/collada_internal.h @@ -1,3 +1,26 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * 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. + * + * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov. + * + * ***** END GPL LICENSE BLOCK ***** + */ #ifndef BLENDER_COLLADA_H #define BLENDER_COLLADA_H -- cgit v1.2.3