[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20693] branches/soc-2009-chingachgook/ source/blender/collada: Basic exporter writing only vertices and faces converted to triangles.
Chingiz Dyussenov
chingiz.ds at gmail.com
Sun Jun 7 07:14:25 CEST 2009
Revision: 20693
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20693
Author: chingachgook
Date: 2009-06-07 07:14:25 +0200 (Sun, 07 Jun 2009)
Log Message:
-----------
Basic exporter writing only vertices and faces converted to triangles.
Spen't lots of time debugging the misbehaving COLLADASW::URI
constructor. The problem is although I pass correct parameters to it,
the resulting file ends up having empty url attributes. It is either a
bug in OpenCollada or my code - couldn't figure this out.
Modified Paths:
--------------
branches/soc-2009-chingachgook/source/blender/collada/collada.cpp
Added Paths:
-----------
branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp
branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.h
Added: branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp
===================================================================
--- branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp (rev 0)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp 2009-06-07 05:14:25 UTC (rev 20693)
@@ -0,0 +1,308 @@
+#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
+#include "DNA_meshdata_types.h"
+extern "C"
+{
+#include "BKE_DerivedMesh.h"
+}
+#include "BKE_scene.h"
+
+#include "DocumentExporter.h"
+
+#include <COLLADASWAsset.h>
+#include <COLLADASWLibraryVisualScenes.h>
+#include <COLLADASWNode.h>
+#include <COLLADASWLibraryGeometries.h>
+#include <COLLADASWSource.h>
+#include <COLLADASWInstanceGeometry.h>
+#include <COLLADASWInputList.h>
+#include <COLLADASWScene.h>
+#include <COLLADASWPrimitves.h>
+#include <COLLADASWVertices.h>
+
+// not good idea - there are for example blender Scene and COLLADASW::Scene
+//using namespace COLLADASW;
+
+
+class GeometryExporter : COLLADASW::LibraryGeometries
+{
+public:
+ GeometryExporter(COLLADASW::StreamWriter *sw) : COLLADASW::LibraryGeometries(sw) {}
+
+ void exportGeom(Scene *sce)
+ {
+ // iterate over objects in scene
+ Base *base= (Base*) sce->base.first;
+ while(base) {
+
+ Object *ob = base->object;
+
+ // only meshes
+ if (ob->type == OB_MESH && ob->data) {
+
+ DerivedMesh *dm = mesh_get_derived_final(sce, ob, CD_MASK_BAREMESH);
+ MVert *mverts = dm->getVertArray(dm);
+ MFace *mfaces = dm->getFaceArray(dm);
+ int totfaces = dm->getNumFaces(dm);
+ int totverts = dm->getNumVerts(dm);
+
+ std::string geom_name(ob->id.name);
+
+ //openMesh(geoId, geoName, meshId)
+ openMesh(geom_name, "", "");
+
+ //<source>
+ createSource(sce, mSW, geom_name, dm);
+
+ //<vertices>
+ COLLADASW::Vertices verts(mSW);
+ verts.setId(getIdBySemantics(geom_name, COLLADASW::VERTEX));
+ COLLADASW::InputList &input_list = verts.getInputList();
+ COLLADASW::Input input(COLLADASW::POSITION,
+ getUrlBySemantics(geom_name, COLLADASW::POSITION));
+ input_list.push_back(input);
+ verts.add();
+
+ //triangles
+ COLLADASW::Triangles tris(mSW);
+ tris.setCount(getTriCount(mfaces, totfaces));
+ //tris.setMaterial();
+ COLLADASW::InputList &til = tris.getInputList();
+ /*added semantic, source, offset attributes to <input>
+ I am not sure whether it's right or not
+ */
+
+ COLLADASW::Input input2(COLLADASW::VERTEX,
+ getUrlBySemantics(geom_name, COLLADASW::VERTEX), 0);
+ til.push_back(input2);
+
+ tris.prepareToAppendValues();
+
+ int i;
+ for (i = 0; i < totfaces; i++) {
+ MFace *f = &mfaces[i];
+
+ // if triangle
+ if (f->v4 == 0) {
+ tris.appendValues(f->v1, f->v2, f->v3);
+ }
+ // quad
+ else {
+ tris.appendValues(f->v1, f->v2, f->v3);
+ tris.appendValues(f->v3, f->v4, f->v1);
+ }
+ }
+
+ tris.closeElement();
+ tris.finish();
+
+ closeMesh();
+ closeGeometry();
+
+ dm->release(dm);
+
+
+ }
+ base= base->next;
+ }
+
+ /* //openMesh(geoId, geoName, meshId)
+ void openMesh("", "", "");
+
+ //<source>
+ void sourceCreator(&sce);
+
+ //<vertices>
+ Vertices verts(&sw);
+ verts.setId();
+ Input input(POSITION, source);
+ InputList inputL(&sw);
+ inputL.push_back(input);
+ verts.add();
+
+ //triangles
+ PrimitivesBase pBase(&sw, CSWC::CSW_ELEMENT_TRIANGLES);
+ Primitive<CSWC::CSW_ELEMENT_TRIANGLES> prim(&sw);
+ prim.setCount();
+ prim.setMaterial();
+ InputList &til = pBase.getInputList();
+ til.push_back(input);
+
+ prim.prepareToAppendValues();
+ prim.appendValues();
+ prim.closeElement();
+ prim.finish();
+
+ closeMesh();
+ closeGeometry();
+ */
+ }
+
+ void createSource(Scene *sce, COLLADASW::StreamWriter *sw,
+ std::string geom_name, DerivedMesh *dm)
+ {
+ int totverts = dm->getNumVerts(dm);
+ MVert *verts = dm->getVertArray(dm);
+
+ //Source<float, "float_array", "float"> source(sw);
+ COLLADASW::FloatSourceF source(sw);
+ source.setId(getIdBySemantics(geom_name, COLLADASW::POSITION));
+ source.setArrayId(geom_name + ARRAY_ID_SUFFIX);
+ source.setAccessorCount(totverts);
+ source.setAccessorStride(3);
+ COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList();
+ param.push_back("X");
+ param.push_back("Y");
+ param.push_back("Z");
+ /*main function, it creates <source id = "">, <float_array id = ""
+ count = ""> */
+ source.prepareToAppendValues();
+ //appends data to <float_array>
+ int i = 0;
+ for (i = 0; i < totverts; i++) {
+ source.appendValues(verts[i].co[0], verts[i].co[1], verts[i].co[2]);
+ }
+ /*closes <float_array>, adds
+ <technique_common>
+ <accessor source = "" count = "" stride = "" >,
+ </source> */
+ source.finish();
+
+ }
+
+ std::string getIdBySemantics(std::string geom_name, COLLADASW::Semantics type) {
+ return geom_name +
+ getSuffixBySemantic(type);
+ }
+
+ COLLADASW::URI getUrlBySemantics(std::string geom_name, COLLADASW::Semantics type) {
+ std::string id(getIdBySemantics(geom_name, type));
+ return COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, id);
+ }
+
+ int getTriCount(MFace *faces, int totface) {
+ int i;
+ int tris = 0;
+ for (i = 0; i < totface; i++) {
+ // if quad
+ if (faces[i].v4 != 0)
+ tris += 2;
+ else
+ tris++;
+ }
+
+ return tris;
+ }
+};
+
+
+class SceneExporter: COLLADASW::LibraryVisualScenes
+{
+public:
+ SceneExporter(COLLADASW::StreamWriter *sw) : COLLADASW::LibraryVisualScenes(sw) {}
+
+ void exportScene(Scene *sce) {
+ //<library_visual_scenes><visual_scene>
+ openVisualScene(sce->id.name, "");
+
+ //<node> for each mesh object
+ Base *base= (Base*) sce->base.first;
+ while(base) {
+ Object *ob = base->object;
+
+ if (ob->type == OB_MESH && ob->data) {
+ COLLADASW::Node node(mSW);
+ node.start();
+
+ node.addTranslate(ob->loc[0], ob->loc[1], ob->loc[2]);
+ // node.addRotate(); // XXX no conversion needed?
+ node.addScale(ob->size[0], ob->size[1], ob->size[2]);
+
+ COLLADASW::InstanceGeometry instGeom(mSW);
+ std::string ob_name(ob->id.name);
+ instGeom.setUrl(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING,
+ ob_name));
+ instGeom.add();
+
+ node.end();
+ }
+ base= base->next;
+ }
+
+ //</visual_scene></library_visual_scenes>
+ closeVisualScene();
+
+ closeLibrary();
+ }
+};
+
+/*
+
+ <library_visual_scenes>
+ <visual_scene>
+ <node>
+ <translate>
+ <rotate>
+ <instance_geometry>
+ </node>
+ ...
+ </visual_scene>
+ </library_visual_scenes>
+
+ <library_geometries>
+ <geometry id="">
+ <mesh>
+ <source id="source_id">
+ <float_array id="" count="">
+ 0.0 0.0 0.0
+ </float_array>
+ </source>
+
+ <vertices>
+ <input source="#source_id" ...>
+ </vertices>
+
+ <triangles>
+ <input>
+ <p>
+ </triangles>
+
+ </mesh>
+ </geometry>
+ </library_geometries>
+
+ */
+
+void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename)
+{
+ COLLADASW::StreamWriter sw(COLLADABU::NativeString(COLLADABU::String(filename)));
+
+ //open <Collada>
+ sw.startDocument();
+
+ //<asset>
+ Asset asset(&sw);
+ asset.setUpAxisType(Asset::Z_UP);
+ asset.add();
+
+ SceneExporter se(&sw);
+ se.exportScene(sce);
+
+ //<library_geometries>
+ GeometryExporter ge(&sw);
+ ge.exportGeom(sce);
+
+ //<scene>
+ std::string scene_name(sce->id.name);
+ COLLADASW::Scene scene(&sw, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING,
+ scene_name));
+ scene.add();
+
+ //close <Collada>
+ sw.endDocument();
+
+}
+
+void DocumentExporter::exportScenes(const char* filename)
+{
+}
Added: branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.h
===================================================================
--- branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.h (rev 0)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.h 2009-06-07 05:14:25 UTC (rev 20693)
@@ -0,0 +1,7 @@
+
+class DocumentExporter
+{
+ public:
+ void exportCurrentScene(Scene *sce, const char* filename);
+ void exportScenes(const char* filename);
+};
Modified: branches/soc-2009-chingachgook/source/blender/collada/collada.cpp
===================================================================
--- branches/soc-2009-chingachgook/source/blender/collada/collada.cpp 2009-06-07 05:06:54 UTC (rev 20692)
+++ branches/soc-2009-chingachgook/source/blender/collada/collada.cpp 2009-06-07 05:14:25 UTC (rev 20693)
@@ -1,5 +1,6 @@
#include <stdio.h>
#include "BKE_scene.h"
+#include "DocumentExporter.h"
extern "C"
{
@@ -10,7 +11,10 @@
int collada_export(Scene *sce, const char *filepath)
{
- fprintf(stderr, "Hello, world! %s\n", filepath);
+
+ DocumentExporter exp;
+ exp.exportCurrentScene(sce, filepath);
+
return 1;
}
}
More information about the Bf-blender-cvs
mailing list