[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20889] branches/soc-2009-chingachgook/ source/blender/collada/DocumentExporter.cpp: Added exporting object textures, classes for writing <library_effects>

Chingiz Dyussenov chingiz.ds at gmail.com
Mon Jun 15 08:00:00 CEST 2009


Revision: 20889
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20889
Author:   chingachgook
Date:     2009-06-15 08:00:00 +0200 (Mon, 15 Jun 2009)

Log Message:
-----------
Added exporting object textures, classes for writing <library_effects> 
and <library_materials>. These classes are hardcoded. 

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-15 05:13:39 UTC (rev 20888)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp	2009-06-15 06:00:00 UTC (rev 20889)
@@ -2,11 +2,14 @@
 #include "DNA_object_types.h"
 #include "DNA_meshdata_types.h"
 #include "DNA_mesh_types.h"
+#include "DNA_image_types.h"
 extern "C" 
 {
 #include "BKE_DerivedMesh.h"
 }
 #include "BKE_scene.h"
+#include "BKE_global.h"
+#include "BKE_main.h"
 
 #include "DocumentExporter.h"
 
@@ -20,7 +23,21 @@
 #include <COLLADASWScene.h>
 #include <COLLADASWPrimitves.h>
 #include <COLLADASWVertices.h>
+#include <COLLADASWLibraryImages.h>
+#include <COLLADASWLibraryEffects.h>
+#include <COLLADASWImage.h>
+#include <COLLADASWEffectProfile.h>
+#include <COLLADASWColorOrTexture.h>
+#include <COLLADASWParamTemplate.h>
+#include <COLLADASWParamBase.h>
+#include <COLLADASWSurfaceInitOption.h>
+#include <COLLADASWTexture.h>
+#include <COLLADASWSampler.h>
+#include <COLLADASWSurface.h>
+#include <COLLADASWLibraryMaterials.h>
+#include <COLLADASWBindMaterial.h>
 
+
 // not good idea - there are for example blender Scene and COLLADASW::Scene
 //using namespace COLLADASW;
 
@@ -33,6 +50,7 @@
 	
 	void exportGeom(Scene *sce)
 	{
+		//opens <library_geometries>
 		openLibrary();
 		
 		// iterate over objects in scene
@@ -56,12 +74,15 @@
 				//openMesh(geoId, geoName, meshId)
 				openMesh(geom_name, "", "");
 
-				//<source>
+				//writes <source> for vertex coords
 				createVertsSource(sce, mSW, geom_name, dm);
+				//writes <source> for normal coords
 				createNormalsSource(sce, mSW, geom_name, dm);
+				//writes <source> for uv coords
+				//if mesh has uv coords
 				checkTexcoords = createTexcoordsSource(sce, mSW, geom_name, dm, (Mesh*)ob->data);
 
-				//<vertices>	
+				//<vertices>
 				COLLADASW::Vertices verts(mSW);
 				verts.setId(getIdBySemantics(geom_name, COLLADASW::VERTEX));
 				COLLADASW::InputList &input_list = verts.getInputList();
@@ -70,38 +91,43 @@
 				input_list.push_back(input);
 				verts.add();
 				
-				//triangles
+				//<triangles>
 				COLLADASW::Triangles tris(mSW);
+				//sets count attribute in <triangles>
 				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
-				*/
-
+				/*added semantic, source, offset attributes to <input> */
+				
+			   //creates list of attributes in <triangles> <input> for vertices 
 				COLLADASW::Input input2(COLLADASW::VERTEX,
 										getUrlBySemantics(geom_name, COLLADASW::VERTEX), 0);
+				//creates list of attributes in <triangles> <input> for normals
 				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 mesh has uv coords writes <input> attributes for TEXCOORD
 				if (checkTexcoords == true)
 					{
 						COLLADASW::Input input4(COLLADASW::TEXCOORD,
 												getUrlBySemantics(geom_name, COLLADASW::TEXCOORD), 1);
 						til.push_back(input4);
+						//XXX
+						tris.setMaterial("material-symbol");
 					}
-				
+				//performs the actual writing
 				tris.prepareToAppendValues();
 				
 				int i;
 				int texindex = 0;
+				//writes data to <p>
 				for (i = 0; i < totfaces; i++) {
 					MFace *f = &mfaces[i];
-					
+					//if mesh has uv coords writes uv and
+					//vertex indexes
 					if (checkTexcoords == true)	{
 						// if triangle
 						if (f->v4 == 0) {
@@ -128,6 +154,8 @@
 							tris.appendValues(texindex++);
 						}
 					}
+					//if mesh has no uv coords writes only 
+					//vertex indexes
 					else {
 						// if triangle
 						if (f->v4 == 0) {
@@ -213,7 +241,7 @@
 				source.setId(getIdBySemantics(geom_name, COLLADASW::TEXCOORD));
 				source.setArrayId(getIdBySemantics(geom_name, COLLADASW::TEXCOORD) +
 								  ARRAY_ID_SUFFIX);
-				source.setAccessorCount(countTris(dm) * 3);
+				source.setAccessorCount(getTriCount(mfaces, totfaces) * 3);
 				source.setAccessorStride(2);
 				COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
 				param.push_back("X");
@@ -274,8 +302,8 @@
 		return false;
 	}
 
+	/*----------------------------------------------------------*/
 
-
 	//creates <source> for normals
 	void createNormalsSource(Scene *sce, COLLADASW::StreamWriter *sw,
 							 std::string geom_name, DerivedMesh *dm)
@@ -306,43 +334,23 @@
 				
 		}
 		source.finish();
-		
-
 	}
 	
-	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);
 	}
