diff options
author | Alfredo de Greef <eeshlo@yahoo.com> | 2004-11-18 04:50:09 +0300 |
---|---|---|
committer | Alfredo de Greef <eeshlo@yahoo.com> | 2004-11-18 04:50:09 +0300 |
commit | 53d58505c5f88729237c861749215dd7fab6e3b4 (patch) | |
tree | df0f79e29869ef15d2da5503c23f9fd368f6a14c /source/blender/yafray | |
parent | cefd1b2729b68d07d4a76338bd3ae39740c52b80 (diff) |
Material TexFace mode support was still not quite correct, didn't work for
objects that used faces having same image but not the same material.
Diffstat (limited to 'source/blender/yafray')
-rwxr-xr-x | source/blender/yafray/intern/export_File.cpp | 61 | ||||
-rw-r--r-- | source/blender/yafray/intern/export_Plugin.cpp | 52 | ||||
-rw-r--r-- | source/blender/yafray/intern/yafray_Render.cpp | 2 | ||||
-rw-r--r-- | source/blender/yafray/intern/yafray_Render.h | 5 |
4 files changed, 65 insertions, 55 deletions
diff --git a/source/blender/yafray/intern/export_File.cpp b/source/blender/yafray/intern/export_File.cpp index 7b34404a205..9ac6d1b1e90 100755 --- a/source/blender/yafray/intern/export_File.cpp +++ b/source/blender/yafray/intern/export_File.cpp @@ -344,7 +344,7 @@ void yafrayFileRender_t::writeTextures() { // used to keep track of images already written // (to avoid duplicates if also in imagetex for material TexFace texture) - map<Image*, bool> dupimg; + set<Image*> dupimg; string ts; for (map<string, MTex*>::const_iterator blendtex=used_textures.begin(); @@ -495,7 +495,7 @@ void yafrayFileRender_t::writeTextures() if (ima) { // remember image to avoid duplicates later if also in imagetex // (formerly done by removing from imagetex, but need image/material link) - dupimg[ima] = true; + dupimg.insert(ima); ostr.str(""); // use image name instead of texname here ostr << "<shader type=\"image\" name=\"" << ima->id.name << "\" >\n"; @@ -538,15 +538,16 @@ void yafrayFileRender_t::writeTextures() // If used, textures for the material 'TexFace' case if (!imagetex.empty()) { - for (map<Image*, Material*>::const_iterator imgtex=imagetex.begin(); + for (map<Image*, set<Material*> >::const_iterator imgtex=imagetex.begin(); imgtex!=imagetex.end();++imgtex) { // skip if already written above - if (dupimg.find(imgtex->first)==dupimg.end()) { + Image* ima = imgtex->first; + if (dupimg.find(ima)==dupimg.end()) { ostr.str(""); - ostr << "<shader type=\"image\" name=\"" << imgtex->first->id.name << "\" >\n"; + ostr << "<shader type=\"image\" name=\"" << ima->id.name << "\" >\n"; ostr << "\t<attributes>\n"; - string texpath(imgtex->first->name); + string texpath(ima->name); adjustPath(texpath); ostr << "\t\t<filename value=\"" << texpath << "\" />\n"; ostr << "\t</attributes>\n</shader>\n\n"; @@ -897,31 +898,35 @@ void yafrayFileRender_t::writeMaterialsAndModulators() // Yafray doesn't have per-face-textures, only per-face-shaders, // so create as many mappers/shaders as the images used by the object int snum = 0; - for (map<Image*, Material*>::const_iterator imgtex=imagetex.begin(); + for (map<Image*, set<Material*> >::const_iterator imgtex=imagetex.begin(); imgtex!=imagetex.end();++imgtex) { - Material* matr = imgtex->second; - // mapper - ostr.str(""); - ostr << "<shader type=\"blendermapper\" name=\"" << string(matr->id.name) + "_ftex_mp" << snum << "\" >\n"; - ostr << "\t<attributes>\n"; - ostr << "\t\t<input value=\"" << imgtex->first->id.name << "\" />\n"; - // all yafray default settings, except for texco, so no need to set others - ostr << "\t\t<texco value=\"uv\" />\n"; - ostr << "\t</attributes>\n"; - ostr << "</shader>\n\n"; - xmlfile << ostr.str(); + for (set<Material*>::const_iterator imgmat=imgtex->second.begin(); + imgmat!=imgtex->second.end();++imgmat) + { + Material* matr = *imgmat; + // mapper + ostr.str(""); + ostr << "<shader type=\"blendermapper\" name=\"" << string(matr->id.name) + "_ftmap" << snum << "\" >\n"; + ostr << "\t<attributes>\n"; + ostr << "\t\t<input value=\"" << imgtex->first->id.name << "\" />\n"; + // all yafray default settings, except for texco, so no need to set others + ostr << "\t\t<texco value=\"uv\" />\n"; + ostr << "\t</attributes>\n"; + ostr << "</shader>\n\n"; + xmlfile << ostr.str(); - // shader, remember name, used later when writing per-face-shaders - ostr.str(""); - ostr << matr->id.name << "_ftex_sh" << snum; - string shader_name = ostr.str(); - imgtex_shader[imgtex->first] = shader_name; + // shader, remember name, used later when writing per-face-shaders + ostr.str(""); + ostr << matr->id.name << "_ftsha" << snum; + string shader_name = ostr.str(); + imgtex_shader[string(matr->id.name) + string(imgtex->first->id.name)] = shader_name; - ostr.str(""); - ostr << matr->id.name << "_ftex_mp" << snum++; - writeShader(shader_name, matr, ostr.str()); + ostr.str(""); + ostr << matr->id.name << "_ftmap" << snum++; + writeShader(shader_name, matr, ostr.str()); + } } } @@ -956,7 +961,7 @@ void yafrayFileRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_li TFace* tface = face0->tface; if (tface) { Image* fimg = (Image*)tface->tpage; - if (fimg) matname = imgtex_shader[fimg]; + if (fimg) matname = imgtex_shader[string(face0mat->id.name) + string(fimg->id.name)]; } } bool shadow = face0mat->mode & MA_TRACEBLE; @@ -1101,7 +1106,7 @@ void yafrayFileRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_li TFace* tface = vlr->tface; if (tface) { Image* fimg = (Image*)tface->tpage; - if (fimg) fmatname = imgtex_shader[fimg]; + if (fimg) fmatname = imgtex_shader[fmatname + string(fimg->id.name)]; } } else if (fmatname.length()==0) fmatname = "blender_default"; diff --git a/source/blender/yafray/intern/export_Plugin.cpp b/source/blender/yafray/intern/export_Plugin.cpp index 8470adf86c7..11a54fa858d 100644 --- a/source/blender/yafray/intern/export_Plugin.cpp +++ b/source/blender/yafray/intern/export_Plugin.cpp @@ -348,7 +348,7 @@ void yafrayPluginRender_t::writeTextures() { // used to keep track of images already written // (to avoid duplicates if also in imagetex for material TexFace texture) - map<Image*, bool> dupimg; + set<Image*> dupimg; string ts; yafray::paramMap_t params; @@ -413,7 +413,7 @@ void yafrayPluginRender_t::writeTextures() if (ima) { // remember image to avoid duplicates later if also in imagetex // (formerly done by removing from imagetex, but need image/material link) - dupimg[ima] = true; + dupimg.insert(ima); params["type"] = yafray::parameter_t("image"); params["name"] = yafray::parameter_t(ima->id.name); string texpath = ima->name; @@ -531,7 +531,7 @@ void yafrayPluginRender_t::writeTextures() // If used, textures for the material 'TexFace' case if (!imagetex.empty()) { - for (map<Image*, Material*>::const_iterator imgtex=imagetex.begin(); + for (map<Image*, set<Material*> >::const_iterator imgtex=imagetex.begin(); imgtex!=imagetex.end();++imgtex) { // skip if already written above @@ -886,29 +886,33 @@ void yafrayPluginRender_t::writeMaterialsAndModulators() params.clear(); lparams.clear(); int snum = 0; - for (map<Image*, Material*>::const_iterator imgtex=imagetex.begin(); + for (map<Image*, set<Material*> >::const_iterator imgtex=imagetex.begin(); imgtex!=imagetex.end();++imgtex) { - Material* matr = imgtex->second; - // mapper - params["type"] = yafray::parameter_t("blendermapper"); - char temp[32]; - sprintf(temp, "_ftex_mp%d", snum); - params["name"] = yafray::parameter_t(string(matr->id.name) + string(temp)); - params["input"] = yafray::parameter_t(imgtex->first->id.name); - // all yafray default settings, except for texco, so no need to set others - params["texco"] = yafray::parameter_t("uv"); - yafrayGate->addShader(params, lparams); - - // shader, remember name, used later when writing per-face-shaders - sprintf(temp, "_ftex_sh%d", snum); - string shader_name = string(matr->id.name) + string(temp); - imgtex_shader[imgtex->first] = shader_name; - - sprintf(temp, "_ftex_mp%d", snum++); - string facetexname = string(matr->id.name) + string(temp); - writeShader(shader_name, matr, facetexname); + for (set<Material*>::const_iterator imgmat=imgtex->second.begin(); + imgmat!=imgtex->second.end();++imgmat) + { + Material* matr = *imgmat; + // mapper + params["type"] = yafray::parameter_t("blendermapper"); + char temp[32]; + sprintf(temp, "_ftmap%d", snum); + params["name"] = yafray::parameter_t(string(matr->id.name) + string(temp)); + params["input"] = yafray::parameter_t(imgtex->first->id.name); + // all yafray default settings, except for texco, so no need to set others + params["texco"] = yafray::parameter_t("uv"); + yafrayGate->addShader(params, lparams); + + // shader, remember name, used later when writing per-face-shaders + sprintf(temp, "_ftsha%d", snum); + string shader_name = string(matr->id.name) + string(temp); + imgtex_shader[string(matr->id.name) + string(imgtex->first->id.name)] = shader_name; + + sprintf(temp, "_ftmap%d", snum++); + string facetexname = string(matr->id.name) + string(temp); + writeShader(shader_name, matr, facetexname); + } } } @@ -993,7 +997,7 @@ void yafrayPluginRender_t::genFace(vector<int> &faces,vector<string> &shaders,ve TFace* tface = vlr->tface; if (tface) { Image* fimg = (Image*)tface->tpage; - if (fimg) fmatname = imgtex_shader[fimg]; + if (fimg) fmatname = imgtex_shader[fmatname + string(fimg->id.name)]; } } else if (fmatname.length()==0) fmatname = "blender_default"; diff --git a/source/blender/yafray/intern/yafray_Render.cpp b/source/blender/yafray/intern/yafray_Render.cpp index ba5121858e6..400f06e5c79 100644 --- a/source/blender/yafray/intern/yafray_Render.cpp +++ b/source/blender/yafray/intern/yafray_Render.cpp @@ -131,7 +131,7 @@ bool yafrayRender_t::getAllMatTexObs() if (fc_img) { Material* fmat = vlr->mat; // only save if TexFace enabled - if (fmat && (fmat->mode & MA_FACETEXTURE)) imagetex[fc_img] = fmat; + if (fmat && (fmat->mode & MA_FACETEXTURE)) imagetex[fc_img].insert(fmat); } } } diff --git a/source/blender/yafray/intern/yafray_Render.h b/source/blender/yafray/intern/yafray_Render.h index b14b19a568f..8acd0ee5078 100644 --- a/source/blender/yafray/intern/yafray_Render.h +++ b/source/blender/yafray/intern/yafray_Render.h @@ -63,6 +63,7 @@ extern void error (char *fmt, ...); #include <map> #include <string> #include <vector> +#include <set> class yafrayRender_t { @@ -90,8 +91,8 @@ class yafrayRender_t std::map<std::string, std::vector<float> > dupliMtx_list; std::map<std::string, Object*> dup_srcob; std::map<void*, Object*> objectData; - std::map<Image*, Material*> imagetex; - std::map<Image*, std::string> imgtex_shader; + std::map<Image*, std::set<Material*> > imagetex; + std::map<std::string, std::string> imgtex_shader; bool getAllMatTexObs(); |