[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22008] branches/soc-2009-chingachgook/ source/blender/collada: Some small changes to textures import/export.
Chingiz Dyussenov
chingiz.ds at gmail.com
Wed Jul 29 13:32:42 CEST 2009
Revision: 22008
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22008
Author: chingachgook
Date: 2009-07-29 13:32:42 +0200 (Wed, 29 Jul 2009)
Log Message:
-----------
Some small changes to textures import/export.
Modified Paths:
--------------
branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp
branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp
Modified: branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp
===================================================================
--- branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp 2009-07-29 08:02:50 UTC (rev 22007)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp 2009-07-29 11:32:42 UTC (rev 22008)
@@ -1009,9 +1009,14 @@
// set shader type - one of three blinn, phong or lambert
if (ma->spec_shader == MA_SPEC_BLINN) {
ep.setShaderType(COLLADASW::EffectProfile::BLINN);
+ // shininess
+ ep.setShininess(ma->spec);
}
else if (ma->spec_shader == MA_SPEC_PHONG) {
ep.setShaderType(COLLADASW::EffectProfile::PHONG);
+ // shininess
+ // XXX not sure about this
+ ep.setShininess(ma->har / 4);
}
else {
// XXX write warning "Current shader type is not supported"
@@ -1026,8 +1031,6 @@
}
// transparency
ep.setTransparency(ma->alpha);
- // shininess
- ep.setShininess(ma->spec);
// emission
COLLADASW::ColorOrTexture cot = getcol(0.0f, 0.0f, 0.0f, 1.0f);
ep.setEmission(cot);
Modified: branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp
===================================================================
--- branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp 2009-07-29 08:02:50 UTC (rev 22007)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp 2009-07-29 11:32:42 UTC (rev 22008)
@@ -361,12 +361,7 @@
};
typedef std::map<COLLADAFW::MaterialId, std::vector<Primitive> > MaterialIdPrimitiveArrayMap;
std::map<COLLADAFW::UniqueId, MaterialIdPrimitiveArrayMap> geom_uid_mat_mapping_map; // crazy name!
- /*
- // maps for assigning textures to uv layers
- //std::map<COLLADAFW::TextureMapId, char*> set_layername_map;
- typedef std::map<COLLADAFW::TextureMapId, std::vector<MTex*> > TexIndexTextureArrayMap;
- std::map<Material*, TexIndexTextureArrayMap> material_texture_mapping_map;
- */
+
class UVDataWrapper
{
COLLADAFW::MeshVertexData *mVData;
@@ -693,21 +688,30 @@
MeshImporter(ArmatureImporter *arm, Scene *sce) : scene(sce), armature_importer(arm) {}
- MTex *assign_textures_to_uvlayer(COLLADAFW::InstanceGeometry::TextureCoordinateBinding &ctexture, Mesh **me, TexIndexTextureArrayMap& texindex_texarray_map, MTex *color_texture)
+
+ MTex *assign_textures_to_uvlayer(COLLADAFW::InstanceGeometry::TextureCoordinateBinding &ctexture,
+ Mesh *me, TexIndexTextureArrayMap& texindex_texarray_map,
+ MTex *color_texture)
{
+
COLLADAFW::TextureMapId texture_index = ctexture.textureMapId;
- size_t set_index = ctexture.setIndex;
- char *uvname = CustomData_get_layer_name(&(*me)->fdata, CD_MTFACE, set_index);
+ char *uvname = CustomData_get_layer_name(&me->fdata, CD_MTFACE, ctexture.setIndex);
+
if (texindex_texarray_map.find(texture_index) == texindex_texarray_map.end()) {
+
fprintf(stderr, "Cannot find texture array by texture index.\n");
return NULL;
}
- // assign uvlayer name to texture
+
std::vector<MTex*> textures = texindex_texarray_map[texture_index];
+
std::vector<MTex*>::iterator it;
+
for (it = textures.begin(); it != textures.end(); it++) {
+
MTex *texture = *it;
+
if (texture) {
strcpy(texture->uvname, uvname);
if (texture->mapto == MAP_COL) color_texture = texture;
@@ -717,40 +721,46 @@
}
MTFace *assign_material_to_geom(COLLADAFW::InstanceGeometry::MaterialBinding cmaterial,
- std::map<COLLADAFW::UniqueId, Material*>& uid_material_map,
- Object *ob, Mesh *me, const COLLADAFW::UniqueId *geom_uid,
- MTex **color_texture, char *layername, MTFace *texture_face,
- std::map<Material*, TexIndexTextureArrayMap>& material_texture_mapping_map, int mat_index)
+ std::map<COLLADAFW::UniqueId, Material*>& uid_material_map,
+ Object *ob, const COLLADAFW::UniqueId *geom_uid,
+ MTex **color_texture, char *layername, MTFace *texture_face,
+ std::map<Material*, TexIndexTextureArrayMap>& material_texture_mapping_map, int mat_index)
{
+ Mesh *me = (Mesh*)ob->data;
const COLLADAFW::UniqueId& ma_uid = cmaterial.getReferencedMaterial();
- unsigned int j;
+
// do we know this material?
if (uid_material_map.find(ma_uid) == uid_material_map.end()) {
+
fprintf(stderr, "Cannot find material by UID.\n");
return NULL;
}
+
Material *ma = uid_material_map[ma_uid];
+ assign_material(ob, ma, ob->totcol + 1);
+ COLLADAFW::InstanceGeometry::TextureCoordinateBindingArray& tex_array =
+ cmaterial.getTextureCoordinateBindingArray();
TexIndexTextureArrayMap texindex_texarray_map = material_texture_mapping_map[ma];
+ unsigned int i;
+ // loop through <bind_vertex_inputs>
+ for (i = 0; i < tex_array.getCount(); i++) {
+
+ *color_texture = assign_textures_to_uvlayer(tex_array[i], me, texindex_texarray_map,
+ *color_texture);
+ }
- COLLADAFW::InstanceGeometry::TextureCoordinateBindingArray& tex_array = cmaterial.getTextureCoordinateBindingArray();
-
- // loop through material's textures
- for (j = 0; j < tex_array.getCount(); j++) {
- *color_texture = assign_textures_to_uvlayer(tex_array[j], &me, texindex_texarray_map, *color_texture);
- }
// if material has color texture
if (*color_texture && strlen((*color_texture)->uvname)) {
- // multiple color textures may refer to the same uvlayer,
- // set tface only once, otherwise images will rewrite each other
+ // set tface
if (strcmp(layername, (*color_texture)->uvname) != 0) {
- texture_face = (MTFace*)CustomData_get_layer_named(&me->fdata, CD_MTFACE, (*color_texture)->uvname);
+
+ texture_face = (MTFace*)CustomData_get_layer_named(&me->fdata, CD_MTFACE,
+ (*color_texture)->uvname);
strcpy(layername, (*color_texture)->uvname);
}
}
- assign_material(ob, ma, ob->totcol + 1);
-
MaterialIdPrimitiveArrayMap& mat_prim_map = geom_uid_mat_mapping_map[*geom_uid];
COLLADAFW::MaterialId mat_id = cmaterial.getMaterialId();
@@ -763,12 +773,10 @@
for (it = prims.begin(); it != prims.end(); it++) {
Primitive& prim = *it;
- j = 0;
- while (j++ < prim.totface) {
+ i = 0;
+ while (i++ < prim.totface) {
prim.mface->mat_nr = mat_index;
prim.mface++;
-
- // if tface was set
// bind image to tface
if (texture_face && (*color_texture)) {
texture_face->mode = TF_TEX;
@@ -778,11 +786,11 @@
}
}
}
-
+
return texture_face;
}
- // bind object to mesh
+
Object *create_mesh_object(COLLADAFW::Node *node, COLLADAFW::InstanceGeometry *geom,
bool isController,
std::map<COLLADAFW::UniqueId, Material*>& uid_material_map,
@@ -792,13 +800,16 @@
// check if node instanciates controller or geometry
if (isController) {
+
geom_uid = armature_importer->get_geometry_uid(*geom_uid);
+
if (!geom_uid) {
fprintf(stderr, "Couldn't find a mesh UID by controller's UID.\n");
return NULL;
}
}
else {
+
if (uid_mesh_map.find(*geom_uid) == uid_mesh_map.end()) {
// this could happen if a mesh was not created
// (e.g. if it contains unsupported geometry)
@@ -822,7 +833,6 @@
if (old_mesh->id.us == 0) free_libblock(&G.main->mesh, old_mesh);
- Mesh *me = (Mesh*)ob->data;
char layername[100];
MTFace *texture_face = NULL;
MTex *color_texture = NULL;
@@ -831,10 +841,11 @@
// loop through geom's materials
for (unsigned int i = 0; i < mat_array.getCount(); i++) {
- texture_face = assign_material_to_geom(mat_array[i], uid_material_map, ob, me, geom_uid, &color_texture, layername, texture_face, material_texture_mapping_map, i);
+ texture_face = assign_material_to_geom(mat_array[i], uid_material_map, ob, geom_uid,
+ &color_texture, layername, texture_face,
+ material_texture_mapping_map, i);
}
-
return ob;
}
@@ -1221,6 +1232,7 @@
ma->mtex[i]->texco = TEXCO_UV;
ma->mtex[i]->tex = add_texture("texture");
ma->mtex[i]->tex->type = TEX_IMAGE;
+ ma->mtex[i]->tex->imaflag &= ~TEX_USEALPHA;
ma->mtex[i]->tex->ima = uid_image_map[ima_uid];
texindex_texarray_map[ctex.getTextureMapId()].push_back(ma->mtex[i]);
@@ -1240,7 +1252,8 @@
// phong
else if (shader == COLLADAFW::EffectCommon::SHADER_PHONG) {
ma->spec_shader = MA_SPEC_PHONG;
- ma->spec = ef->getShininess().getFloatValue();
+ // XXX setting specular hardness instead of specularity intensity
+ ma->har = ef->getShininess().getFloatValue() * 4;
}
// lambert
else if (shader == COLLADAFW::EffectCommon::SHADER_LAMBERT) {
@@ -1384,6 +1397,25 @@
fprintf(stderr, "Cannot create camera. \n");
return true;
}
+ COLLADAFW::Camera::CameraType type = camera->getCameraType();
+ switch(type) {
+ case COLLADAFW::Camera::ORTHOGRAPHIC:
+ {
+ cam->type = CAM_ORTHO;
+ }
+ break;
+ case COLLADAFW::Camera::PERSPECTIVE:
+ {
+ cam->type = CAM_PERSP;
+ }
+ break;
+ case COLLADAFW::Camera::UNDEFINED_CAMERATYPE:
+ {
+ fprintf(stderr, "Current camera type is not supported. \n");
+ cam->type = CAM_PERSP;
+ }
+ break;
+ }
this->uid_camera_map[camera->getUniqueId()] = cam;
// XXX import camera options
return true;
More information about the Bf-blender-cvs
mailing list