diff options
Diffstat (limited to 'source/blender/yafray')
-rwxr-xr-x | source/blender/yafray/intern/export_File.cpp | 93 | ||||
-rw-r--r-- | source/blender/yafray/intern/export_Plugin.cpp | 71 | ||||
-rw-r--r-- | source/blender/yafray/intern/yafray_Render.cpp | 2 |
3 files changed, 97 insertions, 69 deletions
diff --git a/source/blender/yafray/intern/export_File.cpp b/source/blender/yafray/intern/export_File.cpp index 9badc0c5eff..272c830d7b7 100755 --- a/source/blender/yafray/intern/export_File.cpp +++ b/source/blender/yafray/intern/export_File.cpp @@ -220,7 +220,8 @@ bool yafrayFileRender_t::writeRender() ostr << "\tAA_passes=\"" << passes << "\" AA_minsamples=\"" << minsamples << "\"\n"; } else ostr << "\tAA_passes=\"0\" AA_minsamples=\"1\"\n"; - ostr << "\tAA_pixelwidth=\"1.5\" AA_threshold=\"0.05\" bias=\"" << R.r.YF_raybias << "\"\n"; + ostr << "\tAA_pixelwidth=\"1.5\" AA_threshold=\"0.05\" bias=\"" << R.r.YF_raybias + << "\" clamp_rgb=\"" << ((R.r.YF_clamprgb==0) ? "on" : "off") << "\"\n"; } World *world = G.scene->world; @@ -277,6 +278,12 @@ void yafrayFileRender_t::displayImage() fread(&header, 1, 18, fp); unsigned short width = (unsigned short)(header[12] + (header[13]<<8)); unsigned short height = (unsigned short)(header[14] + (header[15]<<8)); + // don't do anything if resolution doesn't match that of rectot + if ((width!=R.rectx) || (height!=R.recty)) { + fclose(fp); + fp = NULL; + return; + } unsigned char byte_per_pix = (unsigned char)(header[16]>>3); // read past any id (none in this case though) unsigned int idlen = (unsigned int)header[0]; @@ -672,7 +679,9 @@ void yafrayFileRender_t::writeShader(const string &shader_name, Material* matr, // reflection/refraction if ( (matr->mode & MA_RAYMIRROR) || (matr->mode & MA_RAYTRANSP) ) ostr << "\t\t<IOR value=\"" << matr->ang << "\" />\n"; - if (matr->mode & MA_RAYMIRROR) { + + if (matr->mode & MA_RAYMIRROR) + { // Sofar yafray's min_refle parameter (which misleadingly actually controls fresnel reflection offset) // has been mapped to Blender's ray_mirror parameter. // This causes it be be misinterpreted and misused as a reflection amount control however. @@ -683,19 +692,37 @@ void yafrayFileRender_t::writeShader(const string &shader_name, Material* matr, ostr << "\t\t<reflect_amount value=\""<< matr->ray_mirror << "\" />\n"; float fo = 1.f-(matr->fresnel_mir_i-1.f)*0.25f; // blender param range [1,5], also here reversed (1 in Blender -> no fresnel) ostr << "\t\t<fresnel_offset value=\""<< fo << "\" />\n"; - // transmit extinction color - ostr << "\t\t<extinction r=\"" << matr->YF_er << "\" g=\"" << matr->YF_eg << "\" b=\"" << matr->YF_eb << "\" />\n"; + // transmit absorption color + // to make things easier(?) for user it now specifies the actual color at 1 unit / YF_dscale of distance + const float maxlog = -log(1e-38); + float ar = (matr->YF_ar>0) ? -log(matr->YF_ar) : maxlog; + float ag = (matr->YF_ag>0) ? -log(matr->YF_ag) : maxlog; + float ab = (matr->YF_ab>0) ? -log(matr->YF_ab) : maxlog; + float sc = matr->YF_dscale; + if (sc!=0.f) sc=1.f/sc; + ostr << "\t\t<absorption r=\"" << ar*sc << "\" g=\"" << ag*sc << "\" b=\"" << ab*sc << "\" />\n"; // dispersion ostr << "\t\t<dispersion_power value=\"" << matr->YF_dpwr << "\" />\n"; ostr << "\t\t<dispersion_samples value=\"" << matr->YF_dsmp << "\" />\n"; ostr << "\t\t<dispersion_jitter value=\"" << (matr->YF_djit ? "on" : "off") << "\" />\n"; + + // for backward compatibility, also add old 'reflected' parameter, copy of mirror_color + ostr << "\t\t<reflected r=\"" << matr->mirr << "\" g=\"" << matr->mirg << "\" b=\"" << matr->mirb << "\" />\n"; + // same for 'min_refle' param. Instead of the ray_mirror parameter that was used before, since now + // the parameter's function is taken over by the fresnel offset parameter, use that instead. + ostr << "\t\t<min_refle value=\"" << fo << "\" />\n"; + } + if (matr->mode & MA_RAYTRANSP) { ostr << "\t\t<refract value=\"on\" />\n"; ostr << "\t\t<transmit_filter value=\"" << matr->filter << "\" />\n"; // tir on by default ostr << "\t\t<tir value=\"on\" />\n"; + // for backward compatibility, also add old 'transmitted' parameter, copy of 'color' * (1-alpha) + float na = 1.f-matr->alpha; + ostr << "\t\t<transmitted r=\"" << matr->r*na << "\" g=\"" << matr->g*na << "\" b=\"" << matr->b*na << "\" />\n"; } string Mmode = ""; @@ -1509,23 +1536,24 @@ void yafrayFileRender_t::writeLamps() if (lamp->type==LA_LOCAL) { if (lamp->mode & LA_YF_SOFT) { // shadowmapped omnidirectional light - ostr << "softlight"; + ostr << "softlight\""; is_softL = true; } else if ((lamp->mode & LA_SHAD_RAY) && (lamp->YF_ltradius>0.0)) { // area sphere, only when ray shadows enabled and radius>0.0 - ostr << "spherelight"; + ostr << "spherelight\""; is_sphereL = true; } - else ostr << "pointlight"; - ostr << "\" glow_intensity=\"" << lamp->YF_glowint << "\" glow_type=\"" << lamp->YF_glowtype << "\""; + else ostr << "pointlight\""; + ostr << " glow_intensity=\"" << lamp->YF_glowint << "\" glow_offset=\"" << lamp->YF_glowofs + << "\" glow_type=\"" << lamp->YF_glowtype << "\""; } else if (lamp->type==LA_SPOT) - ostr << "spotlight"; + ostr << "spotlight\""; else if ((lamp->type==LA_SUN) || (lamp->type==LA_HEMI)) // hemi exported as sun - ostr << "sunlight"; + ostr << "sunlight\""; else if (lamp->type==LA_YF_PHOTON) - ostr << "photonlight"; + ostr << "photonlight\""; else { // possibly unknown type, ignore cout << "Unknown Blender lamp type: " << lamp->type << endl; @@ -1839,36 +1867,25 @@ bool yafrayFileRender_t::writeWorld() MTex* wtex = world->mtex[i]; if (!wtex) continue; Image* wimg = wtex->tex->ima; + // now always exports if image used as world texture if ((wtex->tex->type==TEX_IMAGE) && (wimg!=NULL)) { string wt_path = wimg->name; adjustPath(wt_path); - if (BLI_testextensie(wimg->name, ".hdr")) { - ostr.str(""); - ostr << "<background type=\"image\" name=\"world_background\" "; - // exposure_adjust not restricted to integer range anymore - ostr << "exposure_adjust=\"" << wtex->tex->bright-1.f << "\" mapping=\"probe\" >\n"; - ostr << "\t<filename value=\"" << wt_path << "\" />\n"; - ostr << "\t<interpolate value=\"" << ((wtex->tex->imaflag & TEX_INTERPOL) ? "bilinear" : "none") << "\" />\n"; - ostr << "</background>\n\n"; - xmlfile << ostr.str(); - return true; - } - else if (BLI_testextensie(wimg->name, ".jpg") || BLI_testextensie(wimg->name, ".jpeg") || BLI_testextensie(wimg->name, ".tga")) { - ostr.str(""); - ostr << "<background type=\"image\" name=\"world_background\" >\n"; - /* - // not yet in yafray, always assumes spheremap for now, not the same as in Blender, - // which for some reason is scaled by 2 in Blender??? - if (wtex->texco & TEXCO_ANGMAP) - ostr << " mapping=\"probe\" >\n"; - else - ostr << " mapping=\"sphere\" >\n"; - */ - ostr << "\t<filename value=\"" << wt_path << "\" />\n"; - ostr << "</background>\n\n"; - xmlfile << ostr.str(); - return true; - } + ostr.str(""); + ostr << "<background type=\"image\" name=\"world_background\" "; + // exposure_adjust not restricted to integer range anymore + ostr << "exposure_adjust=\"" << wtex->tex->bright-1.f << "\""; + if (wtex->texco & TEXCO_ANGMAP) + ostr << " mapping=\"probe\" >\n"; + else if (wtex->texco & TEXCO_H_SPHEREMAP) // in yafray full sphere + ostr << " mapping=\"sphere\" >\n"; + else // assume 'tube' for anything else + ostr << " mapping=\"tube\" >\n"; + ostr << "\t<filename value=\"" << wt_path << "\" />\n"; + ostr << "\t<interpolate value=\"" << ((wtex->tex->imaflag & TEX_INTERPOL) ? "bilinear" : "none") << "\" />\n"; + ostr << "</background>\n\n"; + xmlfile << ostr.str(); + return true; } } diff --git a/source/blender/yafray/intern/export_Plugin.cpp b/source/blender/yafray/intern/export_Plugin.cpp index 9b4dc856f2f..886198c7be3 100644 --- a/source/blender/yafray/intern/export_Plugin.cpp +++ b/source/blender/yafray/intern/export_Plugin.cpp @@ -253,7 +253,7 @@ bool yafrayPluginRender_t::writeRender() params["background_name"] = yafray::parameter_t("world_background"); } params["bias"]=yafray::parameter_t(R.r.YF_raybias); - //params["outfile"]=yafray::parameter_t(imgout); + params["clamp_rgb"] = yafray::parameter_t((R.r.YF_clamprgb==0) ? "on" : "off"); blenderYafrayOutput_t output; yafrayGate->render(params,output); cout<<"render finished"<<endl; @@ -666,6 +666,7 @@ void yafrayPluginRender_t::writeShader(const string &shader_name, Material* matr // reflection/refraction if ( (matr->mode & MA_RAYMIRROR) || (matr->mode & MA_RAYTRANSP) ) params["IOR"] = yafray::parameter_t(matr->ang); + if (matr->mode & MA_RAYMIRROR) { // Sofar yafray's min_refle parameter (which misleadingly actually controls fresnel reflection offset) @@ -678,19 +679,37 @@ void yafrayPluginRender_t::writeShader(const string &shader_name, Material* matr params["reflect_amount"] = yafray::parameter_t(matr->ray_mirror); float fo = 1.f-(matr->fresnel_mir_i-1.f)*0.25f; // blender param range [1,5], also here reversed (1 in Blender -> no fresnel) params["fresnel_offset"] = yafray::parameter_t(fo); - // transmit extinction color - params["extinction"] = yafray::parameter_t(yafray::color_t(matr->YF_er, matr->YF_eg, matr->YF_eb)); + // transmit absorption color + // to make things easier(?) for user it now specifies the actual color at 1 unit / YF_dscale of distance + const float maxlog = -log(1e-38); + float ar = (matr->YF_ar>0) ? -log(matr->YF_ar) : maxlog; + float ag = (matr->YF_ag>0) ? -log(matr->YF_ag) : maxlog; + float ab = (matr->YF_ab>0) ? -log(matr->YF_ab) : maxlog; + float sc = matr->YF_dscale; + if (sc!=0.f) sc=1.f/sc; + params["absorption"] = yafray::parameter_t(yafray::color_t(ar*sc, ag*sc, ab*sc)); // dispersion params["dispersion_power"] = yafray::parameter_t(matr->YF_dpwr); params["dispersion_samples"] = yafray::parameter_t(matr->YF_dsmp); params["dispersion_jitter"] = yafray::parameter_t(matr->YF_djit ? "on" : "off"); + + // for backward compatibility, also add old 'reflected' parameter, copy of mirror_color + params["reflected"] = yafray::parameter_t(yafray::color_t(matr->mirr, matr->mirg, matr->mirb)); + // same for 'min_refle' param. Instead of the ray_mirror parameter that was used before, since now + // the parameter's function is taken over by the fresnel offset parameter, use that instead. + params["min_refle"] = yafray::parameter_t(fo); + } + if (matr->mode & MA_RAYTRANSP) { params["refract"] = yafray::parameter_t("on"); params["transmit_filter"] = yafray::parameter_t(matr->filter); // tir on by default params["tir"] = yafray::parameter_t("on"); + // for backward compatibility, also add old 'transmitted' parameter, copy of 'color' * (1-alpha) + float na = 1.f-matr->alpha; + params["transmitted"] = yafray::parameter_t(yafray::color_t(matr->r*na, matr->g*na, matr->b*na)); } string Mmode = ""; @@ -1500,6 +1519,7 @@ void yafrayPluginRender_t::writeLamps() } else params["type"] = yafray::parameter_t("pointlight"); params["glow_intensity"] = yafray::parameter_t(lamp->YF_glowint); + params["glow_offset"] = yafray::parameter_t(lamp->YF_glowofs); params["glow_type"] = yafray::parameter_t(lamp->YF_glowtype); } else if (lamp->type==LA_SPOT) @@ -1840,35 +1860,24 @@ bool yafrayPluginRender_t::writeWorld() MTex* wtex = world->mtex[i]; if (!wtex) continue; Image* wimg = wtex->tex->ima; + // now always exports if image used as world texture if ((wtex->tex->type==TEX_IMAGE) && (wimg!=NULL)) { string wt_path = wimg->name; adjustPath(wt_path); - if (BLI_testextensie(wimg->name, ".hdr")) { - params["type"] = yafray::parameter_t("image"); - params["name"] = yafray::parameter_t("world_background"); - // exposure_adjust not restricted to integer range anymore - params["exposure_adjust"] = yafray::parameter_t(wtex->tex->bright-1.f); + params["type"] = yafray::parameter_t("image"); + params["name"] = yafray::parameter_t("world_background"); + // exposure_adjust not restricted to integer range anymore + params["exposure_adjust"] = yafray::parameter_t(wtex->tex->bright-1.f); + if (wtex->texco & TEXCO_ANGMAP) params["mapping"] = yafray::parameter_t("probe"); - params["filename"] = yafray::parameter_t(wt_path); - params["interpolate"] = yafray::parameter_t((wtex->tex->imaflag & TEX_INTERPOL) ? "bilinear" : "none"); - yafrayGate->addBackground(params); - return true; - } - else if (BLI_testextensie(wimg->name, ".jpg") || BLI_testextensie(wimg->name, ".jpeg") || BLI_testextensie(wimg->name, ".tga")) { - params["type"] = yafray::parameter_t("image"); - params["name"] = yafray::parameter_t("world_background"); - /* - // not yet in yafray, always assumes spheremap for now, not the same as in Blender, - // which for some reason is scaled by 2 in Blender??? - if (wtex->texco & TEXCO_ANGMAP) - params["mapping"] = yafray::parameter_t("probe"); - else - params["mapping"] = yafray::parameter_t("sphere"); - */ - params["filename"] = yafray::parameter_t(wt_path); - yafrayGate->addBackground(params); - return true; - } + else if (wtex->texco & TEXCO_H_SPHEREMAP) // in yafray full sphere + params["mapping"] = yafray::parameter_t("sphere"); + else // assume 'tube' for anything else + params["mapping"] = yafray::parameter_t("tube"); + params["filename"] = yafray::parameter_t(wt_path); + params["interpolate"] = yafray::parameter_t((wtex->tex->imaflag & TEX_INTERPOL) ? "bilinear" : "none"); + yafrayGate->addBackground(params); + return true; } } @@ -1926,10 +1935,10 @@ bool blenderYafrayOutput_t::putPixel(int x, int y, const yafray::color_t &c, out++; if (out==4096) { - RE_local_render_display(0,R.recty-1, R.rectx, R.recty, R.rectot); + RE_local_render_display(0, R.recty-1, R.rectx, R.recty, R.rectot); out = 0; } - if (RE_local_test_break()) - return false; + + if (RE_local_test_break()) return false; return true; } diff --git a/source/blender/yafray/intern/yafray_Render.cpp b/source/blender/yafray/intern/yafray_Render.cpp index 18a12e14ae4..c6a588110c3 100644 --- a/source/blender/yafray/intern/yafray_Render.cpp +++ b/source/blender/yafray/intern/yafray_Render.cpp @@ -115,6 +115,8 @@ bool yafrayRender_t::getAllMatTexObs() (txtp==TEX_MAGIC) || (txtp==TEX_PLUGIN) || (txtp==TEX_ENVMAP)) continue; + // if texture is stucci, only export if 'nor' enabled + if ((txtp==TEX_STUCCI) && !((mx->mapto & MAP_NORM) || (mx->maptoneg & MAP_NORM))) continue; // In the case of an image texture, check that there is an actual image, otherwise ignore. // Stupid error was here (...if (txtp & TEX_IMAGE)...), // which happened to work sofar, but not anymore with the extended texture support.. |