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-10-26 04:52:12 +0400
committerAlfredo de Greef <eeshlo@yahoo.com>2004-10-26 04:52:12 +0400
commitc245379175a23f26a92b3e2adbda39b9fb46c396 (patch)
tree2c8aad713df994a5c910198e0f9a2f0120ccf0ba /source/blender/yafray/intern/export_File.cpp
parent85c889108d0b656e3d6f6193b4d11c41f6798e49 (diff)
Bugfixes:
Blender hemilight shadow flag now ignored (reported by varuag). Texture axes were not exported for procedural textures. Duplicate armatures were not handled correctly (reported by richie). Triangle uv-coord splitting (reported by anael, richie & Alvaro). Additions: Material 'TexFace' mode now works too, as in Blender it functions as an extra first texture channel, replacing the base color. The new noise functions for procedural textures are now supported in yafray, but is not quite completed yet, still undergoing changes. (needs yafray from cvs). The 'power' button has been renamed to 'EmitPwr', since it controls background, arealight (including lamp with radius) & material emit power. This button can now be used with the 'SkyDome' method as well to control background lighting. To control indirect lighting power, a button called 'GI pwr' has been added, only use this when really necessary, first try modifying 'EmitPwr' instead. Removed: The 'gradient' button. This includes the python code to set this parameter as well.
Diffstat (limited to 'source/blender/yafray/intern/export_File.cpp')
-rwxr-xr-xsource/blender/yafray/intern/export_File.cpp743
1 files changed, 476 insertions, 267 deletions
diff --git a/source/blender/yafray/intern/export_File.cpp b/source/blender/yafray/intern/export_File.cpp
index 5584ac47bd3..eca34a65504 100755
--- a/source/blender/yafray/intern/export_File.cpp
+++ b/source/blender/yafray/intern/export_File.cpp
@@ -313,13 +313,47 @@ static void adjustPath(string &path)
}
+static string noise2string(short nbtype)
+{
+ switch (nbtype) {
+ case TEX_BLENDER:
+ return "blender";
+ case TEX_STDPERLIN:
+ return "stdperlin";
+ case TEX_VORONOI_F1:
+ return "voronoi_f1";
+ case TEX_VORONOI_F2:
+ return "voronoi_f2";
+ case TEX_VORONOI_F3:
+ return "voronoi_f3";
+ case TEX_VORONOI_F4:
+ return "voronoi_f4";
+ case TEX_VORONOI_F2F1:
+ return "voronoi_f2f1";
+ case TEX_VORONOI_CRACKLE:
+ return "voronoi_crackle";
+ case TEX_CELLNOISE:
+ return "cellnoise";
+ default:
+ case TEX_NEWPERLIN:
+ return "newperlin";
+ }
+}
+
void yafrayFileRender_t::writeTextures()
{
- for (map<string, pair<Material*, MTex*> >::const_iterator blendtex=used_textures.begin();
+ string ts;
+ for (map<string, MTex*>::const_iterator blendtex=used_textures.begin();
blendtex!=used_textures.end();++blendtex) {
- //Material* matr = blendtex->second.first;
- MTex* mtex = blendtex->second.second;
+ MTex* mtex = blendtex->second;
Tex* tex = mtex->tex;
+
+ float nsz = tex->noisesize;
+ if (nsz!=0.f) nsz=1.f/nsz;
+
+ // noisebasis type
+ string ntype = noise2string(tex->noisebasis);
+
switch (tex->type) {
case TEX_STUCCI:
// stucci is clouds as bump, but could be added to yafray to handle both wall in/out as well.
@@ -329,8 +363,9 @@ void yafrayFileRender_t::writeTextures()
ostr << "<shader type=\"clouds\" name=\"" << blendtex->first << "\" >\n";
ostr << "\t<attributes>\n";
ostr << "\t\t<depth value=\"" << tex->noisedepth+1 << "\" />\n";
- ostr << "\t</attributes>\n";
- ostr << "</shader >\n\n";
+ ostr << "\t\t<size value=\"" << nsz << "\" />\n";
+ ostr << "\t\t<noise_type value=\"" << ntype << "\" />\n";
+ ostr << "\t</attributes>\n</shader >\n\n";
xmlfile << ostr.str();
break;
}
@@ -342,11 +377,10 @@ void yafrayFileRender_t::writeTextures()
ostr << "\t\t<turbulence value=\"" << tex->turbul << "\" />\n";
ostr << "\t\t<ringscale_x value=\"" << mtex->size[0] << "\" />\n";
ostr << "\t\t<ringscale_y value=\"" << mtex->size[1] << "\" />\n";
- string ts = "on";
+ ts = "on";
if (tex->noisetype==TEX_NOISESOFT) ts = "off";
ostr << "\t\t<hard value=\"" << ts << "\" />\n";
- ostr << "\t</attributes>\n";
- ostr << "</shader>\n\n";
+ ostr << "\t</attributes>\n</shader>\n\n";
xmlfile << ostr.str();
break;
}
@@ -356,28 +390,115 @@ void yafrayFileRender_t::writeTextures()
ostr << "\t<attributes>\n";
ostr << "\t\t<depth value=\"" << tex->noisedepth+1 << "\" />\n";
ostr << "\t\t<turbulence value=\"" << tex->turbul << "\" />\n";
- string ts = "on";
+ ts = "on";
if (tex->noisetype==TEX_NOISESOFT) ts = "off";
ostr << "\t\t<hard value=\"" << ts << "\" />\n";
ts = "1";
if (tex->stype==1) ts="5"; else if (tex->stype==2) ts="10";
ostr << "\t\t<sharpness value=\"" << ts << "\" />\n";
- ostr << "\t</attributes>\n";
- ostr << "</shader>\n\n";
+ ostr << "\t</attributes>\n</shader>\n\n";
+ xmlfile << ostr.str();
+ break;
+ }
+ case TEX_VORONOI: {
+ ostr.str("");
+ ostr << "<shader type=\"voronoi\" name=\"" << blendtex->first << "\" >\n";
+ ostr << "\t<attributes>\n";
+ ts = "int";
+ if (tex->vn_coltype==1)
+ ts = "col1";
+ else if (tex->vn_coltype==2)
+ ts = "col2";
+ else if (tex->vn_coltype==3)
+ ts = "col3";
+ ostr << "\t\t<color_type value=\"" << ts << "\" />\n";
+ ostr << "\t\t<weight1 value=\"" << tex->vn_w1 << "\" />\n";
+ ostr << "\t\t<weight2 value=\"" << tex->vn_w2 << "\" />\n";
+ ostr << "\t\t<weight3 value=\"" << tex->vn_w3 << "\" />\n";
+ ostr << "\t\t<weight4 value=\"" << tex->vn_w4 << "\" />\n";
+ ostr << "\t\t<mk_exponent value=\"" << tex->vn_mexp << "\" />\n";
+ ostr << "\t\t<intensity value=\"" << tex->ns_outscale << "\" />\n";
+ ostr << "\t\t<size value=\"" << nsz << "\" />\n";
+ ts = "actual";
+ if (tex->vn_distm==TEX_DISTANCE_SQUARED)
+ ts = "squared";
+ else if (tex->vn_distm==TEX_MANHATTAN)
+ ts = "manhattan";
+ else if (tex->vn_distm==TEX_CHEBYCHEV)
+ ts = "chebychev";
+ else if (tex->vn_distm==TEX_MINKOVSKY_HALF)
+ ts = "minkovsky_half";
+ else if (tex->vn_distm==TEX_MINKOVSKY_FOUR)
+ ts = "minkovsky_four";
+ else if (tex->vn_distm==TEX_MINKOVSKY)
+ ts = "minkovsky";
+ ostr << "\t\t<distance_metric value=\"" << ts << "\" />\n";
+ ostr << "\t</attributes>\n</shader>\n\n";
+ xmlfile << ostr.str();
+ break;
+ }
+ case TEX_MUSGRAVE: {
+ ostr.str("");
+ ostr << "<shader type=\"musgrave\" name=\"" << blendtex->first << "\" >\n";
+ ostr << "\t<attributes>\n";
+ switch (tex->stype) {
+ case TEX_MFRACTAL:
+ ts = "multifractal";
+ break;
+ case TEX_RIDGEDMF:
+ ts = "ridgedmf";
+ break;
+ case TEX_HYBRIDMF:
+ ts = "hybridmf";
+ break;
+ case TEX_HTERRAIN:
+ ts = "heteroterrain";
+ break;
+ default:
+ case TEX_FBM:
+ ts = "fBm";
+ }
+ ostr << "\t\t<musgrave_type value=\"" << ts << "\" />\n";
+ ostr << "\t\t<noise_type value=\"" << ntype << "\" />\n";
+ ostr << "\t\t<H value=\"" << tex->mg_H << "\" />\n";
+ ostr << "\t\t<lacunarity value=\"" << tex->mg_lacunarity << "\" />\n";
+ ostr << "\t\t<octaves value=\"" << tex->mg_octaves << "\" />\n";
+ if ((tex->stype==TEX_HTERRAIN) || (tex->stype==TEX_RIDGEDMF) || (tex->stype==TEX_HYBRIDMF)) {
+ ostr << "\t\t<offset value=\"" << tex->mg_offset << "\" />\n";
+ if ((tex->stype==TEX_RIDGEDMF) || (tex->stype==TEX_HYBRIDMF))
+ ostr << "\t\t<gain value=\"" << tex->mg_gain << "\" />\n";
+ }
+ ostr << "\t\t<size value=\"" << nsz << "\" />\n";
+ ostr << "\t\t<intensity value=\"" << tex->ns_outscale << "\" />\n";
+ ostr << "\t</attributes>\n</shader>\n\n";
+ xmlfile << ostr.str();
+ break;
+ }
+ case TEX_DISTNOISE: {
+ ostr.str("");
+ ostr << "<shader type=\"distorted_noise\" name=\"" << blendtex->first << "\" >\n";
+ ostr << "\t<attributes>\n";
+ ostr << "\t\t<distort value=\"" << tex->dist_amount << "\" />\n";
+ ostr << "\t\t<size value=\"" << nsz << "\" />\n";
+ ostr << "\t\t<noise_type1 value=\"" << ntype << "\" />\n";
+ ostr << "\t\t<noise_type2 value=\"" << noise2string(tex->noisebasis2) << "\" />\n";
+ ostr << "\t</attributes>\n</shader>\n\n";
xmlfile << ostr.str();
break;
}
case TEX_IMAGE: {
Image* ima = tex->ima;
if (ima) {
+ // remove from imagetex list to avoid possible duplicates when TexFace used
+ imagetex.erase(ima);
ostr.str("");
- ostr << "<shader type=\"image\" name=\"" << blendtex->first << "\" >\n";
+ // use image name instead of texname here
+ ostr << "<shader type=\"image\" name=\"" << ima->id.name << "\" >\n";
ostr << "\t<attributes>\n";
- string texpath = ima->name;
+ string texpath(ima->name);
adjustPath(texpath);
ostr << "\t\t<filename value=\"" << texpath << "\" />\n";
- ostr << "\t</attributes>\n";
- ostr << "</shader>\n\n";
+ ostr << "\t</attributes>\n</shader>\n\n";
xmlfile << ostr.str();
}
break;
@@ -409,19 +530,235 @@ void yafrayFileRender_t::writeTextures()
}
}
+
+ // If used, textures for the material 'TexFace' case
+ if (!imagetex.empty()) {
+ for (map<Image*, Material*>::const_iterator imgtex=imagetex.begin();
+ imgtex!=imagetex.end();++imgtex)
+ {
+ ostr.str("");
+ ostr << "<shader type=\"image\" name=\"" << imgtex->first->id.name << "\" >\n";
+ ostr << "\t<attributes>\n";
+ string texpath(imgtex->first->name);
+ adjustPath(texpath);
+ ostr << "\t\t<filename value=\"" << texpath << "\" />\n";
+ ostr << "\t</attributes>\n</shader>\n\n";
+ xmlfile << ostr.str();
+ }
+ }
+
+}
+
+void yafrayFileRender_t::writeShader(const string &shader_name, Material* matr, const string &facetexname)
+{
+ ostr.str("");
+ ostr << "<shader type=\"blendershader\" name=\"" << shader_name << "\" >\n";
+ ostr << "\t<attributes>\n";
+ float diff = matr->alpha;
+ ostr << "\t\t<color r=\"" << matr->r*diff << "\" g=\"" << matr->g*diff << "\" b=\"" << matr->b*diff << "\" />\n";
+ ostr << "\t\t<specular_color r=\"" << matr->specr << "\" g=\"" << matr->specg << "\" b=\"" << matr->specb << "\" />\n";
+ ostr << "\t\t<mirror_color r=\"" << matr->mirr << "\" g=\"" << matr->mirg << "\" b=\"" << matr->mirb << "\" />\n";
+ ostr << "\t\t<diffuse_reflect value=\"" << matr->ref << "\" />\n";
+ ostr << "\t\t<specular_amount value=\"" << matr->spec << "\" />\n";
+ ostr << "\t\t<hard value=\"" << matr->har << "\" />\n";
+ ostr << "\t\t<alpha value=\"" << matr->alpha << "\" />\n";
+ // if no GI used, the GIpower parameter is not always initialized, so in that case ignore it
+ float bg_mult = (R.r.GImethod==0) ? 1 : R.r.GIpower;
+ ostr << "\t\t<emit value=\"" << (matr->emit * bg_mult) << "\" />\n";
+
+ // reflection/refraction
+ if ( (matr->mode & MA_RAYMIRROR) || (matr->mode & MA_RAYTRANSP) )
+ ostr << "\t\t<IOR value=\"" << matr->ang << "\" />\n";
+ if (matr->mode & MA_RAYMIRROR) {
+ float rf = matr->ray_mirror;
+ // blender uses mir color for reflection as well
+ ostr << "\t\t<reflected r=\"" << matr->mirr << "\" g=\"" << matr->mirg << "\" b=\"" << matr->mirb << "\" />\n";
+ ostr << "\t\t<min_refle value=\""<< rf << "\" />\n";
+ if (matr->ray_depth>maxraydepth) maxraydepth = matr->ray_depth;
+ }
+ if (matr->mode & MA_RAYTRANSP)
+ {
+ float tr=1.0-matr->alpha;
+ ostr << "\t\t<transmitted r=\"" << matr->r * tr << "\" g=\"" << matr->g * tr << "\" b=\"" << matr->b * tr << "\" />\n";
+ // tir on by default
+ ostr << "\t\t<tir value=\"on\" />\n";
+ if (matr->ray_depth_tra>maxraydepth) maxraydepth = matr->ray_depth_tra;
+ }
+
+ string Mmode = "";
+ if (matr->mode & MA_TRACEBLE) Mmode += "traceable";
+ if (matr->mode & MA_SHADOW) Mmode += " shadow";
+ if (matr->mode & MA_SHLESS) Mmode += " shadeless";
+ if (matr->mode & MA_VERTEXCOL) Mmode += " vcol_light";
+ if (matr->mode & MA_VERTEXCOLP) Mmode += " vcol_paint";
+ if (matr->mode & MA_ZTRA) Mmode += " ztransp";
+ if (matr->mode & MA_ONLYSHADOW) Mmode += " onlyshadow";
+ if (Mmode!="") ostr << "\t\t<matmodes value=\"" << Mmode << "\" />\n";
+ ostr << "\t</attributes>\n";
+ xmlfile << ostr.str();
+
+ // modulators
+ // first modulator is the texture of the face, if used (TexFace mode)
+ if (facetexname.length()!=0) {
+ ostr.str("");
+ ostr << "\t<modulator>\n";
+ ostr << "\t\t<input value=\"" << facetexname << "\" />\n";
+ ostr << "\t\t<color value=\"1\" />\n";
+ ostr << "\t</modulator>\n";
+ xmlfile << ostr.str();
+ }
+
+ for (int m2=0;m2<8;m2++) {
+
+ if (matr->septex & (1<<m2)) continue;// all active channels
+
+ // ignore null mtex
+ MTex* mtex = matr->mtex[m2];
+ if (mtex==NULL) continue;
+
+ // ignore null tex
+ Tex* tex = mtex->tex;
+ if (tex==NULL) continue;
+
+ map<string, MTex*>::const_iterator mtexL = used_textures.find(string(tex->id.name));
+ if (mtexL!=used_textures.end()) {
+
+ ostr.str("");
+ ostr << "\t<modulator>\n";
+ // when no facetex used, shader_name is created from original material name
+ if (facetexname.length()!=0)
+ ostr << "\t\t<input value=\"" << matr->id.name << "_map" << m2 << "\" />\n";
+ else
+ ostr << "\t\t<input value=\"" << shader_name << "_map" << m2 << "\" />\n";
+
+ // blendtype
+ string ts = "mix";
+ if (mtex->blendtype==MTEX_MUL) ts="mul";
+ else if (mtex->blendtype==MTEX_ADD) ts="add";
+ else if (mtex->blendtype==MTEX_SUB) ts="sub";
+ ostr << "\t\t<mode value=\"" << ts << "\" />\n";
+
+ // texture color (for use with MUL and/or no_rgb etc..)
+ ostr << "\t\t<texcol r=\"" << mtex->r << "\" g=\"" << mtex->g << "\" b=\"" << mtex->b << "\" />\n";
+
+ // texture contrast, brightness & color adjustment
+ ostr << "\t\t<filtercolor r=\"" << tex->rfac << "\" g=\"" << tex->gfac << "\" b=\"" << tex->bfac << "\" />\n";
+ ostr << "\t\t<contrast value=\"" << tex->contrast << "\" />\n";
+ ostr << "\t\t<brightness value=\"" << tex->bright << "\" />\n";
+
+ // all texture flags now are switches, having the value 1 or -1 (negative option)
+ // the negative option only used for the intensity modulation options.
+
+ // material (diffuse) color, amount controlled by colfac (see below)
+ if (mtex->mapto & MAP_COL)
+ ostr << "\t\t<color value=\"1\" />\n";
+
+ // bumpmapping
+ if ((mtex->mapto & MAP_NORM) || (mtex->maptoneg & MAP_NORM)) {
+ // for yafray, bump factor is negated (unless negative option of 'Nor', is not affected by 'Neg')
+ // scaled down quite a bit for yafray
+ float nf = -mtex->norfac;
+ if (mtex->maptoneg & MAP_NORM) nf *= -1.f;
+ ostr << "\t\t<normal value=\"" << (nf/60.f) << "\" />\n";
+
+ }
+
+ // all blender texture modulation as switches, either 1 or -1 (negative state of button)
+ // Csp, specular color modulation
+ if (mtex->mapto & MAP_COLSPEC)
+ ostr << "\t\t<colspec value=\"1\" />\n";
+
+ // CMir, mirror color modulation
+ if (mtex->mapto & MAP_COLMIR)
+ ostr << "\t\t<colmir value=\"1\" />\n";
+
+ // Ref, diffuse reflection amount modulation
+ if ((mtex->mapto & MAP_REF) || (mtex->maptoneg & MAP_REF)) {
+ int t = 1;
+ if (mtex->maptoneg & MAP_REF) t = -1;
+ ostr << "\t\t<difref value=\"" << t << "\" />\n";
+ }
+
+ // Spec, specular amount mod
+ if ((mtex->mapto & MAP_SPEC) || (mtex->maptoneg & MAP_SPEC)) {
+ int t = 1;
+ if (mtex->maptoneg & MAP_SPEC) t = -1;
+ ostr << "\t\t<specular value=\"" << t << "\" />\n";
+ }
+
+ // hardness modulation
+ if ((mtex->mapto & MAP_HAR) || (mtex->maptoneg & MAP_HAR)) {
+ int t = 1;
+ if (mtex->maptoneg & MAP_HAR) t = -1;
+ ostr << "\t\t<hard value=\"" << t << "\" />\n";
+ }
+
+ // alpha modulation
+ if ((mtex->mapto & MAP_ALPHA) || (mtex->maptoneg & MAP_ALPHA)) {
+ int t = 1;
+ if (mtex->maptoneg & MAP_ALPHA) t = -1;
+ ostr << "\t\t<alpha value=\"" << t << "\" />\n";
+
+ }
+
+ // emit modulation
+ if ((mtex->mapto & MAP_EMIT) || (mtex->maptoneg & MAP_EMIT)) {
+ int t = 1;
+ if (mtex->maptoneg & MAP_EMIT) t = -1;
+ ostr << "\t\t<emit value=\"" << t << "\" />\n";
+ }
+
+ // texture flag, combination of strings
+ if (mtex->texflag & (MTEX_RGBTOINT | MTEX_STENCIL | MTEX_NEGATIVE)) {
+ ts = "";
+ if (mtex->texflag & MTEX_RGBTOINT) ts += "no_rgb ";
+ if (mtex->texflag & MTEX_STENCIL) ts += "stencil ";
+ if (mtex->texflag & MTEX_NEGATIVE) ts += "negative";
+ ostr << "\t\t<texflag value=\"" << ts << "\" />\n";
+ }
+
+ // colfac, controls amount of color modulation
+ ostr << "\t\t<colfac value=\"" << mtex->colfac << "\" />\n";
+
+ // def_var
+ ostr << "\t\t<def_var value=\"" << mtex->def_var << "\" />\n";
+
+ //varfac
+ ostr << "\t\t<varfac value=\"" << mtex->varfac << "\" />\n";
+
+ if ((tex->imaflag & (TEX_CALCALPHA | TEX_USEALPHA)) || (tex->flag & TEX_NEGALPHA)) {
+ ts = "";
+ if (tex->imaflag & TEX_CALCALPHA) ts += "calc_alpha ";
+ if (tex->imaflag & TEX_USEALPHA) ts += "use_alpha ";
+ if (tex->flag & TEX_NEGALPHA) ts += "neg_alpha";
+ ostr << "\t\t<alpha_flag value=\"" << ts << "\" />\n";
+ }
+
+ ostr << "\t</modulator>\n";
+ xmlfile << ostr.str();
+
+ }
+ }
+ xmlfile << "</shader>\n\n";
+
}
// write all materials & modulators
void yafrayFileRender_t::writeMaterialsAndModulators()
{
+ // shaders/mappers for regular texture (or non-texture) mode
+ // In case material has texface mode, and all faces have an image texture,
+ // this shader will not be used, but still be written
for (map<string, Material*>::const_iterator blendmat=used_materials.begin();
- blendmat!=used_materials.end();++blendmat) {
+ blendmat!=used_materials.end();++blendmat)
+ {
Material* matr = blendmat->second;
- // blendermappers
- for (int m=0;m<8;m++) {
+ // mapper(s)
+ for (int m=0;m<8;m++)
+ {
if (matr->septex & (1<<m)) continue;// all active channels
@@ -432,8 +769,7 @@ void yafrayFileRender_t::writeMaterialsAndModulators()
Tex* tex = mtex->tex;
if (tex==NULL) continue;
- // now included the full name
- map<string, pair<Material*, MTex*> >::const_iterator mtexL = used_textures.find(string(tex->id.name));
+ map<string, MTex*>::const_iterator mtexL = used_textures.find(string(tex->id.name));
if (mtexL!=used_textures.end()) {
ostr.str("");
ostr << "<shader type=\"blendermapper\" name=\"" << blendmat->first + "_map" << m <<"\"";
@@ -448,34 +784,30 @@ void yafrayFileRender_t::writeMaterialsAndModulators()
else // also for refl. map
MTC_Mat4CpyMat4(texmat, maincam_obj->obmat);
MTC_Mat4Invert(itexmat, texmat);
- ostr << "\n m00=\"" << itexmat[0][0] << "\" m01=\"" << itexmat[1][0]
- << "\" m02=\"" << itexmat[2][0] << "\" m03=\"" << itexmat[3][0] << "\"\n\t";
- ostr << " m10=\"" << itexmat[0][1] << "\" m11=\"" << itexmat[1][1]
- << "\" m12=\"" << itexmat[2][1] << "\" m13=\"" << itexmat[3][1] << "\"\n\t";
- ostr << " m20=\"" << itexmat[0][2] << "\" m21=\"" << itexmat[1][2]
- << "\" m22=\"" << itexmat[2][2] << "\" m23=\"" << itexmat[3][2] << "\"\n\t";
- ostr << " m30=\"" << itexmat[0][3] << "\" m31=\"" << itexmat[1][3]
- << "\" m32=\"" << itexmat[2][3] << "\" m33=\"" << itexmat[3][3] << "\">\n";
+ ostr << "\n\t\tm00=\"" << itexmat[0][0] << "\" m01=\"" << itexmat[1][0]
+ << "\" m02=\"" << itexmat[2][0] << "\" m03=\"" << itexmat[3][0] << "\"\n";
+ ostr << "\t\tm10=\"" << itexmat[0][1] << "\" m11=\"" << itexmat[1][1]
+ << "\" m12=\"" << itexmat[2][1] << "\" m13=\"" << itexmat[3][1] << "\"\n";
+ ostr << "\t\tm20=\"" << itexmat[0][2] << "\" m21=\"" << itexmat[1][2]
+ << "\" m22=\"" << itexmat[2][2] << "\" m23=\"" << itexmat[3][2] << "\"\n";
+ ostr << "\t\tm30=\"" << itexmat[0][3] << "\" m31=\"" << itexmat[1][3]
+ << "\" m32=\"" << itexmat[2][3] << "\" m33=\"" << itexmat[3][3] << "\">\n";
}
else ostr << ">\n";
ostr << "\t<attributes>\n";
- if ((tex->flag & TEX_COLORBAND) & (tex->coba!=NULL))
+ // use image name instead of texname when texture is image
+ if ((tex->type==TEX_IMAGE) && tex->ima)
+ ostr << "\t\t<input value=\"" << tex->ima->id.name << "\" />\n";
+ else if ((tex->flag & TEX_COLORBAND) & (tex->coba!=NULL))
ostr << "\t\t<input value=\"" << mtexL->first + "_coba" << "\" />\n";
else
ostr << "\t\t<input value=\"" << mtexL->first << "\" />\n";
- // size, if the texturetype is clouds/marble/wood, also take noisesize into account
- float sc = 1;
- if ((tex->type==TEX_CLOUDS) || (tex->type==TEX_MARBLE) || (tex->type==TEX_WOOD)) {
- sc = tex->noisesize;
- if (sc!=0) sc = 1.f/sc;
-
- }
// texture size
- ostr << "\t\t<sizex value=\"" << mtex->size[0]*sc << "\" />\n";
- ostr << "\t\t<sizey value=\"" << mtex->size[1]*sc << "\" />\n";
- ostr << "\t\t<sizez value=\"" << mtex->size[2]*sc << "\" />\n";
+ ostr << "\t\t<sizex value=\"" << mtex->size[0] << "\" />\n";
+ ostr << "\t\t<sizey value=\"" << mtex->size[1] << "\" />\n";
+ ostr << "\t\t<sizez value=\"" << mtex->size[2] << "\" />\n";
// texture offset
ostr << "\t\t<ofsx value=\"" << mtex->ofs[0] << "\" />\n";
@@ -483,7 +815,7 @@ void yafrayFileRender_t::writeMaterialsAndModulators()
ostr << "\t\t<ofsz value=\"" << mtex->ofs[2] << "\" />\n";
// texture coordinates, have to disable 'sticky' in Blender
- if ((mtex->texco & TEXCO_UV) || (matr->mode & MA_FACETEXTURE))
+ if (mtex->texco & TEXCO_UV)
ostr << "\t\t<texco value=\"uv\" />\n";
else if ((mtex->texco & TEXCO_GLOB) || (mtex->texco & TEXCO_OBJECT))
// object mode is also set as global, but the object matrix was specified above with <modulator..>
@@ -497,6 +829,12 @@ void yafrayFileRender_t::writeMaterialsAndModulators()
else if (mtex->texco & TEXCO_REFL)
ostr << "\t\t<texco value=\"reflect\" />\n";
+ // texture projection axes, both image & procedural
+ string proj = "nxyz"; // 'n' for 'none'
+ ostr << "\t\t<proj_x value=\"" << proj[mtex->projx] << "\" />\n";
+ ostr << "\t\t<proj_y value=\"" << proj[mtex->projy] << "\" />\n";
+ ostr << "\t\t<proj_z value=\"" << proj[mtex->projz] << "\" />\n";
+
// texture mapping parameters only relevant to image type
if (tex->type==TEX_IMAGE) {
if (mtex->mapping==MTEX_FLAT)
@@ -508,12 +846,6 @@ void yafrayFileRender_t::writeMaterialsAndModulators()
else if (mtex->mapping==MTEX_SPHERE)
ostr << "\t\t<mapping value=\"sphere\" />\n";
- // texture projection axes
- string proj = "nxyz"; // 'n' for 'none'
- ostr << "\t\t<proj_x value=\"" << proj[mtex->projx] << "\" />\n";
- ostr << "\t\t<proj_y value=\"" << proj[mtex->projy] << "\" />\n";
- ostr << "\t\t<proj_z value=\"" << proj[mtex->projz] << "\" />\n";
-
// repeat
ostr << "\t\t<xrepeat value=\"" << tex->xrepeat << "\" />\n";
ostr << "\t\t<yrepeat value=\"" << tex->yrepeat << "\" />\n";
@@ -547,185 +879,45 @@ void yafrayFileRender_t::writeMaterialsAndModulators()
}
}
- // blendershaders + modulators
- ostr.str("");
- ostr << "<shader type=\"blendershader\" name=\"" << blendmat->first << "\" >\n";
- ostr << "\t<attributes>\n";
- float diff=matr->alpha;
- ostr << "\t\t<color r=\"" << matr->r*diff << "\" g=\"" << matr->g*diff << "\" b=\"" << matr->b*diff << "\" />\n";
- ostr << "\t\t<specular_color r=\"" << matr->specr << "\" g=\"" << matr->specg << "\" b=\"" << matr->specb<< "\" />\n";
- ostr << "\t\t<mirror_color r=\"" << matr->mirr << "\" g=\"" << matr->mirg << "\" b=\"" << matr->mirb << "\" />\n";
- ostr << "\t\t<diffuse_reflect value=\"" << matr->ref << "\" />\n";
- ostr << "\t\t<specular_amount value=\"" << matr->spec << "\" />\n";
- ostr << "\t\t<hard value=\"" << matr->har << "\" />\n";
- ostr << "\t\t<alpha value=\"" << matr->alpha << "\" />\n";
- // if no GI used, the GIpower parameter is not always initialized, so in that case ignore it
- float bg_mult;
- if (R.r.GImethod==0) bg_mult=1; else bg_mult=R.r.GIpower;
- ostr << "\t\t<emit value=\"" << (matr->emit * bg_mult) << "\" />\n";
-
- // reflection/refraction
- if ( (matr->mode & MA_RAYMIRROR) || (matr->mode & MA_RAYTRANSP) )
- ostr << "\t\t<IOR value=\"" << matr->ang << "\" />\n";
- if (matr->mode & MA_RAYMIRROR) {
- float rf = matr->ray_mirror;
- // blender uses mir color for reflection as well
- ostr << "\t\t<reflected r=\"" << matr->mirr << "\" g=\"" << matr->mirg << "\" b=\"" << matr->mirb << "\" />\n";
- ostr << "\t\t<min_refle value=\""<< rf << "\" />\n";
- if (matr->ray_depth>maxraydepth) maxraydepth = matr->ray_depth;
- }
- if (matr->mode & MA_RAYTRANSP)
- {
- float tr=1.0-matr->alpha;
- ostr << "\t\t<transmitted r=\"" << matr->r * tr << "\" g=\"" << matr->g * tr << "\" b=\"" << matr->b * tr << "\" />\n";
- // tir on by default
- ostr << "\t\t<tir value=\"on\" />\n";
- if (matr->ray_depth_tra>maxraydepth) maxraydepth = matr->ray_depth_tra;
- }
-
- string Mmode = "";
- if (matr->mode & MA_TRACEBLE) Mmode += "traceable";
- if (matr->mode & MA_SHADOW) Mmode += " shadow";
- if (matr->mode & MA_SHLESS) Mmode += " shadeless";
- if (matr->mode & MA_VERTEXCOL) Mmode += " vcol_light";
- if (matr->mode & MA_VERTEXCOLP) Mmode += " vcol_paint";
- if (matr->mode & MA_ZTRA) Mmode += " ztransp";
- if (matr->mode & MA_ONLYSHADOW) Mmode += " onlyshadow";
- if (Mmode!="") ostr << "\t\t<matmodes value=\"" << Mmode << "\" />\n";
- ostr << "\t</attributes>\n";
- xmlfile << ostr.str();
-
- // modulators
- for (int m2=0;m2<8;m2++) {
-
- if (matr->septex & (1<<m2)) continue;// all active channels
-
- // ignore null mtex
- MTex* mtex = matr->mtex[m2];
- if (mtex==NULL) continue;
-
- // ignore null tex
- Tex* tex = mtex->tex;
- if (tex==NULL) continue;
-
- map<string, pair<Material*, MTex*> >::const_iterator mtexL = used_textures.find(string(tex->id.name));
- if (mtexL!=used_textures.end()) {
-
- ostr.str("");
- ostr << "\t<modulator>\n";
- ostr << "\t\t<input value=\"" << blendmat->first + "_map" << m2 << "\" />\n";
-
- // blendtype
- string ts = "mix";
- if (mtex->blendtype==MTEX_MUL) ts="mul";
- else if (mtex->blendtype==MTEX_ADD) ts="add";
- else if (mtex->blendtype==MTEX_SUB) ts="sub";
- ostr << "\t\t<mode value=\"" << ts << "\" />\n";
-
- // texture color (for use with MUL and/or no_rgb etc..)
- ostr << "\t\t<texcol r=\"" << mtex->r << "\" g=\"" << mtex->g << "\" b=\"" << mtex->b << "\" />\n";
-
- // texture contrast, brightness & color adjustment
- ostr << "\t\t<filtercolor r=\"" << tex->rfac << "\" g=\"" << tex->gfac << "\" b=\"" << tex->bfac << "\" />\n";
- ostr << "\t\t<contrast value=\"" << tex->contrast << "\" />\n";
- ostr << "\t\t<brightness value=\"" << tex->bright << "\" />\n";
-
- // all texture flags now are switches, having the value 1 or -1 (negative option)
- // the negative option only used for the intensity modulation options.
-
- // material (diffuse) color, amount controlled by colfac (see below)
- if (mtex->mapto & MAP_COL)
- ostr << "\t\t<color value=\"1\" />\n";
-
- // bumpmapping
- if ((mtex->mapto & MAP_NORM) || (mtex->maptoneg & MAP_NORM)) {
- // for yafray, bump factor is negated (unless negative option of 'Nor', is not affected by 'Neg')
- // scaled down quite a bit for yafray
- float nf = -mtex->norfac;
- if (mtex->maptoneg & MAP_NORM) nf *= -1.f;
- if (tex->type==TEX_IMAGE) nf/=60.f; else nf/=30.f;
- ostr << "\t\t<normal value=\"" << nf << "\" />\n";
-
- }
+ // shader + modulators
+ writeShader(blendmat->first, matr);
- // all blender texture modulation as switches, either 1 or -1 (negative state of button)
- // Csp, specular color modulation
- if (mtex->mapto & MAP_COLSPEC)
- ostr << "\t\t<colspec value=\"1\" />\n";
-
- // CMir, mirror color modulation
- if (mtex->mapto & MAP_COLMIR)
- ostr << "\t\t<colmir value=\"1\" />\n";
-
- // Ref, diffuse reflection amount modulation
- if ((mtex->mapto & MAP_REF) || (mtex->maptoneg & MAP_REF)) {
- int t = 1;
- if (mtex->maptoneg & MAP_REF) t = -1;
- ostr << "\t\t<difref value=\"" << t << "\" />\n";
- }
-
- // Spec, specular amount mod
- if ((mtex->mapto & MAP_SPEC) || (mtex->maptoneg & MAP_SPEC)) {
- int t = 1;
- if (mtex->maptoneg & MAP_SPEC) t = -1;
- ostr << "\t\t<specular value=\"" << t << "\" />\n";
- }
-
- // hardness modulation
- if ((mtex->mapto & MAP_HAR) || (mtex->maptoneg & MAP_HAR)) {
- int t = 1;
- if (mtex->maptoneg & MAP_HAR) t = -1;
- ostr << "\t\t<hard value=\"" << t << "\" />\n";
- }
-
- // alpha modulation
- if ((mtex->mapto & MAP_ALPHA) || (mtex->maptoneg & MAP_ALPHA)) {
- int t = 1;
- if (mtex->maptoneg & MAP_ALPHA) t = -1;
- ostr << "\t\t<alpha value=\"" << t << "\" />\n";
-
- }
-
- // emit modulation
- if ((mtex->mapto & MAP_EMIT) || (mtex->maptoneg & MAP_EMIT)) {
- int t = 1;
- if (mtex->maptoneg & MAP_EMIT) t = -1;
- ostr << "\t\t<emit value=\"" << t << "\" />\n";
- }
-
- // texture flag, combination of strings
- if (mtex->texflag & (MTEX_RGBTOINT | MTEX_STENCIL | MTEX_NEGATIVE)) {
- ts = "";
- if (mtex->texflag & MTEX_RGBTOINT) ts += "no_rgb ";
- if (mtex->texflag & MTEX_STENCIL) ts += "stencil ";
- if (mtex->texflag & MTEX_NEGATIVE) ts += "negative";
- ostr << "\t\t<texflag value=\"" << ts << "\" />\n";
- }
-
- // colfac, controls amount of color modulation
- ostr << "\t\t<colfac value=\"" << mtex->colfac << "\" />\n";
+ }
- // def_var
- ostr << "\t\t<def_var value=\"" << mtex->def_var << "\" />\n";
+ // write the mappers & shaders for the TexFace case
+ if (!imagetex.empty()) {
+ // 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();
+ imgtex!=imagetex.end();++imgtex)
+ {
+ Material* matr = imgtex->second;
- //varfac
- ostr << "\t\t<varfac value=\"" << mtex->varfac << "\" />\n";
+ // 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();
- if ((tex->imaflag & (TEX_CALCALPHA | TEX_USEALPHA)) || (tex->flag & TEX_NEGALPHA)) {
- ts = "";
- if (tex->imaflag & TEX_CALCALPHA) ts += "calc_alpha ";
- if (tex->imaflag & TEX_USEALPHA) ts += "use_alpha ";
- if (tex->flag & TEX_NEGALPHA) ts += "neg_alpha";
- ostr << "\t\t<alpha_flag value=\"" << ts << "\" />\n";
- }
+ // 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;
- ostr << "\t</modulator>\n";
- xmlfile << ostr.str();
+ ostr.str("");
+ ostr << matr->id.name << "_ftex_mp" << snum++;
+ writeShader(shader_name, matr, ostr.str());
- }
}
- xmlfile << "</shader>\n\n";
}
+
}
@@ -744,35 +936,45 @@ void yafrayFileRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_li
xmlfile << ostr.str();
ostr.str("");
- ostr << "<object name=\"" << obj->id.name+2 << "\"";
- // yafray still needs default shader name in object def.,
- // since we write a shader with every face, simply use the material of the first face
- // if this is an empty string, assume default mat
- char* matname = VLR_list[0]->mat->id.name;
- bool shadow=VLR_list[0]->mat->mode & MA_TRACEBLE;
- ostr <<" shadow=\""<< (shadow ? "on" : "off" )<<"\" ";
- bool caus = (((VLR_list[0]->mat->mode & MA_RAYTRANSP) | (VLR_list[0]->mat->mode & MA_RAYMIRROR))!=0);
- if (caus) ostr << "caus_IOR=\"" << VLR_list[0]->mat->ang << "\"";
- if (strlen(matname)==0) matname = "blender_default";
+ ostr << "<object name=\"" << obj->id.name << "\"";
+ // Yafray still needs default shader name in object def.,
+ // since we write a shader with every face, simply use the material of the first face.
+ // If this is an empty string, assume default material.
+ VlakRen* face0 = VLR_list[0];
+ Material* face0mat = face0->mat;
+ string matname(face0mat->id.name);
+ // use name in imgtex_shader list if 'TexFace' enabled for this material
+ if (face0mat->mode & MA_FACETEXTURE) {
+ TFace* tface = face0->tface;
+ if (tface) {
+ Image* fimg = (Image*)tface->tpage;
+ if (fimg) matname = imgtex_shader[fimg];
+ }
+ }
+ bool shadow = face0mat->mode & MA_TRACEBLE;
+ ostr <<" shadow=\""<< (shadow ? "on" : "off" ) << "\" ";
+ bool caus = (((face0mat->mode & MA_RAYTRANSP) | (face0->mat->mode & MA_RAYMIRROR))!=0);
+ if (caus) ostr << "caus_IOR=\"" << face0mat->ang << "\"";
+ if (matname.length()==0) matname = "blender_default";
ostr << " shader_name=\"" << matname << "\" >\n";
ostr << "\t<attributes>\n";
if (caus)
{
- float tr = 1.0-VLR_list[0]->mat->alpha;
- ostr << "\t\t<caus_tcolor r=\"" << VLR_list[0]->mat->r*tr
- << "\" g=\"" << VLR_list[0]->mat->g*tr
- << "\" b=\"" << VLR_list[0]->mat->b*tr << "\" />\n";
- tr = VLR_list[0]->mat->ray_mirror;
- ostr << "\t\t<caus_rcolor r=\"" << VLR_list[0]->mat->mirr*tr
- << "\" g=\"" << VLR_list[0]->mat->mirg*tr
- << "\" b=\"" << VLR_list[0]->mat->mirb*tr << "\" />\n";
+ float tr = 1.0-face0mat->alpha;
+ ostr << "\t\t<caus_tcolor r=\"" << face0mat->r*tr
+ << "\" g=\"" << face0mat->g*tr
+ << "\" b=\"" << face0mat->b*tr << "\" />\n";
+ tr = face0mat->ray_mirror;
+ ostr << "\t\t<caus_rcolor r=\"" << face0mat->mirr*tr
+ << "\" g=\"" << face0mat->mirg*tr
+ << "\" b=\"" << face0mat->mirb*tr << "\" />\n";
}
ostr << "\t</attributes>\n";
xmlfile << ostr.str();
// if any face in the Blender mesh uses an orco texture, every face has orco coords,
// so only need to check the first facevtx.orco in the list if they need to be exported
- bool EXPORT_ORCO = (VLR_list[0]->v1->orco!=NULL);
+ bool EXPORT_ORCO = (face0->v1->orco!=NULL);
string has_orco = "off";
if (EXPORT_ORCO) has_orco = "on";
@@ -793,7 +995,7 @@ void yafrayFileRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_li
// If AutoSmooth not used, since yafray currently cannot specify if a face is smooth
// or flat shaded, the smooth flag of the first face is used to determine
// the shading for the whole mesh
- if (VLR_list[0]->flag & ME_SMOOTH)
+ if (face0->flag & ME_SMOOTH)
xmlfile << "\t<mesh autosmooth=\"90\" has_orco=\"" << has_orco << "\" >\n";
else
xmlfile << "\t<mesh autosmooth=\"0.1\" has_orco=\"" << has_orco << "\" >\n"; //0 shows artefacts
@@ -885,33 +1087,38 @@ void yafrayFileRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_li
VlakRen* vlr = *fci2;
Material* fmat = vlr->mat;
bool EXPORT_VCOL = ((fmat->mode & (MA_VERTEXCOL|MA_VERTEXCOLP))!=0);
- char* fmatname = fmat->id.name;
- if (strlen(fmatname)==0) fmatname = "blender_default";
- TFace* uvc = vlr->tface; // possible uvcoords (v upside down)
- int idx1, idx2, idx3;
-
- idx1 = vert_idx.find(vlr->v1)->second;
- idx2 = vert_idx.find(vlr->v2)->second;
- idx3 = vert_idx.find(vlr->v3)->second;
-
+ string fmatname(fmat->id.name);
+ // use name in imgtex_shader list if 'TexFace' enabled for this face material
+ if (fmat->mode & MA_FACETEXTURE) {
+ TFace* tface = vlr->tface;
+ if (tface) {
+ Image* fimg = (Image*)tface->tpage;
+ if (fimg) fmatname = imgtex_shader[fimg];
+ }
+ }
+ else if (fmatname.length()==0) fmatname = "blender_default";
+
+ int idx1 = vert_idx.find(vlr->v1)->second;
+ int idx2 = vert_idx.find(vlr->v2)->second;
+ int idx3 = vert_idx.find(vlr->v3)->second;
// make sure the indices point to the vertices when orco coords exported
if (EXPORT_ORCO) { idx1*=2; idx2*=2; idx3*=2; }
ostr.str("");
ostr << "\t\t\t<f a=\"" << idx1 << "\" b=\"" << idx2 << "\" c=\"" << idx3 << "\"";
+ TFace* uvc = vlr->tface; // possible uvcoords (v upside down)
if (uvc) {
// use correct uv coords for this triangle
- if (vlr->flag & R_FACE_SPLIT) {
- ostr << " u_a=\"" << uvc->uv[0][0] << "\" v_a=\"" << 1-uvc->uv[0][1] << "\""
- << " u_b=\"" << uvc->uv[2][0] << "\" v_b=\"" << 1-uvc->uv[2][1] << "\""
- << " u_c=\"" << uvc->uv[3][0] << "\" v_c=\"" << 1-uvc->uv[3][1] << "\"";
- }
- else {
- ostr << " u_a=\"" << uvc->uv[0][0] << "\" v_a=\"" << 1-uvc->uv[0][1] << "\""
- << " u_b=\"" << uvc->uv[1][0] << "\" v_b=\"" << 1-uvc->uv[1][1] << "\""
- << " u_c=\"" << uvc->uv[2][0] << "\" v_c=\"" << 1-uvc->uv[2][1] << "\"";
+ int ui1=0, ui2=1, ui3=2;
+ if (vlr->flag & R_DIVIDE_24) {
+ ui3++;
+ if (vlr->flag & R_FACE_SPLIT) { ui1++; ui2++; }
}
+ else if (vlr->flag & R_FACE_SPLIT) { ui2++; ui3++; }
+ ostr << " u_a=\"" << uvc->uv[ui1][0] << "\" v_a=\"" << 1-uvc->uv[ui1][1] << "\""
+ << " u_b=\"" << uvc->uv[ui2][0] << "\" v_b=\"" << 1-uvc->uv[ui2][1] << "\""
+ << " u_c=\"" << uvc->uv[ui3][0] << "\" v_c=\"" << 1-uvc->uv[ui3][1] << "\"";
}
// since Blender seems to need vcols when uvs are used, for yafray only export when the material actually uses vcols
@@ -982,7 +1189,7 @@ void yafrayFileRender_t::writeAllObjects()
for (map<Object*, vector<VlakRen*> >::const_iterator obi=all_objects.begin();
obi!=all_objects.end(); ++obi)
{
- // skip main duplivert object if in dupliMtx_list, written later
+ // skip main duplivert object if in dupliMtx_list, written later
Object* obj = obi->first;
if (dupliMtx_list.find(string(obj->id.name))!=dupliMtx_list.end()) continue;
writeObject(obj, obi->second, obj->obmat);
@@ -1031,7 +1238,7 @@ void yafrayFileRender_t::writeAllObjects()
// new name from original
ostr.str("");
- ostr << "<object name=\"" << obj->id.name+2 << "_dup" << (curmtx>>4) << "\" original=\"" << obj->id.name+2 << "\" >\n";
+ ostr << "<object name=\"" << obj->id.name << "_dup" << (curmtx>>4) << "\" original=\"" << obj->id.name << "\" >\n";
xmlfile << ostr.str();
xmlfile << "\t<attributes>\n\t</attributes>\n\t<null/>\n</object>\n</transform>\n\n";
@@ -1150,11 +1357,16 @@ void yafrayFileRender_t::writeLamps()
// cast_shadows flag not used with softlight, spherelight or photonlight
if ((!is_softL) && (!is_sphereL) && (lamp->type!=LA_YF_PHOTON)) {
string lpmode="off";
- // shadows only when Blender has shadow button enabled, only spots use LA_SHAD flag
- if (R.r.mode & R_SHADOW)
- if (((lamp->type==LA_SPOT) && (lamp->mode & LA_SHAD)) || (lamp->mode & LA_SHAD_RAY)) lpmode="on";
+ // Shadows only when Blender has shadow button enabled, only spots use LA_SHAD flag.
+ // Also blender hemilights exported as sunlights which might have shadow flag set
+ // should have cast_shadows set to off (reported by varuag)
+ if (lamp->type!=LA_HEMI) {
+ if (R.r.mode & R_SHADOW)
+ if (((lamp->type==LA_SPOT) && (lamp->mode & LA_SHAD)) || (lamp->mode & LA_SHAD_RAY)) lpmode="on";
+ }
ostr << " cast_shadows=\"" << lpmode << "\"";
}
+
// spot specific stuff
bool has_halo = ((lamp->type==LA_SPOT) && (lamp->mode & LA_HALO) && (lamp->haint>0.0));
@@ -1287,7 +1499,7 @@ void yafrayFileRender_t::writeCamera()
void yafrayFileRender_t::writeHemilight()
{
ostr.str("");
- ostr << "<light type=\"hemilight\" name=\"hemi_LT\" power=\"1.0\" ";
+ ostr << "<light type=\"hemilight\" name=\"hemi_LT\" power=\"" << R.r.GIpower << "\"";
switch (R.r.GIquality)
{
case 1 :
@@ -1311,7 +1523,7 @@ void yafrayFileRender_t::writePathlight()
<< "\" caus_depth=\""<<R.r.GIcausdepth<< "\" search=\""<< R.r.GImixphotons<<"\" >"<<endl;
ostr << "</light>"<<endl;
}
- ostr << "<light type=\"pathlight\" name=\"path_LT\" power=\"1.0\" ";
+ ostr << "<light type=\"pathlight\" name=\"path_LT\" power=\"" << R.r.GIindirpower << "\"";
ostr << " depth=\"" << ((R.r.GIphotons) ? 1 : R.r.GIdepth) << "\" caus_depth=\"" << R.r.GIcausdepth <<"\"\n";
if(R.r.GIdirect && R.r.GIphotons) ostr << "direct=\"on\"" << endl;
if (R.r.GIcache && ! (R.r.GIdirect && R.r.GIphotons))
@@ -1327,12 +1539,10 @@ void yafrayFileRender_t::writePathlight()
}
float aspect = 1;
if (R.r.xsch < R.r.ysch) aspect = float(R.r.xsch)/float(R.r.ysch);
- //float sbase = 2.0*atan(0.5/(mainCamLens/(aspect*32.0)))/float(R.r.xsch);
float sbase = 2.0/float(R.r.xsch);
ostr << " cache=\"on\" use_QMC=\"on\" threshold=\"" <<R.r.GIrefinement<<"\""<<endl;
ostr << " cache_size=\"" << sbase*R.r.GIpixelspersample << "\" shadow_threshold=\"" <<
- 1.0 - R.r.GIshadowquality << "\" grid=\"82\" search=\"35\" gradient=\"" <<
- ((R.r.GIgradient)? "on" : "off") << "\" >\n";
+ 1.0 - R.r.GIshadowquality << "\" grid=\"82\" search=\"35\" >\n";
}
else
{
@@ -1404,8 +1614,7 @@ bool yafrayFileRender_t::writeWorld()
ostr << "<background type=\"constant\" name=\"world_background\" >\n";
// if no GI used, the GIpower parameter is not always initialized, so in that case ignore it
// (have to change method to init yafray vars in Blender)
- float bg_mult;
- if (R.r.GImethod==0) bg_mult=1; else bg_mult=R.r.GIpower;
+ float bg_mult = (R.r.GImethod==0) ? 1 : R.r.GIpower;
ostr << "\t<color r=\"" << (world->horr * bg_mult) <<
"\" g=\"" << (world->horg * bg_mult) <<
"\" b=\"" << (world->horb * bg_mult) << "\" />\n";