diff --git a/source/blender/makesdna/DNA_lamp_types.h b/source/blender/makesdna/DNA_lamp_types.h index 0a7bf2ddf5b..11f3d82fd8d 100644 --- a/source/blender/makesdna/DNA_lamp_types.h +++ b/source/blender/makesdna/DNA_lamp_types.h @@ -72,7 +72,7 @@ typedef struct Lamp { short YF_phdepth, YF_useqmc, YF_bufsize, YF_pad; float YF_causticblur, YF_ltradius; /* yafray: glow params */ - float YF_glowint; + float YF_glowint, YF_glowofs, YF_pad3; short YF_glowtype, YF_pad2; struct MTex *mtex[10]; diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h index 58af9c52de1..022da968c50 100644 --- a/source/blender/makesdna/DNA_material_types.h +++ b/source/blender/makesdna/DNA_material_types.h @@ -103,12 +103,9 @@ typedef struct Material { float fhdist, xyfrict; short dynamode, pad2; - /* yafray: dispersion parameters */ - float YF_er, YF_eg, YF_eb; - float YF_dpwr; - short YF_dsmp, YF_djit; - /* yafray: material preset menu */ - short YF_preset, pad6; + /* yafray: absorption color, dispersion parameters and material preset menu */ + float YF_ar, YF_ag, YF_ab, YF_dscale, YF_dpwr; + int YF_dsmp, YF_preset, YF_djit; ScriptLink scriptlink; } Material; diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index 863c9c605b1..8c24954af31 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -225,7 +225,7 @@ typedef struct RenderData { /* yafray: global panel params. TODO: move elsewhere */ short GIquality, GIcache, GImethod, GIphotons, GIdirect; - short YF_AA, YFexportxml, YF_nobump, yfpad1[2]; + short YF_AA, YFexportxml, YF_nobump, YF_clamprgb, yfpad1; int GIdepth, GIcausdepth, GIpixelspersample; int GIphotoncount, GImixphotons; float GIphotonradius; diff --git a/source/blender/render/extern/include/render_types.h b/source/blender/render/extern/include/render_types.h index 744c4aad74d..a1da133b877 100644 --- a/source/blender/render/extern/include/render_types.h +++ b/source/blender/render/extern/include/render_types.h @@ -302,7 +302,7 @@ typedef struct LampRen int YF_numphotons, YF_numsearch; short YF_phdepth, YF_useqmc, YF_bufsize; float YF_causticblur, YF_ltradius; - float YF_glowint; + float YF_glowint, YF_glowofs; short YF_glowtype; /* ray optim */ diff --git a/source/blender/render/intern/source/initrender.c b/source/blender/render/intern/source/initrender.c index 24f836688cf..fba9593fbbf 100644 --- a/source/blender/render/intern/source/initrender.c +++ b/source/blender/render/intern/source/initrender.c @@ -850,6 +850,10 @@ static void yafrayRender(void) else YAF_switchPlugin(); + RE_local_init_render_display(); + RE_local_clear_render_display(R.win); + RE_local_timecursor((G.scene->r.cfra)); + printf("Starting scene conversion.\n"); prepareScene(); printf("Scene conversion done.\n"); diff --git a/source/blender/renderconverter/intern/convertBlenderScene.c b/source/blender/renderconverter/intern/convertBlenderScene.c index 418ea8c709c..32ea28d2b9c 100644 --- a/source/blender/renderconverter/intern/convertBlenderScene.c +++ b/source/blender/renderconverter/intern/convertBlenderScene.c @@ -1758,6 +1758,7 @@ void RE_add_render_lamp(Object *ob, int doshadbuf) lar->YF_ltradius = la->YF_ltradius; lar->YF_bufsize = la->YF_bufsize; lar->YF_glowint = la->YF_glowint; + lar->YF_glowofs = la->YF_glowofs; lar->YF_glowtype = la->YF_glowtype; } diff --git a/source/blender/src/buttons_scene.c b/source/blender/src/buttons_scene.c index 7c525f81193..5a218a168cc 100644 --- a/source/blender/src/buttons_scene.c +++ b/source/blender/src/buttons_scene.c @@ -1279,16 +1279,17 @@ static void render_panel_yafrayGI() if (G.scene->r.GImethod>0) { if (G.scene->r.GIdepth==0) G.scene->r.GIdepth=2; + if (G.scene->r.GImethod==2) { uiDefButI(block, NUM, B_DIFF, "Depth:", 180,175,110,20, &G.scene->r.GIdepth, 1.0, 100.0, 10, 10, "Number of bounces of the indirect light"); uiDefButI(block, NUM, B_DIFF, "CDepth:", 180,150,110,20, &G.scene->r.GIcausdepth, 1.0, 100.0, 10, 10, "Number of bounces inside objects (for caustics)"); - uiDefButS(block,TOG|BIT|0, B_REDR, "Photons",240,125,89,20, &G.scene->r.GIphotons, 0, 0, 0, 0, "Use global photons to help in GI"); + uiDefButS(block,TOG|BIT|0, B_REDR, "Photons",210,125,100,20, &G.scene->r.GIphotons, 0, 0, 0, 0, "Use global photons to help in GI"); } - uiDefButS(block,TOG|BIT|0, B_REDR, "Cache",125,125,89,20, &G.scene->r.GIcache, 0, 0, 0, 0, "Cache occlusion/irradiance samples (faster)"); - if (G.scene->r.GIcache) - uiDefButS(block,TOG|BIT|0, B_REDR, "NoBump",15,125,89,20, &G.scene->r.YF_nobump, 0, 0, 0, 0, "Don't use bumpnormals for cache (faster, but no bumpmapping in total indirectly lit areas)"); + + uiDefButS(block,TOG|BIT|0, B_REDR, "Cache",6,125,95,20, &G.scene->r.GIcache, 0, 0, 0, 0, "Cache occlusion/irradiance samples (faster)"); if (G.scene->r.GIcache) { + uiDefButS(block,TOG|BIT|0, B_REDR, "NoBump",108,125,95,20, &G.scene->r.YF_nobump, 0, 0, 0, 0, "Don't use bumpnormals for cache (faster, but no bumpmapping in total indirectly lit areas)"); uiDefBut(block, LABEL, 0, "Cache parameters:", 5,105,130,20, 0, 1.0, 0, 0, 0, ""); if (G.scene->r.GIshadowquality==0.0) G.scene->r.GIshadowquality=0.9; uiDefButF(block, NUM, B_DIFF,"ShadQu:", 5,85,154,20, &(G.scene->r.GIshadowquality), 0.01, 1.0 ,1,0, "Sets the shadow quality, keep it under 0.95 :-) "); @@ -1297,6 +1298,7 @@ static void render_panel_yafrayGI() if (G.scene->r.GIrefinement==0) G.scene->r.GIrefinement=1.0; uiDefButF(block, NUM, B_DIFF, "Ref:", 84,60,75,20, &G.scene->r.GIrefinement, 0.001, 1.0, 1, 0, "Threshold to refine shadows EXPERIMENTAL. 1 = no refinement"); } + if (G.scene->r.GImethod==2) { if (G.scene->r.GIphotons) { @@ -1314,6 +1316,7 @@ static void render_panel_yafrayGI() 0, 0, 0, 0, "Show the photonmap directly in the render for tuning"); } } + } } @@ -1329,6 +1332,9 @@ static void render_panel_yafrayGlobal() // label to force a boundbox for buttons not to be centered uiDefBut(block, LABEL, 0, " ", 305,180,10,10, 0, 0, 0, 0, 0, ""); + uiDefButS(block,TOGN|BIT|0, B_REDR, "xml", 5,180,75,20, &G.scene->r.YFexportxml, + 0, 0, 0, 0, "Export to an xml file and call yafray instead of plugin"); + uiDefButF(block, NUMSLI, B_DIFF,"Bi ", 5,35,150,20, &(G.scene->r.YF_raybias), 0.0, 10.0 ,0,0, "Shadow ray bias to avoid self shadowing"); uiDefButI(block, NUM, B_DIFF, "Raydepth ", 5,60,150,20, @@ -1336,15 +1342,12 @@ static void render_panel_yafrayGlobal() uiDefButF(block, NUMSLI, B_DIFF, "Gam ", 5,10,150,20, &G.scene->r.YF_gamma, 0.001, 5.0, 0, 0, "Gamma correction, 1 is off"); uiDefButF(block, NUMSLI, B_DIFF, "Exp ", 160,10,150,20,&G.scene->r.YF_exposure, 0.0, 10.0, 0, 0, "Exposure adjustment, 0 is off"); - uiDefButI(block, NUM, B_DIFF, "Processors:", 160,35,150,20, - &G.scene->r.YF_numprocs, 1.0, 8.0, 10, 10, "Number of processors to use"); + uiDefButI(block, NUM, B_DIFF, "Processors:", 160,60,150,20, &G.scene->r.YF_numprocs, 1.0, 8.0, 10, 10, "Number of processors to use"); /*AA Settings*/ - uiDefButS(block,TOGN|BIT|0, B_REDR, "Auto AA", 5,140,150,20, &G.scene->r.YF_AA, 0, 0, 0, 0, "Set AA using OSA and GI quality, disable for manual control"); - uiDefButS(block,TOGN|BIT|0, B_REDR, "xml", 175,140,75,20, &G.scene->r.YFexportxml, - 0, 0, 0, 0, "Export to an xml file and call yafray instead of plugin"); + uiDefButS(block, TOGN|BIT|0, B_DIFF, "Clamp RGB", 160,140,150,20, &G.scene->r.YF_clamprgb, 1.0, 8.0, 10, 10, "For AA on fast high contrast changes. Not advisable for Bokeh! Dulls lens shape detail."); if(G.scene->r.YF_AA){ uiDefButI(block, NUM, B_DIFF, "AA Passes ", 5,115,150,20, &G.scene->r.YF_AApasses, 0, 64, 10, 10, "Number of AA passes (0 is no AA)"); uiDefButI(block, NUM, B_DIFF, "AA Samples ", 160,115,150,20, &G.scene->r.YF_AAsamples, 0, 2048, 10, 10, "Number of samples per pass"); diff --git a/source/blender/src/buttons_shading.c b/source/blender/src/buttons_shading.c index e869e46042a..8156e569300 100644 --- a/source/blender/src/buttons_shading.c +++ b/source/blender/src/buttons_shading.c @@ -2297,8 +2297,9 @@ static void lamp_panel_yafray(Object *ob, Lamp *la) /* to prevent clash with blender shadowbuf flag, a special flag is used for yafray */ if (la->type==LA_LOCAL) { uiDefButS(block, TOG|BIT|14, B_SHADBUF, "Buf.Shadow",10,160,80,19,&la->mode, 0, 0, 0, 0, "Lets light produce shadows using shadow buffer"); - uiDefButF(block, NUM, B_DIFF, "GlowInt:", 100,155,200,19, &la->YF_glowint, 0.0, 1.0, 1, 0, "Sets light glow intensity, 0 is off"); - uiDefButS(block, NUM, B_DIFF, "GlowType:", 100,135,200,19, &la->YF_glowtype, 0, 1, 1, 0, "Sets light glow type"); + uiDefButF(block, NUM, B_DIFF, "GloInt:", 100,155,200,19, &la->YF_glowint, 0.0, 1.0, 1, 0, "Sets light glow intensity, 0 is off"); + uiDefButF(block, NUM, B_DIFF, "GloOfs:", 100,135,100,19, &la->YF_glowofs, 0.0, 2.0, 1, 0, "Sets light glow offset, the higher, the less 'peaked' the glow"); + uiDefButS(block, NUM, B_DIFF, "GlowType:", 200,135,100,19, &la->YF_glowtype, 0, 1, 1, 0, "Sets light glow type"); } /* shadowbuffers used only for 'softlight' & spotlight with halo */ @@ -2910,7 +2911,7 @@ static void material_panel_tramir_yafray(Material *ma) /* material preset menu */ uiDefBut(block, LABEL, 0, "Mat.Preset", 20, 182, 100, 20, 0, 0.0, 0.0, 0, 0, ""); - uiDefButS(block, MENU, B_MAT_YF_PRESET, mstr, 110, 182, 200, 20, &ma->YF_preset, 0.0, 0.0, 0, 0, "Quick material presets to start with"); + uiDefButI(block, MENU, B_MAT_YF_PRESET, mstr, 110, 182, 200, 20, &ma->YF_preset, 0.0, 0.0, 0, 0, "Basic material presets to start with"); uiDefButI(block, TOG|BIT|18, B_MATPRV,"Ray Mirror", 10,160,100,20, &(ma->mode), 0, 0, 0, 0, "Enables raytracing for mirror reflection rendering"); uiDefButI(block, TOG|BIT|17, B_MATRAYTRANSP,"Ray Transp", 110,160,100,20, &(ma->mode), 0, 0, 0, 0, "Enables raytracing for transparency rendering"); @@ -2920,22 +2921,23 @@ static void material_panel_tramir_yafray(Material *ma) uiDefButF(block, NUMSLI, B_MATPRV, "frsOfs ", 160,140,150,20, &(ma->fresnel_mir_i), 1.0, 5.0, 10, 2, "Fresnel offset, 1 is uniform mirror, 5 is fresnel mirror (IOR>1)"); /* ior has extended range up to 30, for use with total fresnel reflection */ - uiDefButF(block, NUMSLI, B_MATPRV, "IOR ", 10,110,150,20, &(ma->ang), 1.0, 30.0, 100, 2, "Sets the angular index of refraction for raytrace"); + uiDefButF(block, NUMSLI, B_MATPRV, "IOR ", 10,115,150,20, &(ma->ang), 1.0, 30.0, 100, 2, "Sets the angular index of refraction for raytrace"); if(ma->mode & MA_RAYTRANSP) - uiDefButF(block, NUM, B_MATPRV, "Filt:", 160,110,150,20, &(ma->filter), 0.0, 1.0, 10, 0, "Amount of filtering for transparent raytrace"); + uiDefButF(block, NUM, B_MATPRV, "Filt:", 160,115,150,20, &(ma->filter), 0.0, 1.0, 10, 0, "Amount of filtering for transparent raytrace"); - /* extinction color */ - uiDefBut(block, LABEL, 0, "Ext.Color", 10, 80, 150, 19, 0, 0.0, 0.0, 0, 0, ""); - uiDefButF(block, COL, B_MATPRV_DRAW, "", 10, 20, 30, 58, &ma->YF_er, 0, 0, 0, B_MATCOL, "transmit extinction color, black is no extinction"); - uiDefButF(block, NUMSLI, B_MATPRV, "eR ", 40, 60, 120, 18, &ma->YF_er, 0.0, 1.0, B_MATCOL, 0, ""); - uiDefButF(block, NUMSLI, B_MATPRV, "eG ", 40, 40, 120, 18, &ma->YF_eg, 0.0, 1.0, B_MATCOL, 0, ""); - uiDefButF(block, NUMSLI, B_MATPRV, "eB ", 40, 20, 120, 18, &ma->YF_eb, 0.0, 1.0, B_MATCOL, 0, ""); + /* absorption color */ + uiDefBut(block, LABEL, 0, "Absorption Color", 10, 98, 150, 18, 0, 0.0, 0.0, 0, 0, ""); + uiDefButF(block, COL, B_MATPRV_DRAW, "", 10, 38, 30, 58, &ma->YF_ar, 0, 0, 0, B_MATCOL, "transmit absorption color, white is no absorption"); + uiDefButF(block, NUMSLI, B_MATPRV, "aR ", 40, 78, 120, 18, &ma->YF_ar, 1e-7f, 1.0, B_MATCOL, 0, ""); + uiDefButF(block, NUMSLI, B_MATPRV, "aG ", 40, 58, 120, 18, &ma->YF_ag, 1e-7f, 1.0, B_MATCOL, 0, ""); + uiDefButF(block, NUMSLI, B_MATPRV, "aB ", 40, 38, 120, 18, &ma->YF_ab, 1e-7f, 1.0, B_MATCOL, 0, ""); + uiDefButF(block, NUM, B_MATPRV, "Ds", 10, 18, 150, 18, &ma->YF_dscale, 1e-7f, 100.0, 10.0, 0, "absorption distance scale, 1 is one blender (world) unit of distance"); /* disperions parameters */ - uiDefBut(block, LABEL, 0, "Dispersion", 160, 80, 150, 18, 0, 0.0, 0.0, 0, 0, ""); - uiDefButF(block, NUM, B_MATPRV, "Pwr ", 160, 60, 150, 18, &ma->YF_dpwr, 0.0, 1.0, 0.25, 0, "Dispersion power, the higher, the more dispersion, 0 is no dispersion"); - uiDefButS(block, NUM, B_MATPRV, "Samples ", 160, 40, 150, 18, &ma->YF_dsmp, 1.0, 100.0, 0, 0, "Dispersion samples, minimum at least 10, unless using jitter "); - uiDefButS(block, TOG|BIT|0, B_MATPRV, "Jitter", 160, 20, 150, 18, &ma->YF_djit, 0.0, 1.0, 0, 0, "Enable jittering of wavelenghts, adds noise"); + uiDefBut(block, LABEL, 0, "Dispersion", 160, 98, 150, 18, 0, 0.0, 0.0, 0, 0, ""); + uiDefButF(block, NUM, B_MATPRV, "Pwr ", 160, 78, 150, 18, &ma->YF_dpwr, 0.0, 1.0, 0.25, 0, "Dispersion power, the higher, the more dispersion, 0 is no dispersion"); + uiDefButI(block, NUM, B_MATPRV, "Samples ", 160, 58, 150, 18, &ma->YF_dsmp, 1.0, 100.0, 0, 0, "Dispersion samples, minimum at least 10, unless using jitter "); + uiDefButI(block, TOG|BIT|0, B_MATPRV, "Jitter", 160, 38, 150, 18, &ma->YF_djit, 0.0, 1.0, 0, 0, "Enable jittering of wavelenghts, adds noise"); } @@ -3262,8 +3264,13 @@ void material_panels() material_panel_shading(ma); if (G.scene->r.renderer==R_INTERN) material_panel_tramir(ma); - else + else { + if (ma->YF_ar==0.f) { + ma->YF_ar = ma->YF_ag = ma->YF_ab = 1; + ma->YF_dscale = 1; + } material_panel_tramir_yafray(ma); + } material_panel_texture(ma); mtex= ma->mtex[ ma->texact ]; 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\tang << "\" />\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\tray_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\n"; - // transmit extinction color - ostr << "\t\tYF_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\n"; // dispersion ostr << "\t\tYF_dpwr << "\" />\n"; ostr << "\t\tYF_dsmp << "\" />\n"; ostr << "\t\tYF_djit ? "on" : "off") << "\" />\n"; + + // for backward compatibility, also add old 'reflected' parameter, copy of mirror_color + ostr << "\t\tmirr << "\" 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\n"; + } + if (matr->mode & MA_RAYTRANSP) { ostr << "\t\t\n"; ostr << "\t\tfilter << "\" />\n"; // tir on by default ostr << "\t\t\n"; + // for backward compatibility, also add old 'transmitted' parameter, copy of 'color' * (1-alpha) + float na = 1.f-matr->alpha; + ostr << "\t\tr*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 << "tex->bright-1.f << "\" mapping=\"probe\" >\n"; - ostr << "\t\n"; - ostr << "\ttex->imaflag & TEX_INTERPOL) ? "bilinear" : "none") << "\" />\n"; - ostr << "\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 << "\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\n"; - ostr << "\n\n"; - xmlfile << ostr.str(); - return true; - } + ostr.str(""); + ostr << "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\n"; + ostr << "\ttex->imaflag & TEX_INTERPOL) ? "bilinear" : "none") << "\" />\n"; + ostr << "\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"<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..