+	
+	/*----------------------------------------------------------*/
 
 	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;
@@ -359,6 +367,8 @@
 	}
 };
 
+/*----------------------------------------------------------*/
+
 class SceneExporter: COLLADASW::LibraryVisualScenes
 {
 public:
@@ -385,6 +395,14 @@
 				std::string ob_name(ob->id.name);
 				instGeom.setUrl(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING,
 											   ob_name));
+				//XXX hardcoded
+				/*COLLADASW::BindMaterial bm(mSW);
+				COLLADASW::InstanceMaterialList& iml = bm.getInstanceMaterialList();
+				std::string matid = "material";
+				COLLADASW::InstanceMaterial im("material-symbol", COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, matid));
+				iml.push_back(im);
+				instGeom.getBindMaterial() = bm;*/
+				
 				instGeom.add();
 			
 				node.end();
@@ -399,7 +417,114 @@
 	}
 };
 
+/*----------------------------------------------------------*/
+//class for exporting textures
+class ImagesExporter: COLLADASW::LibraryImages
+{
+public:
+	ImagesExporter(COLLADASW::StreamWriter *sw) : COLLADASW::LibraryImages(sw)
+	{}
+	
+	void exportImages(Scene *sce)
+	{
+		openLibrary();
+		
+		Image *image = (Image*)G.main->image.first;
+		while(image) {
+			
+			//fileURI, imageId, imageName
+			COLLADASW::Image img(COLLADABU::URI(image->name), image->id.name, "");
+			img.add(mSW);
+			
+			image = (Image*)image->id.next;
+		}
+		closeLibrary();
+	}
+	
+};
 
