2011-02-21 08:38:53 +00:00
/*
2010-10-05 00:05:14 +00:00
* * * * * * 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 * * * * *
*/
2011-02-21 08:38:53 +00:00
/** \file MeshImporter.h
* \ ingroup collada
*/
2012-02-17 18:59:41 +00:00
# ifndef __MESHIMPORTER_H__
# define __MESHIMPORTER_H__
2010-10-05 00:05:14 +00:00
# include <map>
# include <vector>
# include "COLLADAFWIndexList.h"
2013-03-02 15:58:13 +00:00
# include "COLLADAFWPolygons.h"
2010-10-05 00:05:14 +00:00
# include "COLLADAFWInstanceGeometry.h"
# include "COLLADAFWMaterialBinding.h"
# include "COLLADAFWMesh.h"
# include "COLLADAFWMeshVertexData.h"
# include "COLLADAFWNode.h"
# include "COLLADAFWTextureCoordinateBinding.h"
# include "COLLADAFWTypes.h"
# include "COLLADAFWUniqueId.h"
2012-08-12 17:13:07 +00:00
# include "ArmatureImporter.h"
# include "collada_utils.h"
extern " C " {
# include "BLI_edgehash.h"
2010-10-05 00:05:14 +00:00
# include "DNA_material_types.h"
# include "DNA_mesh_types.h"
# include "DNA_meshdata_types.h"
# include "DNA_object_types.h"
# include "DNA_scene_types.h"
# include "DNA_texture_types.h"
2012-05-16 11:21:03 +00:00
}
2010-10-05 00:05:14 +00:00
// only for ArmatureImporter to "see" MeshImporter::get_object_by_geom_uid
class MeshImporterBase
{
public :
virtual Object * get_object_by_geom_uid ( const COLLADAFW : : UniqueId & geom_uid ) = 0 ;
2013-01-21 13:45:49 +00:00
virtual Mesh * get_mesh_by_geom_uid ( const COLLADAFW : : UniqueId & mesh_uid ) = 0 ;
2013-02-12 17:52:18 +00:00
virtual std : : string * get_geometry_name ( const std : : string & mesh_name ) = 0 ;
2010-10-05 00:05:14 +00:00
} ;
class UVDataWrapper
{
COLLADAFW : : MeshVertexData * mVData ;
public :
UVDataWrapper ( COLLADAFW : : MeshVertexData & vdata ) ;
# ifdef COLLADA_DEBUG
void print ( ) ;
# endif
2011-07-06 21:37:31 +00:00
void getUV ( int uv_index , float * uv ) ;
2010-10-05 00:05:14 +00:00
} ;
2014-05-01 14:52:10 +02:00
class VCOLDataWrapper
{
COLLADAFW : : MeshVertexData * mVData ;
public :
VCOLDataWrapper ( COLLADAFW : : MeshVertexData & vdata ) ;
void get_vcol ( int v_index , MLoopCol * mloopcol ) ;
} ;
2010-10-05 00:05:14 +00:00
class MeshImporter : public MeshImporterBase
{
private :
2010-11-03 22:44:39 +00:00
UnitConverter * unitconverter ;
2010-10-05 00:05:14 +00:00
Scene * scene ;
ArmatureImporter * armature_importer ;
2013-02-12 17:52:18 +00:00
std : : map < std : : string , std : : string > mesh_geom_map ; // needed for correct shape key naming
2010-10-05 00:05:14 +00:00
std : : map < COLLADAFW : : UniqueId , Mesh * > uid_mesh_map ; // geometry unique id-to-mesh map
std : : map < COLLADAFW : : UniqueId , Object * > uid_object_map ; // geom uid-to-object
2012-08-12 17:13:07 +00:00
std : : vector < Object * > imported_objects ; // list of imported objects
2013-03-02 15:58:13 +00:00
// this structure is used to assign material indices to polygons
2010-10-05 00:05:14 +00:00
// it holds a portion of Mesh faces and corresponds to a DAE primitive list (<triangles>, <polylist>, etc.)
struct Primitive {
2013-03-02 15:58:13 +00:00
MPoly * mpoly ;
unsigned int totpoly ;
2010-10-05 00:05:14 +00:00
} ;
typedef std : : map < COLLADAFW : : MaterialId , std : : vector < Primitive > > MaterialIdPrimitiveArrayMap ;
std : : map < COLLADAFW : : UniqueId , MaterialIdPrimitiveArrayMap > geom_uid_mat_mapping_map ; // crazy name!
2011-03-09 01:13:28 +00:00
std : : multimap < COLLADAFW : : UniqueId , COLLADAFW : : UniqueId > materials_mapped_to_geom ; //< materials that have already been mapped to a geometry. A pair of geom uid and mat uid, one geometry can have several materials
2010-10-05 00:05:14 +00:00
2013-03-02 15:58:13 +00:00
void set_poly_indices ( MPoly * mpoly ,
MLoop * mloop ,
int loop_index ,
unsigned int * indices ,
int loop_count ) ;
void set_face_uv ( MLoopUV * mloopuv ,
UVDataWrapper & uvs ,
int loop_index ,
COLLADAFW : : IndexList & index_list ,
int count ) ;
2010-10-05 00:05:14 +00:00
2014-05-01 14:52:10 +02:00
void set_vcol ( MLoopCol * mloopcol ,
VCOLDataWrapper & vob ,
int loop_index ,
COLLADAFW : : IndexList & index_list ,
int count ) ;
2010-10-05 00:05:14 +00:00
# ifdef COLLADA_DEBUG
void print_index_list ( COLLADAFW : : IndexList & index_list ) ;
# endif
bool is_nice_mesh ( COLLADAFW : : Mesh * mesh ) ;
void read_vertices ( COLLADAFW : : Mesh * mesh , Mesh * me ) ;
2013-03-02 15:58:13 +00:00
2012-05-16 11:21:03 +00:00
bool primitive_has_useable_normals ( COLLADAFW : : MeshPrimitive * mp ) ;
bool primitive_has_faces ( COLLADAFW : : MeshPrimitive * mp ) ;
static void mesh_add_edges ( Mesh * mesh , int len ) ;
unsigned int get_loose_edge_count ( COLLADAFW : : Mesh * mesh ) ;
CustomData create_edge_custom_data ( EdgeHash * eh ) ;
2013-03-02 15:58:13 +00:00
void allocate_poly_data ( COLLADAFW : : Mesh * collada_mesh , Mesh * me ) ;
2012-05-16 11:21:03 +00:00
2010-10-05 00:05:14 +00:00
// TODO: import uv set names
2013-03-02 15:58:13 +00:00
void read_polys ( COLLADAFW : : Mesh * mesh , Mesh * me ) ;
2012-05-16 11:21:03 +00:00
void read_lines ( COLLADAFW : : Mesh * mesh , Mesh * me ) ;
2013-03-02 15:58:13 +00:00
unsigned int get_vertex_count ( COLLADAFW : : Polygons * mp , int index ) ;
2010-10-05 00:05:14 +00:00
2011-01-27 19:39:06 +00:00
void get_vector ( float v [ 3 ] , COLLADAFW : : MeshVertexData & arr , int i , int stride ) ;
2010-10-05 00:05:14 +00:00
2013-03-02 15:58:13 +00:00
bool is_flat_face ( unsigned int * nind , COLLADAFW : : MeshVertexData & nor , int count ) ;
2012-08-12 17:13:07 +00:00
std : : vector < Object * > get_all_users_of ( Mesh * reference_mesh ) ;
2010-10-05 00:05:14 +00:00
public :
2010-10-09 21:17:14 +00:00
MeshImporter ( UnitConverter * unitconv , ArmatureImporter * arm , Scene * sce ) ;
2010-10-05 00:05:14 +00:00
virtual Object * get_object_by_geom_uid ( const COLLADAFW : : UniqueId & geom_uid ) ;
2013-01-21 13:45:49 +00:00
virtual Mesh * get_mesh_by_geom_uid ( const COLLADAFW : : UniqueId & geom_uid ) ;
2010-10-05 00:05:14 +00:00
MTex * assign_textures_to_uvlayer ( COLLADAFW : : TextureCoordinateBinding & ctexture ,
2013-03-15 10:48:48 +00:00
Mesh * me , TexIndexTextureArrayMap & texindex_texarray_map ,
MTex * color_texture ) ;
2012-08-12 17:13:07 +00:00
2013-01-21 13:45:49 +00:00
void optimize_material_assignements ( ) ;
2012-08-12 17:13:07 +00:00
2010-10-05 00:05:14 +00:00
MTFace * assign_material_to_geom ( COLLADAFW : : MaterialBinding cmaterial ,
2013-03-15 10:48:48 +00:00
std : : map < COLLADAFW : : UniqueId , Material * > & uid_material_map ,
Object * ob , const COLLADAFW : : UniqueId * geom_uid ,
char * layername , MTFace * texture_face ,
std : : map < Material * , TexIndexTextureArrayMap > & material_texture_mapping_map , short mat_index ) ;
2010-10-05 00:05:14 +00:00
Object * create_mesh_object ( COLLADAFW : : Node * node , COLLADAFW : : InstanceGeometry * geom ,
2013-03-15 10:48:48 +00:00
bool isController ,
std : : map < COLLADAFW : : UniqueId , Material * > & uid_material_map ,
std : : map < Material * , TexIndexTextureArrayMap > & material_texture_mapping_map ) ;
2010-10-05 00:05:14 +00:00
// create a mesh storing a pointer in a map so it can be retrieved later by geometry UID
bool write_geometry ( const COLLADAFW : : Geometry * geom ) ;
2013-02-13 08:53:05 +00:00
std : : string * get_geometry_name ( const std : : string & mesh_name ) ;
2010-10-05 00:05:14 +00:00
} ;
# endif