[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21077] branches/soc-2009-chingachgook/ source/blender: Multi-texture material export (unfinished).

Chingiz Dyussenov chingiz.ds at gmail.com
Mon Jun 22 15:23:13 CEST 2009


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

Log Message:
-----------
Multi-texture material export (unfinished).
Import geometry using mesh editor module commented out. Will use blenkernel module instead.

Modified Paths:
--------------
    branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp
    branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp
    branches/soc-2009-chingachgook/source/blender/collada/SConscript
    branches/soc-2009-chingachgook/source/blender/windowmanager/intern/wm_operators.c

Modified: branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp
===================================================================
--- branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp	2009-06-22 11:48:31 UTC (rev 21076)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp	2009-06-22 13:23:13 UTC (rev 21077)
@@ -4,6 +4,8 @@
 #include "DNA_mesh_types.h"
 #include "DNA_image_types.h"
 #include "DNA_material_types.h"
+#include "DNA_texture_types.h"
+
 extern "C" 
 {
 #include "BKE_DerivedMesh.h"
@@ -22,7 +24,6 @@
 #include <COLLADASWSource.h>
 #include <COLLADASWInstanceGeometry.h>
 #include <COLLADASWInputList.h>
-#include <COLLADASWScene.h>
 #include <COLLADASWPrimitves.h>
 #include <COLLADASWVertices.h>
 #include <COLLADASWLibraryImages.h>
@@ -33,9 +34,11 @@
 #include <COLLADASWParamTemplate.h>
 #include <COLLADASWParamBase.h>
 #include <COLLADASWSurfaceInitOption.h>
-#include <COLLADASWTexture.h>
 #include <COLLADASWSampler.h>
+#include <COLLADASWScene.h>
 #include <COLLADASWSurface.h>
+#include <COLLADASWTechnique.h>
+#include <COLLADASWTexture.h>
 #include <COLLADASWLibraryMaterials.h>
 #include <COLLADASWBindMaterial.h>
 
@@ -188,8 +191,6 @@
 		closeLibrary();
 	}
 
-	/*----------------------------------------------------------*/
-
 	//creates <source> for positions
 	void createVertsSource(Scene *sce, COLLADASW::StreamWriter *sw,
 					  std::string geom_name, DerivedMesh *dm)
@@ -225,8 +226,6 @@
 	
 	}
 
-	/*----------------------------------------------------------*/
-	
 	//creates <source> for texcoords
 	// returns true if mesh has uv data
 	bool createTexcoordsSource(Scene *sce, COLLADASW::StreamWriter *sw,
@@ -304,7 +303,6 @@
 		return false;
 	}
 
-	/*----------------------------------------------------------*/
 
 	//creates <source> for normals
 	void createNormalsSource(Scene *sce, COLLADASW::StreamWriter *sw,
@@ -338,21 +336,17 @@
 		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;
@@ -369,8 +363,6 @@
 	}
 };
 
-/*----------------------------------------------------------*/
-
 class SceneExporter: COLLADASW::LibraryVisualScenes
 {
 public:
@@ -406,29 +398,17 @@
 						COLLADASW::BindMaterial& bm = instGeom.getBindMaterial();
 						COLLADASW::InstanceMaterialList& iml = bm.getInstanceMaterialList();
 						std::string matid = std::string(ma->id.name);	
-						COLLADASW::InstanceMaterial im("material-symbol", COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, matid));
+						/*COLLADASW::InstanceMaterial im("material-symbol", COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, matid));
+						COLLADASW::BindVertexInput bvi("myUVs", "TEXCOORD", 1);
+						im.push_back(bvi);*/
 						iml.push_back(im);
 					}
-				//XXX hardcoded
-				/*Image *image = (Image*)G.main->image.first;
-				
-				COLLADASW::BindMaterial& bm = instGeom.getBindMaterial();
-				COLLADASW::InstanceMaterialList& iml = bm.getInstanceMaterialList();
-				
-				std::string matid = std::string(image->id.name) + "-material";
-				COLLADASW::InstanceMaterial im("material-symbol", COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, matid));
-				COLLADASW::BindVertexInput bvi("myUVs", "TEXCOORD", 1);
-				im.push_back(bvi);
-				iml.push_back(im);*/
-
-				//
 				instGeom.add();
