[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21620] branches/soc-2009-chingachgook/ source/blender/collada: *Exporter handles empty objects.
Chingiz Dyussenov
chingiz.ds at gmail.com
Thu Jul 16 09:56:17 CEST 2009
Revision: 21620
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21620
Author: chingachgook
Date: 2009-07-16 09:56:17 +0200 (Thu, 16 Jul 2009)
Log Message:
-----------
*Exporter handles empty objects.
*Added textures import.
TODO:
Fix images import.
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-16 07:11:46 UTC (rev 21619)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp 2009-07-16 07:56:17 UTC (rev 21620)
@@ -575,7 +575,7 @@
COLLADASW::Node node(mSW);
std::string ob_name(id_name(ob));
node.start();
-
+
node.addTranslate(ob->loc[0], ob->loc[1], ob->loc[2]);
// when animation time comes, replace a single <rotate> with 3, one for each axis
@@ -632,6 +632,9 @@
COLLADASW::InstanceLight instLa(mSW, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, ob_name));
instLa.add();
}
+ // empty object
+ else if (ob->type == OB_EMPTY) {
+ }
// write node for child object
Base *b = (Base*) sce->base.first;
@@ -639,7 +642,7 @@
Object *cob = b->object;
- if ((cob->type == OB_MESH || cob->type == OB_CAMERA || cob->type == OB_LAMP) && cob->parent == ob) {
+ if ((cob->type == OB_MESH || cob->type == OB_CAMERA || cob->type == OB_LAMP || cob->type == OB_EMPTY) && cob->parent == ob) {
// write node...
writeNodes(cob, sce);
}
@@ -655,7 +658,7 @@
while(base) {
Object *ob = base->object;
- if ((ob->type == OB_MESH || ob->type == OB_CAMERA || ob->type == OB_LAMP) && !ob->parent) {
+ if ((ob->type == OB_MESH || ob->type == OB_CAMERA || ob->type == OB_LAMP || ob->type == OB_EMPTY) && !ob->parent) {
// write nodes....
writeNodes(ob, sce);
Modified: branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp
===================================================================
--- branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp 2009-07-16 07:11:46 UTC (rev 21619)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp 2009-07-16 07:56:17 UTC (rev 21620)
@@ -12,6 +12,7 @@
#include "COLLADAFWEffect.h"
#include "COLLADAFWGeometry.h"
#include "COLLADAFWMesh.h"
+#include "COLLADAFWMeshPrimitive.h"
#include "COLLADAFWMeshVertexData.h"
#include "COLLADAFWFloatOrDoubleArray.h"
#include "COLLADAFWArrayPrimitiveType.h"
@@ -24,6 +25,10 @@
#include "COLLADAFWRotate.h"
#include "COLLADAFWAnimationCurve.h"
#include "COLLADAFWAnimationList.h"
+#include "COLLADAFWSkinController.h"
+#include "COLLADAFWColorOrTexture.h"
+#include "COLLADAFWSampler.h"
+#include "COLLADAFWTypes.h"
#include "COLLADASaxFWLLoader.h"
@@ -33,6 +38,8 @@
#include "BKE_main.h"
#include "BKE_customdata.h"
#include "BKE_library.h"
+#include "BKE_texture.h"
+#include "DNA_texture_types.h"
}
#include "BKE_mesh.h"
#include "BKE_global.h"
@@ -47,6 +54,7 @@
#include "DNA_meshdata_types.h"
#include "DNA_mesh_types.h"
#include "DNA_material_types.h"
+//#include "DNA_texture_types.h"
#include "DocumentImporter.h"
@@ -56,6 +64,7 @@
// #define COLLADA_DEBUG
+char *CustomData_get_layer_name(const struct CustomData *data, int type, int n);
const char *primTypeToStr(COLLADAFW::MeshPrimitive::PrimitiveType type)
{
@@ -96,6 +105,13 @@
return "UNKNOWN";
}
+/*
+
+ COLLADA Importer limitations:
+
+ - no multiple scene import, all objects are added to active scene
+
+ */
/** Class that needs to be implemented by a writer.
IMPORTANT: The write functions are called in arbitrary order.*/
class Writer: public COLLADAFW::IWriter
@@ -108,9 +124,12 @@
bContext *mContext;
std::map<COLLADAFW::UniqueId, Mesh*> uid_mesh_map; // geometry unique id-to-mesh map
+ std::map<COLLADAFW::UniqueId, Image*> uid_image_map;
std::map<COLLADAFW::UniqueId, Material*> uid_material_map;
std::map<COLLADAFW::UniqueId, Material*> uid_effect_map;
-
+ // maps for assigning textures to uv layers
+ std::map<COLLADAFW::TextureMapId, char*> set_layername_map;
+ std::map<COLLADAFW::TextureMapId, std::vector<MTex*> > index_mtex_map;
// this structure is used to assign material indices to faces
// when materials are assigned to an object
struct Primitive {
@@ -149,7 +168,8 @@
// TODO need also for angle conversion, time conversion...
};
- class UVDataWrapper {
+ class UVDataWrapper
+ {
COLLADAFW::MeshVertexData *mVData;
public:
UVDataWrapper(COLLADAFW::MeshVertexData& vdata) : mVData(&vdata)
@@ -273,104 +293,136 @@
// XXX could store the scene id, but do nothing for now
return true;
}
-
- void writeNode (COLLADAFW::Node *node, Scene *sce, Object *parent_ob = NULL)
+
+ // bind early created mesh to object, assign materials and textures
+ Object *create_mesh_object(Object *ob, Scene *sce, COLLADAFW::Node *node,
+ COLLADAFW::InstanceGeometry *geom)
{
- // XXX linking object with the first <instance_geometry>, though a node may have more of them...
- // TODO: join multiple <instance_...> meshes into 1, and link object with it
- COLLADAFW::InstanceGeometryPointerArray &geom = node->getInstanceGeometries();
- COLLADAFW::InstanceCameraPointerArray &camera = node->getInstanceCameras();
- COLLADAFW::InstanceLightPointerArray &lamp = node->getInstanceLights();
- COLLADAFW::InstanceControllerPointerArray &controller = node->getInstanceControllers();
- COLLADAFW::InstanceNodePointerArray &inst_node = node->getInstanceNodes();
- Object *ob;
- int k;
+ ob = add_object(sce, OB_MESH);
- // if node has <instance_geometries> - connect mesh with object
- // XXX currently only one <instance_geometry> in a node is supported
- if (geom.getCount() != 0) {
+ const std::string& id = node->getOriginalId();
+ if (id.length())
+ rename_id(&ob->id, (char*)id.c_str());
+
+ const COLLADAFW::UniqueId& geom_uid = geom->getInstanciatedObjectId();
+ if (uid_mesh_map.find(geom_uid) == uid_mesh_map.end()) {
+ // XXX report to user
+ // this could happen if a mesh was not created
+ // (e.g. if it contains unsupported geometry)
+ fprintf(stderr, "Couldn't find a mesh by UID.\n");
+ // delete created object
+ free_object(ob);
+ return NULL;
+ }
+ // replace ob->data freeing the old one
+ Mesh *old_mesh = (Mesh*)ob->data;
+ set_mesh(ob, uid_mesh_map[geom_uid]);
+ if (old_mesh->id.us == 0) free_libblock(&G.main->mesh, old_mesh);
+
+ // assign materials to object
+ // assign material indices to mesh faces
+ for (int k = 0; k < geom->getMaterialBindings().getCount(); k++) {
- ob = add_object(sce, OB_MESH);
+ const COLLADAFW::UniqueId& mat_uid = geom->getMaterialBindings()[k].getReferencedMaterial();
+ // check if material was properly written to map
+ if (uid_material_map.find(mat_uid) == uid_material_map.end()) {
+ fprintf(stderr, "Cannot find material by UID.\n");
+ continue;
+ }
- const std::string& id = node->getOriginalId();
- if (id.length())
- rename_id(&ob->id, (char*)id.c_str());
+ // assign textures to uv layers
+ // bvi_array "bind_vertex_input array"
+ COLLADAFW::InstanceGeometry::TextureCoordinateBindingArray& bvi_array =
+ geom->getMaterialBindings()[k].getTextureCoordinateBindingArray();
- const COLLADAFW::UniqueId& geom_uid = geom[0]->getInstanciatedObjectId();
- if (uid_mesh_map.find(geom_uid) == uid_mesh_map.end()) {
- // XXX report to user
- // this could happen if a mesh was not created
- // (e.g. if it contains unsupported geometry)
- fprintf(stderr, "Couldn't find a mesh by UID.\n");
- // delete created object
- free_object(ob);
- return;
- }
- // replace ob->data freeing the old one
- Mesh *old_mesh = (Mesh*)ob->data;
- set_mesh(ob, uid_mesh_map[geom_uid]);
- if (old_mesh->id.us == 0) free_libblock(&G.main->mesh, old_mesh);
-
- // assign materials to object
- // assign material indices to mesh faces
- for (k = 0; k < geom[0]->getMaterialBindings().getCount(); k++) {
+ for (int l = 0; l < bvi_array.getCount(); l++) {
- const COLLADAFW::UniqueId& mat_uid =
- geom[0]->getMaterialBindings()[k].getReferencedMaterial();
+ COLLADAFW::TextureMapId tex_index = bvi_array[l].textureMapId;
+ size_t set_index = bvi_array[l].setIndex;
+ char *layername = set_layername_map[set_index];
- if (uid_material_map.find(mat_uid) == uid_material_map.end()) {
-
- fprintf(stderr, "Cannot find material by UID.\n");
+ // check if mtexes were properly added to vector
+ if (index_mtex_map.find(tex_index) == index_mtex_map.end()) {
+ fprintf(stderr, "Cannot find vector of mtexes by texture map id.\n");
continue;
}
+ std::vector<MTex*> mtexes = index_mtex_map[tex_index];
+ std::vector<MTex*>::iterator it;
+ for (it = mtexes.begin(); it != mtexes.end(); it++) {
+ MTex *mtex = *it;
+ strcpy(mtex->uvname, layername);
+ }
+ }
+
+ assign_material(ob, uid_material_map[mat_uid], ob->totcol + 1);
+
+ MaterialIdPrimitiveArrayMap& mat_prim_map = geom_uid_mat_mapping_map[geom_uid];
+ COLLADAFW::MaterialId mat_id = geom->getMaterialBindings()[k].getMaterialId();
+
+ // if there's geometry that uses this material,
+ // set mface->mat_nr=k for each face in that geometry
+ if (mat_prim_map.find(mat_id) != mat_prim_map.end()) {
- assign_material(ob, uid_material_map[mat_uid], ob->totcol + 1);
+ std::vector<Primitive>& prims = mat_prim_map[mat_id];
- MaterialIdPrimitiveArrayMap& mat_prim_map = geom_uid_mat_mapping_map[geom_uid];
- COLLADAFW::MaterialId mat_id = geom[0]->getMaterialBindings()[k].getMaterialId();
+ std::vector<Primitive>::iterator it;
- // if there's geometry that uses this material,
- // set mface->mat_nr=k for each face in that geometry
- if (mat_prim_map.find(mat_id) != mat_prim_map.end()) {
+ for (it = prims.begin(); it != prims.end(); it++) {
+ Primitive& prim = *it;
- std::vector<Primitive>& prims = mat_prim_map[mat_id];
-
- std::vector<Primitive>::iterator it;
-
- for (it = prims.begin(); it != prims.end(); it++) {
- Primitive& prim = *it;
-
- int l = 0;
- while (l++ < prim.totface) {
- prim.mface->mat_nr = k;
- prim.mface++;
- }
+ int l = 0;
+ while (l++ < prim.totface) {
+ prim.mface->mat_nr = k;
+ prim.mface++;
}
}
}
}
- // checking of all other possible instances
+ return ob;
+ }
+
+ void write_node (COLLADAFW::Node *node, Scene *sce, Object *parent_ob = NULL)
+ {
+ // XXX linking object with the first <instance_geometry>, though a node may have more of them...
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list