[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20788] branches/soc-2009-chingachgook/ source/blender/collada/DocumentExporter.cpp: Added uvs export.
Chingiz Dyussenov
chingiz.ds at gmail.com
Wed Jun 10 20:02:54 CEST 2009
Revision: 20788
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20788
Author: chingachgook
Date: 2009-06-10 20:02:54 +0200 (Wed, 10 Jun 2009)
Log Message:
-----------
Added uvs export. Textures and materials are not exported yet.
Modified Paths:
--------------
branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp
Modified: branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp
===================================================================
--- branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp 2009-06-10 16:34:36 UTC (rev 20787)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp 2009-06-10 18:02:54 UTC (rev 20788)
@@ -1,6 +1,7 @@
#include "DNA_scene_types.h"
#include "DNA_object_types.h"
#include "DNA_meshdata_types.h"
+#include "DNA_mesh_types.h"
extern "C"
{
#include "BKE_DerivedMesh.h"
@@ -48,6 +49,7 @@
MFace *mfaces = dm->getFaceArray(dm);
int totfaces = dm->getNumFaces(dm);
int totverts = dm->getNumVerts(dm);
+ bool checkTexcoords = false;
std::string geom_name(ob->id.name);
@@ -57,6 +59,7 @@
//<source>
createVertsSource(sce, mSW, geom_name, dm);
createNormalsSource(sce, mSW, geom_name, dm);
+ checkTexcoords = createTexcoordsSource(sce, mSW, geom_name, dm, (Mesh*)ob->data);
//<vertices>
COLLADASW::Vertices verts(mSW);
@@ -80,24 +83,63 @@
getUrlBySemantics(geom_name, COLLADASW::VERTEX), 0);
COLLADASW::Input input3(COLLADASW::NORMAL,
getUrlBySemantics(geom_name, COLLADASW::NORMAL), 0);
+
til.push_back(input2);
til.push_back(input3);
-
+
+ //if mesh has uv coords writes input for TEXCOORD
+ if (checkTexcoords == true)
+ {
+ COLLADASW::Input input4(COLLADASW::TEXCOORD,
+ getUrlBySemantics(geom_name, COLLADASW::TEXCOORD), 1);
+ til.push_back(input4);
+ }
+
tris.prepareToAppendValues();
-
+
int i;
+ int texindex = 0;
for (i = 0; i < totfaces; i++) {
MFace *f = &mfaces[i];
-
- // if triangle
- if (f->v4 == 0) {
- tris.appendValues(f->v1, f->v2, f->v3);
+
+ if (checkTexcoords == true) {
+ // if triangle
+ if (f->v4 == 0) {
+ tris.appendValues(f->v1);
+ tris.appendValues(texindex++);
+ tris.appendValues(f->v2);
+ tris.appendValues(texindex++);
+ tris.appendValues(f->v3);
+ tris.appendValues(texindex++);
+ }
+ // quad
+ else {
+ tris.appendValues(f->v1);
+ tris.appendValues(texindex++);
+ tris.appendValues(f->v2);
+ tris.appendValues(texindex++);
+ tris.appendValues(f->v3);
+ tris.appendValues(texindex++);
+ tris.appendValues(f->v3);
+ tris.appendValues(texindex++);
+ tris.appendValues(f->v4);
+ tris.appendValues(texindex++);
+ tris.appendValues(f->v1);
+ tris.appendValues(texindex++);
+ }
}
- // quad
else {
- tris.appendValues(f->v1, f->v2, f->v3);
- tris.appendValues(f->v3, f->v4, f->v1);
- }
+ // 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();
@@ -113,36 +155,6 @@
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();
- */
closeLibrary();
}
@@ -173,7 +185,7 @@
int i = 0;
for (i = 0; i < totverts; i++) {
source.appendValues(verts[i].co[0], verts[i].co[1], verts[i].co[2]);
- // source.appendValues((float)(v->no[i] / 32767.0));
+
}
/*closes <float_array>, adds
<technique_common>
@@ -185,27 +197,85 @@
/*----------------------------------------------------------*/
- /* //creates <source> for texcoords
- void createTexcoordsSource(Scene *sce, COLLADASW::StreamWriter *sw,
- std::string geom_name, DerivedMesh *dm)
+ //creates <source> for texcoords
+ // returns true if mesh has uv data
+ bool createTexcoordsSource(Scene *sce, COLLADASW::StreamWriter *sw,
+ std::string geom_name, DerivedMesh *dm, Mesh *me)
{
- COLLADASW::FloatSourceF source(sw);
- source.setId(getIdBySemantics(geom_name, COLLADASW::TEXCOORD));
- source.setArrayId(geom_name + COLLADA::TEXCOORD + ARRAY_ID_SUFFIX);
- //TODO: replace totverts to totuvs
- source.setAccessorCount(totverts);
- source.setAccessorStride(2);
- COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList();
- param.push_back("X");
- param.push_back("Y");
-
- source.prepareToAppendValues();
- //appends data to <float_array>
+ int totfaces = dm->getNumFaces(dm);
+ MTFace *tface = me->mtface;
+ MFace *mfaces = dm->getFaceArray(dm);
+ if(tface != NULL)
+ {
+
+ COLLADASW::FloatSourceF source(sw);
+ source.setId(getIdBySemantics(geom_name, COLLADASW::TEXCOORD));
+ source.setArrayId(getIdBySemantics(geom_name, COLLADASW::TEXCOORD) +
+ ARRAY_ID_SUFFIX);
+ source.setAccessorCount(countTris(dm) * 3);
+ source.setAccessorStride(2);
+ COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList();
+ param.push_back("X");
+ param.push_back("Y");
+
+ source.prepareToAppendValues();
+
+ int i;
+ for (i = 0; i < totfaces; i++) {
+ MFace *f = &mfaces[i];
+
+ // if triangle
+ if (f->v4 == 0) {
+
+ // get uv1's X coordinate
+ source.appendValues(tface[i].uv[0][0]);
+ // get uv1's Y coordinate
+ source.appendValues(tface[i].uv[0][1]);
+ // get uv2's X coordinate
+ source.appendValues(tface[i].uv[1][0]);
+ // etc...
+ source.appendValues(tface[i].uv[1][1]);
+ //uv3
+ source.appendValues(tface[i].uv[2][0]);
+ source.appendValues(tface[i].uv[2][1]);
+
+
+ }
+ // quad
+ else {
+
+ // get uv1's X coordinate
+ source.appendValues(tface[i].uv[0][0]);
+ // get uv1's Y coordinate
+ source.appendValues(tface[i].uv[0][1]);
+ //uv2
+ source.appendValues(tface[i].uv[1][0]);
+ source.appendValues(tface[i].uv[1][1]);
+ //uv3
+ source.appendValues(tface[i].uv[2][0]);
+ source.appendValues(tface[i].uv[2][1]);
+ //uv3
+ source.appendValues(tface[i].uv[2][0]);
+ source.appendValues(tface[i].uv[2][1]);
+ //uv4
+ source.appendValues(tface[i].uv[3][0]);
+ source.appendValues(tface[i].uv[3][1]);
+ //uv1
+ source.appendValues(tface[i].uv[0][0]);
+ source.appendValues(tface[i].uv[0][1]);
+
+ }
+ }
+
+ source.finish();
+ return true;
+ }
+ return false;
}
- */
+
//creates <source> for normals
void createNormalsSource(Scene *sce, COLLADASW::StreamWriter *sw,
std::string geom_name, DerivedMesh *dm)
@@ -239,7 +309,31 @@
}
-
+
+ int countTris(DerivedMesh *dm)
+ {
+
+ MFace *mfaces = dm->getFaceArray(dm);
+ int totfaces = dm->getNumFaces(dm);
+
+ int i;
+ int tottri = 0;
+ for (i = 0; i < totfaces; i++) {
+ MFace *f = &mfaces[i];
+
+ // if triangle
+ if (f->v4 == 0) {
+ tottri++;
+ }
+ // quad
+ else {
+ tottri += 2;
+ }
+ }
+ return tottri;
+
+ }
+
std::string getIdBySemantics(std::string geom_name, COLLADASW::Semantics type) {
return geom_name +
getSuffixBySemantic(type);
@@ -305,43 +399,7 @@
}
};
-/*
- <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)
{
COLLADABU::NativeString native_filename =
@@ -363,6 +421,7 @@
GeometryExporter ge(&sw);
ge.exportGeom(sce);
+
//<scene>
std::string scene_name(sce->id.name);
COLLADASW::Scene scene(&sw, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING,
More information about the Bf-blender-cvs
mailing list