-				
 				node.end();
 			}
 			base= base->next;
 		}
-
+		
 		//</visual_scene></library_visual_scenes>
 		closeVisualScene();
 
@@ -436,7 +416,6 @@
 	}
 };
 
-/*----------------------------------------------------------*/
 //class for exporting images
 class ImagesExporter: COLLADASW::LibraryImages
 {
@@ -462,8 +441,6 @@
 	
 };
 
-/*----------------------------------------------------------*/
-
 class EffectsExporter: COLLADASW::LibraryEffects
 {
 public:
@@ -476,55 +453,79 @@
 		while(ma) {
 			
 			openEffect(std::string(ma->id.name) + "-effect");
-			COLLADASW::EffectProfile ep(mSW);
-			ep.setProfileType(COLLADASW::EffectProfile::COMMON);
-			//open <profile_common>
-			ep.openProfile();
-			
 
-			ep.closeProfile();
-			ma = (Material*) ma->id.next;
-			/*	Image *image = (Image*)G.main->image.first;
-		while(image) {
-			
-			openEffect(std::string(image->id.name) + "-effect");
 			COLLADASW::EffectProfile ep(mSW);
+			
 			ep.setProfileType(COLLADASW::EffectProfile::COMMON);
+
 			//open <profile_common>
 			ep.openProfile();
 			
-			//<newparam> <surface> <init_from>
-			COLLADASW::Surface surface(COLLADASW::Surface::SURFACE_TYPE_2D, image->id.name + COLLADASW::Surface::SURFACE_SID_SUFFIX);
-			COLLADASW::SurfaceInitOption sio(COLLADASW::SurfaceInitOption::INIT_FROM);
-			sio.setImageReference(image->id.name);
-			surface.setInitOption(sio);
+			std::vector<int> mtexindices = countmtex(ma);
 			
-			//<newparam> <sampler> <source>
-			COLLADASW::Sampler sampler(COLLADASW::Sampler::SAMPLER_TYPE_2D, image->id.name + COLLADASW::Surface::SURFACE_SID_SUFFIX);
+			for (int a = 0; a < mtexindices.size(); a++){
+				//<newparam> <surface> <init_from>
+				Image *ima = ma->mtex[mtexindices[a]]->tex->ima;
+				COLLADASW::Surface surface(COLLADASW::Surface::SURFACE_TYPE_2D,
+										   ima->id.name + COLLADASW::Surface::SURFACE_SID_SUFFIX);
+				COLLADASW::SurfaceInitOption sio(COLLADASW::SurfaceInitOption::INIT_FROM);
+				sio.setImageReference(ima->id.name);
+				surface.setInitOption(sio);
+
+				//<newparam> <sampler> <source>
+				COLLADASW::Sampler sampler(COLLADASW::Sampler::SAMPLER_TYPE_2D,
+										   ima->id.name + COLLADASW::Surface::SURFACE_SID_SUFFIX);
+
+				//<lambert> <diffuse> <texture>	
+				COLLADASW::Texture texture(ima->id.name);
+				texture.setTexcoord("myUVs");
+				texture.setSurface(surface);
+				texture.setSampler(sampler);
+
+				//<texture>
+				COLLADASW::ColorOrTexture cot(texture);
+				ep.setDiffuse(cot, true, "");
+				ep.setShaderType(COLLADASW::EffectProfile::LAMBERT);
+
+				//todo add or find generator of technique sids
+				//performs the actual writing
+				ep.addProfileElements();
+				ep.closeTechnique();
+				//COLLADASW::Technique technique(mSW);
+				//technique.closeTechnique();
+				
+			}
 			
-			//<lambert> <diffuse> <texture>	
-			COLLADASW::Texture texture(image->id.name);
-			texture.setTexcoord("myUVs");
-			texture.setSurface(surface);
-			texture.setSampler(sampler);
-			
-			COLLADASW::ColorOrTexture cot(texture);
-			ep.setDiffuse(cot, true, "");
-			ep.setShaderType(COLLADASW::EffectProfile::LAMBERT);
-			//performs the actual writing
-			ep.addProfileElements();
 			ep.closeProfile();
-			closeEffect();
-			image = (Image*)image->id.next;
-		}*/
+			ma = (Material*) ma->id.next;
 		}
 		
 		closeLibrary();
 
 	}
