Revision: 21262 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21262 Author: chingachgook Date: 2009-06-30 11:10:37 +0200 (Tue, 30 Jun 2009)
Log Message: ----------- Export textures mapped to diffuse, ambient, specular, emission and reflective colors. Input is always assumed to be UV. Texture/UV set mapping is not done 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-30 06:31:21 UTC (rev 21261) +++ branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp 2009-06-30 09:10:37 UTC (rev 21262) @@ -583,45 +583,13 @@ void operator()(Material *ma) { + std::vector<int> mtexindices = countmtex(ma); openEffect(std::string(ma->id.name) + "-effect"); COLLADASW::EffectProfile ep(mSW); - ep.setProfileType(COLLADASW::EffectProfile::COMMON); - - std::vector<int> mtexindices = countmtex(ma); - - //for (int a = 0; a < mtexindices.size(); a++) { - - //open <profile_common> ep.openProfile(); - /* - //need this for making each texcoord unique - char texcoord[30]; - sprintf(texcoord, "%d", 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(std::string("myUVs") + texcoord); - texture.setSurface(surface); - texture.setSampler(sampler); - - //<texture> - COLLADASW::ColorOrTexture cot(texture); - ep.setDiffuse(cot); - */ + // set shader type - one of three blinn, phong or lambert if (ma->spec_shader == MA_SPEC_BLINN) { ep.setShaderType(COLLADASW::EffectProfile::BLINN); } @@ -629,70 +597,150 @@ ep.setShaderType(COLLADASW::EffectProfile::PHONG); } else { - // XXX write error + // XXX write warning "Current shader type is not supported" ep.setShaderType(COLLADASW::EffectProfile::LAMBERT); } - - // emission - COLLADASW::ColorOrTexture cot_col = getcol(0.0f, 0.0f, 0.0f, 1.0f); - ep.setEmission(cot_col); - - // diffuse - cot_col = getcol(ma->r, ma->g, ma->b, 1.0f); - ep.setDiffuse(cot_col); - + // index of refraction + if (ma->mode & MA_RAYTRANSP) { + ep.setIndexOfRefraction(ma->ang); + } + else { + ep.setIndexOfRefraction(1.0f); + } + // transparency + ep.setTransparency(ma->alpha); + // shininess + ep.setShininess(ma->spec); + // emission + COLLADASW::ColorOrTexture cot = getcol(0.0f, 0.0f, 0.0f, 1.0f); + ep.setEmission(cot); + // diffuse + cot = getcol(ma->r, ma->g, ma->b, 1.0f); + ep.setDiffuse(cot); // ambient - cot_col = getcol(ma->ambr, ma->ambg, ma->ambb, 1.0f); - ep.setAmbient(cot_col); - + cot = getcol(ma->ambr, ma->ambg, ma->ambb, 1.0f); + ep.setAmbient(cot); // reflective, reflectivity if (ma->mode & MA_RAYMIRROR) { - cot_col = getcol(ma->mirr, ma->mirg, ma->mirb, 1.0f); - ep.setReflective(cot_col); + cot = getcol(ma->mirr, ma->mirg, ma->mirb, 1.0f); + ep.setReflective(cot); ep.setReflectivity(ma->ray_mirror); } else { - cot_col = getcol(0.0f, 0.0f, 0.0f, 1.0f); - ep.setReflective(cot_col); + cot = getcol(0.0f, 0.0f, 0.0f, 1.0f); + ep.setReflective(cot); ep.setReflectivity(0.0f); } - - // transparent, transparency - if (ep.getShaderType() != COLLADASW::EffectProfile::BLINN) { - cot_col = getcol(0.0f, 0.0f, 0.0f, 1.0f); - ep.setTransparent(cot_col); + // specular, shininess + if (ep.getShaderType() != COLLADASW::EffectProfile::LAMBERT) { + cot = getcol(ma->specr, ma->specg, ma->specb, 1.0f); + ep.setSpecular(cot); } - ep.setTransparency(ma->alpha); - - // index of refraction - if (ma->mode & MA_RAYTRANSP) { - ep.setIndexOfRefraction(ma->ang); + + // XXX make this more readable if possible + + // create <sampler> and <surface> for each image + COLLADASW::Sampler samplers[MAX_MTEX]; + COLLADASW::Surface surfaces[MAX_MTEX]; + void *samp_surf[MAX_MTEX][2]; + + // image to index to samp_surf map + // samp_surf[index] stores 2 pointers, sampler and surface + std::map<std::string, int> im_samp_map; + + unsigned int a, b; + for (a = 0, b = 0; a < mtexindices.size(); a++) { + MTex *t = ma->mtex[mtexindices[a]]; + Image *ima = t->tex->ima; + + std::string key(ima->id.name); + + // create only one <sampler>/<surface> pair for each unique image + if (im_samp_map.find(key) == im_samp_map.end()) { + //<newparam> <surface> <init_from> + COLLADASW::Surface surface(COLLADASW::Surface::SURFACE_TYPE_2D, + key + COLLADASW::Surface::SURFACE_SID_SUFFIX); + COLLADASW::SurfaceInitOption sio(COLLADASW::SurfaceInitOption::INIT_FROM); + sio.setImageReference(key); + surface.setInitOption(sio); + + //<newparam> <sampler> <source> + COLLADASW::Sampler sampler(COLLADASW::Sampler::SAMPLER_TYPE_2D, + key + COLLADASW::Surface::SURFACE_SID_SUFFIX); + + // copy values to arrays since they will live longer + samplers[a] = sampler; + surfaces[a] = surface; + + // store pointers so they can be used later when we create <texture>s + samp_surf[b][0] = &samplers[a]; + samp_surf[b][1] = &surfaces[a]; + + im_samp_map[key] = b; + b++; + } } - else { - ep.setIndexOfRefraction(1.0f); + + // write textures + // XXX very slow + for (a = 0; a < mtexindices.size(); a++) { + MTex *t = ma->mtex[mtexindices[a]]; + Image *ima = t->tex->ima; + + // we assume map input is always TEXTCO_UV + + std::string key(ima->id.name); + int i = im_samp_map[key]; + COLLADASW::Sampler *sampler = (COLLADASW::Sampler*)samp_surf[i][0]; + COLLADASW::Surface *surface = (COLLADASW::Surface*)samp_surf[i][1]; + + // color + if (t->mapto & MAP_COL) { + ep.setDiffuse(createTexture(ima, sampler, surface)); + } + // ambient + if (t->mapto & MAP_AMB) { + ep.setAmbient(createTexture(ima, sampler, surface)); + } + // specular + if (t->mapto & MAP_SPEC) { + ep.setSpecular(createTexture(ima, sampler, surface)); + } + // emission + if (t->mapto & MAP_EMIT) { + ep.setEmission(createTexture(ima, sampler, surface)); + } + // reflective + if (t->mapto & MAP_REF) { + ep.setReflective(createTexture(ima, sampler, surface)); + } } - - // specular, shininess, diffuse - if (ep.getShaderType() != COLLADASW::EffectProfile::LAMBERT) { - ep.setShininess(ma->spec); - cot_col = getcol(ma->specr, ma->specg, ma->specb, 1.0f); - ep.setSpecular(cot_col); - } - // performs the actual writing ep.addProfileElements(); ep.closeProfile(); + closeEffect(); + } + + COLLADASW::ColorOrTexture createTexture(Image *ima, + COLLADASW::Sampler *sampler, + COLLADASW::Surface *surface) + { - //} + COLLADASW::Texture texture(ima->id.name); + // XXX change "myUVs" to UV layer's name + texture.setTexcoord(std::string("myUVs")); + texture.setSurface(*surface); + texture.setSampler(*sampler); - closeEffect(); + COLLADASW::ColorOrTexture cot(texture); + return cot; } COLLADASW::ColorOrTexture getcol(float r, float g, float b, float a) { COLLADASW::Color color(r,g,b,a); - COLLADASW::ColorOrTexture cot_col(color); - return cot_col; + COLLADASW::ColorOrTexture cot(color); + return cot; } //returns the array of mtex indices which have image @@ -700,19 +748,13 @@ std::vector<int> countmtex(Material *ma) { std::vector<int> mtexindices; - for (int a = 0; a < 18; a++){ - if (!ma->mtex[a]){ - continue; + for (int a = 0; a < 18; a++) { + if (ma->mtex[a] && ma->mtex[a]->tex->type == TEX_IMAGE){ + mtexindices.push_back(a); } - Tex *tex = ma->mtex[a]->tex; - if(!tex){ + else { continue; } - Image *ima = tex->ima; - if(!ima){ - continue; - } - mtexindices.push_back(a); } return mtexindices; } _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs