Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlfredo de Greef <eeshlo@yahoo.com>2004-11-18 04:50:09 +0300
committerAlfredo de Greef <eeshlo@yahoo.com>2004-11-18 04:50:09 +0300
commit53d58505c5f88729237c861749215dd7fab6e3b4 (patch)
treedf0f79e29869ef15d2da5503c23f9fd368f6a14c
parentcefd1b2729b68d07d4a76338bd3ae39740c52b80 (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.
-rwxr-xr-xsource/blender/yafray/intern/export_File.cpp61
-rw-r--r--source/blender/yafray/intern/export_Plugin.cpp52
-rw-r--r--source/blender/yafray/intern/yafray_Render.cpp2
-rw-r--r--source/blender/yafray/intern/yafray_Render.h5
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();