+/*----------------------------------------------------------*/
+
+class EffectsExporter: COLLADASW::LibraryEffects
+{
+public:
+	EffectsExporter(COLLADASW::StreamWriter *sw) : COLLADASW::LibraryEffects(sw){}
+	void exportEffects(Scene *sce)
+	{
+		//XXX
+		openLibrary();
+		openEffect("effect-id");
+		COLLADASW::EffectProfile ep(mSW);
+		ep.setProfileType(COLLADASW::EffectProfile::COMMON);
+		/*	ep.setShaderType(COLLADASW::EffectProfile::LAMBERT);
+			ep.setTechniqueSid("sid");
+		COLLADASW::Surface surface(COLLADASW::Surface::SURFACE_TYPE_2D, "image_sid");
+		COLLADASW::Sampler sampler(COLLADASW::Sampler::SAMPLER_TYPE_2D, "image_sid");
+		COLLADASW::Texture texture("id");
+		COLLADASW::ColorOrTexture cot(texture);
+		ep.setDiffuse(cot, false, "sid");
+		ep.openProfile();
+		ep.addProfileElements();*/
+		ep.openProfile();
+		
+		//newparam surface init_from
+		//COLLADASW::NewParamSurface newparamsurf(mSW);
+		//newparamsurf.openParam("IMmonkey_unwrapped_face" + COLLADASW::Surface::SURFACE_SID_SUFFIX);
+		COLLADASW::Surface surface(COLLADASW::Surface::SURFACE_TYPE_2D);
+		COLLADASW::SurfaceInitOption sio(COLLADASW::SurfaceInitOption::INIT_FROM);
+		sio.setImageReference("IMmonkey_unwrapped_face");
+		surface.setInitOption(sio);
+		//surface.add(mSW);
+		//newparamsurf.closeParam();
+		
+		//newparam sampler source
+		//COLLADASW::NewParamSampler newparamsamp(mSW);
+		//newparamsamp.openParam("IMmonkey_unwrapped_face" + COLLADASW::Sampler::SAMPLER_SID_SUFFIX);
+		COLLADASW::Sampler sampler(COLLADASW::Sampler::SAMPLER_TYPE_2D, "IMmonkey_unwrapped_face" + COLLADASW::Surface::SURFACE_SID_SUFFIX);
+		//sampler.add(mSW);
+		//newparamsamp.closeParam();
+		
+		//lambert diffuse texture	
+		COLLADASW::Texture texture("IMmonkey_unwrapped_face" /*"IMmonkey_unwrapped_face" +  COLLADASW::Sampler::SAMPLER_SID_SUFFIX*/);
+		texture.setTexcoord("myUVS");
+		texture.setSurface(surface);
+		texture.setSampler(sampler);
+		
+		COLLADASW::ColorOrTexture cot(texture, "texture_sid");
+		ep.setDiffuse(cot, true, "");
+		ep.setShaderType(COLLADASW::EffectProfile::LAMBERT);
+		//	ep.addSampler(cot);
+		//ep.setTechniqueSid("technique_sid");
+		ep.addProfileElements();
+		
+		ep.closeProfile();
+		closeEffect();
+		closeLibrary();
+
+	}
+	
+};
+/*----------------------------------------------------------*/
+
+class MaterialsExporter: COLLADASW::LibraryMaterials
+{
+public:
+	MaterialsExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryMaterials(sw){}
+	void exportMaterials()
+	{
+		openMaterial("material");
+		std::string efid = "effect-id";
+		addInstanceEffect(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, efid));
+		closeMaterial();
+		closeLibrary();
+	}
+	
+	
+};
+
+
+/*----------------------------------------------------------*/
+
 void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename)
 {
 	COLLADABU::NativeString native_filename =
@@ -414,14 +539,25 @@
 	asset.setUpAxisType(COLLADASW::Asset::Z_UP);
 	asset.add();
 	
-	SceneExporter se(&sw);
-	se.exportScene(sce);
+	//exports all object textures
+	ImagesExporter ie(&sw);
+	ie.exportImages(sce);
 	
+	//library_materials
+	//MaterialsExporter me(&sw);
+	//me.exportMaterials();
+	//
+	//EffectsExporter ee(&sw);
+	//ee.exportEffects(sce);
+
+
 	//<library_geometries>
 	GeometryExporter ge(&sw);
 	ge.exportGeom(sce);
-
-
+	
+	//
+	SceneExporter se(&sw);
+	se.exportScene(sce);
 	//<scene>
 	std::string scene_name(sce->id.name);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list