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 /source/blender/yafray/intern
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.
Diffstat (limited to 'source/blender/yafray/intern')
-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();