-	
+
+	//returns the array of mtex indices which have image 
+	//I need this for exporting textures
+	std::vector<int> countmtex(Material *ma)
+	{
+		std::vector<int> mtexindices;
+		for (int a = 0; a < 18; a++){
+			if (!ma->mtex[a]){
+				continue;
+			}
+			Tex *tex = ma->mtex[a]->tex;
+			if(!tex){
+				continue;
+			}
+			Image *ima = tex->ima;
+			if(!ima){
+				continue;
+			}
+			mtexindices.push_back(a);
+		}
+		return mtexindices;
+	}
 };
-/*----------------------------------------------------------*/
 
 class MaterialsExporter: COLLADASW::LibraryMaterials
 {
@@ -546,28 +547,11 @@
 			
 			ma = (Material*) ma->id.next;
 		}
-		closeLibrary();
-		
-		/*
-		  Image *image = (Image*)G.main->image.first;
-		  while(image) {
-		  
-		  openMaterial(std::string(image->id.name) + "-material");
-		  std::string efid = std::string(image->id.name) + "-effect";
-		  addInstanceEffect(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, efid));
-		  closeMaterial();
-		  image = (Image*)image->id.next;
-		  }
-		*/
-		
+		closeLibrary();	
 	}
-	
-	
 };
 
 
-/*----------------------------------------------------------*/
-
 void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename)
 {
 	COLLADABU::NativeString native_filename =
@@ -613,8 +597,6 @@
 
 }
 
-/*----------------------------------------------------------*/
-
 void DocumentExporter::exportScenes(const char* filename)
 {
 }

Modified: branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp
===================================================================
--- branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp	2009-06-22 11:48:31 UTC (rev 21076)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp	2009-06-22 13:23:13 UTC (rev 21077)
@@ -11,23 +11,28 @@
 #include "COLLADAFWMaterial.h"
 #include "COLLADAFWGeometry.h"
 #include "COLLADAFWMesh.h"
+#include "COLLADAFWFloatOrDoubleArray.h"
+#include "COLLADAFWArrayPrimitiveType.h"
 
 #include "COLLADASaxFWLLoader.h"
 
+// TODO move "extern C" into header files
 extern "C" 
 {
 #include "BKE_main.h"
 #include "BKE_mesh.h"
 #include "BKE_context.h"
+#include "BKE_object.h"
+#include "BKE_image.h"
+#include "BKE_material.h"
+}
 
 #include "DNA_object_types.h"
 
-#include "ED_object.h"
-
 #include "DocumentImporter.h"
-}
 
 
+
 /** Class that needs to be implemented by a writer. 
 	IMPORTANT: The write functions are called in arbitrary order.*/
 class Writer: public COLLADAFW::IWriter
@@ -83,6 +88,12 @@
 	*/
 	virtual void cancel(const COLLADAFW::String& errorMessage)
 	{
+		// TODO: if possible show error info
+		//
+		// Should we get rid of invisible Meshes that were created so far
+		// or maybe create objects at coordinate space origin?
+		//
+		// The latter sounds better.
 	}
 
 	/** This is the method called. The writer hast to prepare to receive data.*/
@@ -95,6 +106,20 @@
 	{
 		// using mVisualScenes, do:
 		// - write <node> data to Objects: materials, transforms, etc.
+
+		// TODO: import materials (<instance_material> inside <instance_geometry>) and textures
+
+		std::vector<COLLADAFW::VisualScene>::iterator it = mVisualScenes.begin();
+		for (; it != mVisualScenes.end(); it++) {
+			COLLADAFW::VisualScene &visscene = *it;
+
+			// create new blender scene
+
+			// create Objects from <node>s inside this <visual_scene>
+

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list