Page MenuHome

ibl02.txt

File Metadata

Author
Matt Ebb (broken)
Created
Nov 13 2013, 1:18 PM

ibl02.txt

Index: source/blender/render/intern/source/rayshade.c
===================================================================
--- source/blender/render/intern/source/rayshade.c (revision 13145)
+++ source/blender/render/intern/source/rayshade.c (working copy)
@@ -1563,12 +1604,29 @@
shadfac[1]+= (1.0f-skyfac)*R.wrld.horg + skyfac*R.wrld.zeng;
shadfac[2]+= (1.0f-skyfac)*R.wrld.horb + skyfac*R.wrld.zenb;
}
- else { /* WO_AOSKYTEX */
+ else if (aocolor==WO_AOSKYTEX) {
shadeSkyView(skycol, isec.start, view, dxyview);
shadfac[0]+= skycol[0];
shadfac[1]+= skycol[1];
shadfac[2]+= skycol[2];
}
+ else if (aocolor==WO_AODIFFUSESH) {
+ float dot;
+
+ /* The spherical harmonics are already stored as the result over the whole hemisphere.
+ * By averaging AO samples, it's averaging a whole series of hemispheres, with the AO
+ * vector as the up-vector of that hemisphere. This gives an overly smoothed result
+ * so this simple cosine weighting can help make it look as it should again. --Matt */
+ dot = Inpf(dir, shi->vn);
+ Mat4Mul3Vecfl(R.viewinv, view);
+
+ ibl_diffusesh_getcolor_coeffs(skycol, R.wrld.dsh_coeffs[0], R.wrld.dsh_coeffs[1], R.wrld.dsh_coeffs[2], R.wrld.dsh_coeffs[3],
+ R.wrld.dsh_coeffs[4], R.wrld.dsh_coeffs[5], R.wrld.dsh_coeffs[6], R.wrld.dsh_coeffs[7], R.wrld.dsh_coeffs[8], view);
+
+ shadfac[0]+= skycol[0]*dot;
+ shadfac[1]+= skycol[1]*dot;
+ shadfac[2]+= skycol[2]*dot;
+ }
skyadded++;
}
Index: source/blender/render/intern/source/shadeinput.c
===================================================================
--- source/blender/render/intern/source/shadeinput.c (revision 13145)
+++ source/blender/render/intern/source/shadeinput.c (working copy)
@@ -765,6 +765,11 @@
else
VECCOPY(shi->vn, shi->facenor);
+ /* normal in worldspace, used in Diffuse SH IBL, and nodes */
+ VECCOPY(shi->worldnor, shi->vn);
+ Mat4Mul3Vecfl(R.viewinv, shi->worldnor);
+ VecMulf(shi->worldnor, -1.0f);
+
/* used in nodes */
VECCOPY(shi->vno, shi->vn);
Index: source/blender/render/intern/source/shadeoutput.c
===================================================================
--- source/blender/render/intern/source/shadeoutput.c (revision 13145)
+++ source/blender/render/intern/source/shadeoutput.c (working copy)
@@ -1576,6 +1576,10 @@
}
}
+ /* ibl, adds results in diff and shad pass */
+ if(R.wrld.mode & WO_IMAGE_BASED_LIGHTING)
+ image_based_lighting(shi, shr);
+
/* lighting pass */
if(passflag & (SCE_PASS_COMBINED|SCE_PASS_DIFFUSE|SCE_PASS_SPEC|SCE_PASS_SHADOW)) {
GroupObject *go;
Index: source/blender/render/intern/source/ibl.c
===================================================================
--- source/blender/render/intern/source/ibl.c (revision 0)
+++ source/blender/render/intern/source/ibl.c (revision 0)
@@ -0,0 +1,284 @@
+/**
+* $Id:
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Contributors: Matt Ebb
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+
+#include "BLI_arithb.h"
+
+#include "IMB_imbuf_types.h"
+
+#include "DNA_image_types.h"
+#include "DNA_texture_types.h"
+#include "DNA_world_types.h"
+
+#include "BKE_image.h"
+#include "BKE_global.h"
+
+/* local include */
+#include "render_types.h"
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+/* defined in pipeline.c, is hardcopy of active dynamic allocated Render */
+/* only to be used here in this file, it's for speed */
+extern struct Render R;
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+float sinc(float x) {
+ if (fabs(x) < 1.0e-4) return 1.0 ;
+ else return(sin(x)/x) ;
+}
+
+
+/* Converts UV coordinates from an environment map to the equivalent 3D vector
+ * Incoming UV coordinates are considered to be in [-1,1]
+ * domega = the solid angle that pixel represents in the unit sphere
+ * returns 1 if the pixel actually represents anything in the env map
+ * eg. pixels within the unit circle of an angmap */
+static int uv_to_xyz(int mapping, float *uv, float *xyz, float dtheta_dphi, float *domega)
+{
+ float phi, theta, sinphi, sintheta;
+ float radius_sq=1.0f;
+
+ float u = uv[0];
+ float v = uv[1];
+
+ switch(mapping)
+ {
+ case WO_IBL_MAP_SPHERE:
+ phi = (v*0.5f+0.5f)*M_PI; // pi < phi < 0
+ theta = -u*M_PI; // pi < theta < -pi
+
+ /* transform u,v to cartesian components */
+ sinphi = sin(phi);
+ xyz[0] = -sinphi * sin(theta);
+ xyz[1] = sinphi * cos(theta);
+ xyz[2] = -cos(phi);
+
+ /* solid angle */
+ *domega = sinphi*dtheta_dphi;
+ break;
+
+ case WO_IBL_MAP_ANGMAP:
+ default:
+ /* for angmap, only consider points inside the unit circle */
+ radius_sq = u*u + v*v;
+ if(radius_sq>1.0f) return 0;
+
+ theta = M_PI*sqrt(radius_sq);
+ phi = atan2(v,u);
+
+ /* transform u,v to cartesian components */
+ sintheta = sin(theta);
+ xyz[0] = sintheta*cos(phi);
+ xyz[1] = cos(theta);
+ xyz[2] = sintheta*sin(phi);
+
+ /* solid angle */
+ *domega = sinc(theta)*dtheta_dphi;
+ break;
+ }
+
+ return 1;
+}
+
+/* *** Diffuse irradiance: Spherical Harmonics *** */
+/*
+* Based on the paper and sample code of:
+* "An Efficient Representation for Irradiance Environment Maps"
+* by Ravi Ramamoorthi and Pat Hanrahan
+* http://graphics.stanford.edu/papers/envmap/
+*
+* Also thanks to some example code by Francesco Banterle
+* http://www.banterle.com/francesco/
+*
+* This calculates RGB values for lighting coefficients L_{lm} with
+* 0 <= l <= 2 and -l <= m <= l. There are 9 coefficients in all.
+*/
+
+
+void ibl_diffusesh_prefilter(struct Render *re)
+{
+ ImBuf *ibuf;
+ Image *ima;
+ float uv[2], xyz[3], x, y, z;
+ float dtheta_dphi, c, domega=0.f;
+ int w, h, i, j, k;
+ float *rect_float, pix[3];
+ int index, col;
+
+ ima = re->wrld.ibl_image;
+ if (!ima) return;
+ ibuf = BKE_image_get_ibuf(ima, NULL);
+
+ w = ibuf->x;
+ h = ibuf->y;
+ rect_float = ibuf->rect_float;
+ if (!rect_float) return;
+
+ dtheta_dphi= (M_PI/(float)h) * (M_PI_2/(float)w);
+ if (re->wrld.ibl_mapping == WO_IBL_MAP_SPHERE) dtheta_dphi /= 2.0f;
+
+ memset(re->wrld.dsh_coeffs, 0, sizeof(re->wrld.dsh_coeffs));
+
+ for(j=0;j<h;j++)
+ {
+ uv[1] = 2.0f*((float)j/(float)h) - 1.0f; /* coord in [-1,1] */
+
+ for(i=0;i<w;i++)
+ {
+ uv[0] = 2.0f*((float)i/(float)w) - 1.0f; /* coord in [-1,1] */
+
+ uv_to_xyz(re->wrld.ibl_mapping, uv, xyz, dtheta_dphi, &domega);
+
+ x = xyz[0]; y = xyz[1]; z = xyz[2];
+ index = j*w+i;
+
+ pix[0] = rect_float[4 * index + 0];
+ pix[1] = rect_float[4 * index + 1];
+ pix[2] = rect_float[4 * index + 2];
+
+ /* add the light per pixel to the coefficients per term,
+ * based on a constant, the differential solid angle and
+ * cartesian components of surface normal x,y,z */
+ for (col = 0 ; col < 3 ; col++) {
+
+ /* L_{00}. Note that Y_{00} = 0.282095 */
+ c=0.282095f*domega;
+ re->wrld.dsh_coeffs[0][col] += pix[col]*c;
+
+ /* L_{1m}. -1 <= m <= 1. The linear terms */
+ c=0.488603f*domega;
+ re->wrld.dsh_coeffs[1][col]+=pix[col]*c*y;
+ re->wrld.dsh_coeffs[2][col]+=pix[col]*c*z;
+ re->wrld.dsh_coeffs[3][col]+=pix[col]*c*x;
+
+ /* The Quadratic terms, L_{2m} -2 <= m <= 2 */
+ /* First, L_{2-2}, L_{2-1}, L_{21} corresponding to xy,yz,xz */
+ c=1.092548f*domega;
+ re->wrld.dsh_coeffs[4][col]+=pix[col]*c*x*y;
+ re->wrld.dsh_coeffs[5][col]+=pix[col]*c*y*z;
+ re->wrld.dsh_coeffs[7][col]+=pix[col]*c*x*z;
+
+ /* L_{20}. Note that Y_{20} = 0.315392 (3z^2 - 1) */
+ c=0.315392f*domega*(3.0f*z*z-1.0f);
+ re->wrld.dsh_coeffs[6][col]+=pix[col]*c;
+
+ c=0.546274f*domega*(x*x-y*y);
+ re->wrld.dsh_coeffs[8][col]+=pix[col]*c;
+ }
+ }
+ }
+};
+
+
+/* This function is quite ugly, but works ok.
+ * matrix form (in paper's sample code) would be better if i could get it working... */
+void ibl_diffusesh_getcolor_coeffs( float *col,
+ float *L00, float *L1_1, float *L10, float *L11,
+ float *L2_2, float *L2_1, float *L20, float *L21, float *L22,
+ float *n)
+{
+ float x2, y2, z2, xy, yz, xz, x, y, z;
+ const float c1 = 0.429043, c2 = 0.511664, c3 = 0.743125, c4 = 0.886227, c5 = 0.247708;
+ float a[3], b[3], c[3], d[3], e[3], f[3], g[3], h[3], i[3], j[3];
+ float efg[3], hij[3];
+ float mycol[3];
+
+ x = n[0] ; y = n[1] ; z = n[2];
+
+ x2 = x*x ; y2 = y*y ; z2 = z*z ;
+ xy = x*y ; yz = y*z ; xz = x*z ;
+
+
+
+ VECCOPY(a, L22);
+ VecMulf(a, c1*(x2-y2));
+
+ VECCOPY(b, L20);
+ VecMulf(b, c3*(z2));
+
+ VECCOPY(c, L00);
+ VecMulf(c, c4);
+
+ VECCOPY(d, L20);
+ VecMulf(d, c5);
+
+ VECCOPY(e, L2_2);
+ VecMulf(e, xy);
+
+ VECCOPY(f, L21);
+ VecMulf(f, xz);
+
+ VECCOPY(g, L2_1);
+ VecMulf(g, yz);
+
+ VecAddf(efg, e, f);
+ VecAddf(efg, efg, g);
+ VecMulf(efg, 2*c1);
+
+ VECCOPY(h, L11);
+ VecMulf(h, x);
+
+ VECCOPY(i, L1_1);
+ VecMulf(i, y);
+
+ VECCOPY(j, L10)
+ VecMulf(j, z);
+
+ VecAddf(hij, h, i);
+ VecAddf(hij, hij, j);
+ VecMulf(hij, 2*c2);
+
+ VecAddf(mycol, a, b);
+ VecAddf(mycol, mycol, c);
+ VecSubf(mycol, mycol, d);
+ VecAddf(mycol, mycol, efg);
+ VecAddf(mycol, mycol, hij);
+
+ VECCOPY(col, mycol);
+
+/* equation:
+ col = c1*L22*(x2-y2) + c3*L20*z2 + c4*L00 - c5*L20
+ + 2*c1*(L2_2*xy + L21*xz + L2_1*yz)
+ + 2*c2*(L11*x+L1_1*y+L10*z) ;
+*/
+}
+
+
+void image_based_lighting(ShadeInput *shi, ShadeResult *shr)
+{
+ float iblcol[3], nor[3];
+
+ VECCOPY(nor, shi->worldnor);
+
+ ibl_diffusesh_getcolor_coeffs(iblcol, R.wrld.dsh_coeffs[0], R.wrld.dsh_coeffs[1], R.wrld.dsh_coeffs[2], R.wrld.dsh_coeffs[3],
+ R.wrld.dsh_coeffs[4], R.wrld.dsh_coeffs[5], R.wrld.dsh_coeffs[6], R.wrld.dsh_coeffs[7], R.wrld.dsh_coeffs[8], nor);
+
+ VecMulf(iblcol, R.wrld.ibl_multiplier);
+
+ VecAddf(shr->diff, shr->diff, iblcol);
+ VecAddf(shr->shad, shr->shad, iblcol);
+}
Property changes on: source/blender/render/intern/source/ibl.c
___________________________________________________________________
Name: svn:executable
+ *
Index: source/blender/render/intern/source/convertblender.c
===================================================================
--- source/blender/render/intern/source/convertblender.c (revision 13145)
+++ source/blender/render/intern/source/convertblender.c (working copy)
@@ -4220,8 +4220,17 @@
init_render_hammersley(re);
else if (re->wrld.ao_samp_method == WO_AOSAMP_CONSTANT)
init_ao_sphere(&re->wrld);
+
+ if (re->wrld.aocolor == WO_AODIFFUSESH)
+ ibl_diffusesh_prefilter(re);
}
+ if(re->wrld.mode & WO_IMAGE_BASED_LIGHTING) {
+ if (re->wrld.ibl_method == WO_IBL_DIFFUSESH) {
+ ibl_diffusesh_prefilter(re);
+ }
+ }
+
/* still bad... doing all */
init_render_textures(re);
init_render_materials(re->r.mode, &re->wrld.ambr);
Index: source/blender/render/intern/include/render_types.h
===================================================================
--- source/blender/render/intern/include/render_types.h (revision 13145)
+++ source/blender/render/intern/include/render_types.h (working copy)
@@ -33,6 +33,7 @@
/* ------------------------------------------------------------------------- */
#include "DNA_color_types.h"
+#include "DNA_image_types.h"
#include "DNA_scene_types.h"
#include "DNA_world_types.h"
#include "DNA_object_types.h"
Index: source/blender/render/intern/include/rendercore.h
===================================================================
--- source/blender/render/intern/include/rendercore.h (revision 13145)
+++ source/blender/render/intern/include/rendercore.h (working copy)
@@ -105,5 +105,14 @@
extern void init_render_hammersley(Render *re);
extern void free_render_qmcsampler(Render *re);
+/* -------- ibl.c ------- */
+
+extern void image_based_lighting(struct ShadeInput *shi, struct ShadeResult *shr);
+extern void ibl_diffusesh_prefilter(Render *re);
+extern void ibl_diffusesh_getcolor_coeffs( float *col,
+ float *L00, float *L1_1, float *L10, float *L11,
+ float *L2_2, float *L2_1, float *L20, float *L21, float *L22,
+ float *n);
+
#endif /* RENDER_EXT_H */
Index: source/blender/render/extern/include/RE_shader_ext.h
===================================================================
--- source/blender/render/extern/include/RE_shader_ext.h (revision 13145)
+++ source/blender/render/extern/include/RE_shader_ext.h (working copy)
@@ -133,6 +133,7 @@
float lo[3], gl[3], ref[3], orn[3], winco[3], sticky[3], vcol[4], rad[3];
float refcol[4], displace[3];
float strand, tang[3], stress, winspeed[4];
+ float worldnor[3];
ShadeInputUV uv[8]; /* 8 = MAX_MTFACE */
ShadeInputCol col[8]; /* 8 = MAX_MCOL */
Index: source/blender/blenkernel/intern/world.c
===================================================================
--- source/blender/blenkernel/intern/world.c (revision 13145)
+++ source/blender/blenkernel/intern/world.c (working copy)
@@ -37,6 +37,7 @@
#include <math.h>
#include "MEM_guardedalloc.h"
+#include "DNA_image_types.h"
#include "DNA_world_types.h"
#include "DNA_texture_types.h"
#include "DNA_scriptlink_types.h"
@@ -86,6 +87,7 @@
World *add_world(char *name)
{
World *wrld;
+ ImageUser *iuser;
wrld= alloc_libblock(&G.main->world, ID_WO, name);
@@ -107,6 +109,14 @@
wrld->physicsEngine= WOPHY_BULLET;//WOPHY_SUMO; Bullet by default
wrld->preview = NULL;
+
+ iuser = &(wrld->ibl_iuser);
+
+ iuser->sfra= 1;
+ iuser->fie_ima= 2;
+ iuser->ok= 1;
+
+ wrld->ibl_multiplier = 1.0;
return wrld;
}
Index: source/blender/python/api2_2x/World.h
===================================================================
--- source/blender/python/api2_2x/World.h (revision 13145)
+++ source/blender/python/api2_2x/World.h (working copy)
@@ -1,5 +1,5 @@
/*
- * $Id: World.h 10269 2007-03-15 01:09:14Z campbellbarton $
+ * $Id$
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
@@ -34,6 +34,7 @@
#define EXPP_WORLD_H
#include <Python.h>
+#include "DNA_image_types.h"
#include "DNA_world_types.h"
#define BPy_World_Check(v) ((v)->ob_type==&World_Type)
Index: source/blender/makesdna/DNA_world_types.h
===================================================================
--- source/blender/makesdna/DNA_world_types.h (revision 13145)
+++ source/blender/makesdna/DNA_world_types.h (working copy)
@@ -39,12 +39,18 @@
struct Ipo;
struct MTex;
+struct Image;
+struct ImageUser;
#ifndef MAX_MTEX
#define MAX_MTEX 10
#endif
+typedef struct Ibl {
+ float dsh_coeffs[9][3];
+} Ibl;
+
/**
* World defines general modeling data such as a background fill,
* gravity, color model, stars, etc. It mixes game-data, rendering
@@ -110,13 +116,20 @@
float *aosphere, *aotables;
+ short ibl_method;
+ short ibl_mapping;
+ float ibl_multiplier;
+ struct Image *ibl_image;
+ struct ImageUser ibl_iuser;
struct Ipo *ipo;
struct MTex *mtex[10];
/* previews */
struct PreviewImage *preview;
-
+
+ float dsh_coeffs[9][3];
+ int padblah;
ScriptLink scriptlink;
} World;
@@ -137,6 +150,7 @@
#define WO_DOF 4
#define WO_ACTIVITY_CULLING 8
#define WO_AMB_OCC 16
+#define WO_IMAGE_BASED_LIGHTING 32
/* aomix */
#define WO_AOADD 0
@@ -156,7 +170,15 @@
#define WO_AOPLAIN 0
#define WO_AOSKYCOL 1
#define WO_AOSKYTEX 2
+#define WO_AODIFFUSESH 3
+/* ibl_method */
+#define WO_IBL_DIFFUSESH 0
+
+/* ibl_mapping */
+#define WO_IBL_MAP_ANGMAP 0
+#define WO_IBL_MAP_SPHERE 1
+
/* texco (also in DNA_material_types.h) */
#define TEXCO_ANGMAP 64
#define TEXCO_H_SPHEREMAP 256
Index: source/blender/src/buttons_shading.c
===================================================================
--- source/blender/src/buttons_shading.c (revision 13145)
+++ source/blender/src/buttons_shading.c (working copy)
@@ -2133,13 +2133,90 @@
}
+static void world_panel_ibl(World *wrld)
+{
+ uiBlock *block;
+ short yco=PANEL_YMAX;
+ char *strp;
+ struct ImageUser *iuser= &(wrld->ibl_iuser);
+ uiBut *but;
+
+ block= uiNewBlock(&curarea->uiblocks, "world_panel_ibl", UI_EMBOSS, UI_HELV, curarea->win);
+ uiNewPanelTabbed("Amb Occ", "World");
+ if(uiNewPanel(curarea, block, "Image Based Lighting", "World", PANELX, PANELY, PANELW, PANELH)==0) return;
+
+ uiDefButBitS(block, TOG, WO_IMAGE_BASED_LIGHTING, B_REDR, "Image Based Lighting",
+ X2CLM1, yco-=BUTH, BUTW1, BUTH, &wrld->mode, 0, 0, 0, 0, "Enables lighting from an environment image (light probe)");
+
+ yco -= YSPACE;
+
+ uiDefButS(block, MENU, B_REDR, "Calculation Method %t|Diffuse Prefiltered %x0",
+ X2CLM1, yco-=BUTH, BUTW2, BUTH, &wrld->ibl_method, 0, 0, 0, 0, "");
+
+ yco -= YSPACE;
+
+ /* Browse */
+ IMAnames_to_pupstring(&strp, NULL, NULL, &(G.main->image), NULL, &iuser->menunr);
+
+ uiBlockBeginAlign(block);
+ but= uiDefButS(block, MENU, B_REDR, strp,
+ X2CLM1, yco-=BUTH, ICONBUTW, BUTH, &iuser->menunr, 0, 0, 0, 0, "Selects an existing Image or Movie");
+ uiButSetFunc(but, image_browse_cb, &(wrld->ibl_image), iuser);
+
+ MEM_freeN(strp);
+
+ if (wrld->ibl_image != NULL) {
+ char str[128];
+
+ if (wrld->ibl_image->source != IMA_SRC_FILE) {
+ uiDefBut(block, LABEL, 0, "Still images only",
+ X2CLM1, yco-=BUTH, BUTW2, BUTH, 0, 0, 0, 0, 0, ""); /* for align in panel */
+ return;
+ }
+ uiSetButLock(wrld->ibl_image->id.lib!=NULL, ERROR_LIBDATA_MESSAGE);
+ but= uiDefIconBut(block, BUT, B_REDR, ICON_FILESEL,
+ X2CLM1+ICONBUTW, yco, X2CLM1+ICONBUTW, BUTH, 0, 0, 0, 0, 0, "Open Fileselect to load new Image");
+ uiButSetFunc(but, image_load_fs_cb, &(wrld->ibl_image), iuser);
+
+ but= uiDefBut(block, TEX, B_IDNAME, "IM:",
+ X2CLM1+2*ICONBUTW, yco, PANEL_XMAX-4*ICONBUTW-BUTW4, BUTH, wrld->ibl_image->id.name+2, 0.0, 21.0, 0, 0, "Current Image Datablock name.");
+ uiButSetFunc(but, test_idbutton_cb, wrld->ibl_image->id.name, NULL);
+
+ but= uiDefBut(block, BUT, B_REDR, "Reload",
+ PANEL_XMAX-2*ICONBUTW-BUTW4, yco, BUTW4, BUTH, NULL, 0, 0, 0, 0, "Reloads Image or Movie");
+ uiButSetFunc(but, image_reload_cb, &(wrld->ibl_image), iuser);
+
+ but= uiDefIconBut(block, BUT, B_REDR, ICON_X,
+ PANEL_XMAX-2*ICONBUTW, yco, ICONBUTW, BUTH, 0, 0, 0, 0, 0, "Unlink Image block");
+ uiButSetFunc(but, image_unlink_cb, &(wrld->ibl_image), NULL);
+
+ sprintf(str, "%d", wrld->ibl_image->id.us);
+ uiDefBut(block, BUT, B_NOP, str,
+ PANEL_XMAX-ICONBUTW, yco, ICONBUTW, BUTH, 0, 0, 0, 0, 0, "Only displays number of users of Image block");
+
+ } else {
+ but= uiDefBut(block, BUT, B_REDR, "Load",
+ X2CLM1+ICONBUTW, yco, BUTW2-ICONBUTW, BUTH, NULL, 0, 0, 0, 0, "Load new Image");
+ uiButSetFunc(but, image_load_fs_cb, &(wrld->ibl_image), iuser);
+ }
+
+ uiBlockEndAlign(block);
+
+ yco-= YSPACE;
+
+ uiDefButF(block, NUM, B_REDR, "Multiplier:",
+ X2CLM1, yco-=BUTH, BUTW2, BUTH, &wrld->ibl_multiplier, 0.0, 100.0, 1.0, 0, "Multiply the final result to brighten or darken the lighting");
+
+ uiDefButS(block, MENU, B_REDR, "Image Format %t|Angular Map %x0|Sphere (LatLong) %x1",
+ X2CLM2, yco, BUTW2, BUTH, &wrld->ibl_mapping, 0, 0, 0, 0, "");
+}
+
static void world_panel_amb_occ(World *wrld)
{
uiBlock *block;
short yco=PANEL_YMAX;
block= uiNewBlock(&curarea->uiblocks, "world_panel_amb_oc", UI_EMBOSS, UI_HELV, curarea->win);
- uiNewPanelTabbed("Mist / Stars / Physics", "World");
if(uiNewPanel(curarea, block, "Amb Occ", "World", PANELX, PANELY, PANELW, PANELH)==0) return;
uiBlockSetCol(block, TH_BUT_SETTING1);
@@ -2205,18 +2282,14 @@
/* color treatment */
uiBlockBeginAlign(block);
- uiDefButS(block, ROW, B_REDR, "Plain",
- X3CLM1, yco-=BUTH, BUTW3, BUTH, &wrld->aocolor, 2.0, (float)WO_AOPLAIN, 0, 0, "Plain diffuse energy (white)");
- uiDefButS(block, ROW, B_REDR, "Sky Color",
- X3CLM2, yco, BUTW3, BUTH, &wrld->aocolor, 2.0, (float)WO_AOSKYCOL, 0, 0, "Use horizon and zenith color for diffuse energy");
- uiDefButS(block, ROW, B_REDR, "Sky Texture",
- X3CLM3, yco, BUTW3, BUTH, &wrld->aocolor, 2.0, (float)WO_AOSKYTEX, 0, 0, "Does full Sky texture render for diffuse energy");
+ uiDefButS(block, MENU, B_REDR, "Plain %x0|Sky Color %x1|Sky Texture %x2|IBL: Diffuse Prefiltered %x3",
+ X3CLM1, yco-=BUTH, BUTW2, BUTH, &wrld->aocolor, 0.0, (float)WO_AOPLAIN, 0, 0, "");
uiBlockEndAlign(block);
yco -= YSPACE;
- uiDefButF(block, NUMSLI, B_REDR, "Energy:",
- X2CLM1, yco-=BUTH, BUTW2, BUTH, &wrld->aoenergy, 0.01, 3.0, 100, 0, "Sets global energy scale for AO");
+ uiDefButF(block, NUM, B_REDR, "Energy:",
+ X2CLM1, yco-=BUTH, BUTW2, BUTH, &wrld->aoenergy, 0.01, 10.0, 100, 0, "Sets global energy scale for AO");
}
@@ -4238,6 +4311,7 @@
if(wrld) {
world_panel_mistaph(wrld);
world_panel_amb_occ(wrld);
+ world_panel_ibl(wrld);
world_panel_texture(wrld);
world_panel_mapto(wrld);
}
Index: source/blender/blenloader/intern/readfile.c
===================================================================
--- source/blender/blenloader/intern/readfile.c (revision 13145)
+++ source/blender/blenloader/intern/readfile.c (working copy)
@@ -2083,6 +2083,8 @@
}
}
+ wrld->ibl_image= newlibadr_us(fd, wrld->id.lib, wrld->ibl_image);
+
lib_link_scriptlink(fd, &wrld->id, &wrld->scriptlink);
wrld->id.flag -= LIB_NEEDLINK;
@@ -2100,6 +2102,9 @@
for(a=0; a<MAX_MTEX; a++) {
wrld->mtex[a]= newdataadr(fd, wrld->mtex[a]);
}
+
+ wrld->ibl_iuser.ok= 1;
+
wrld->preview = direct_link_preview_image(fd, wrld->preview);
}
@@ -7270,6 +7275,8 @@
if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 11)) {
Object *ob;
bActionStrip *strip;
+ World *wrld;
+ ImageUser *iuser;
/* nla-strips - scale */
for (ob= main->object.first; ob; ob= ob->id.next) {
@@ -7289,6 +7296,16 @@
if (strip->scale == 0.0f) strip->scale= 1.0f;
}
}
+
+ for(wrld=main->world.first; wrld; wrld= wrld->id.next) {
+ iuser = &(wrld->ibl_iuser);
+
+ iuser->sfra= 1;
+ iuser->fie_ima= 2;
+ iuser->ok= 1;
+ wrld->ibl_multiplier = 1.0;
+ }
+
}
Index: source/blender/nodes/intern/SHD_util.h
===================================================================
--- source/blender/nodes/intern/SHD_util.h (revision 13145)
+++ source/blender/nodes/intern/SHD_util.h (working copy)
@@ -109,6 +109,7 @@
#define GEOM_OUT_NORMAL 5
#define GEOM_OUT_VCOL 6
#define GEOM_OUT_FRONTBACK 7
+#define GEOM_OUT_WORLDNORMAL 8
/* input socket defines */
Index: source/blender/nodes/intern/SHD_nodes/SHD_geom.c
===================================================================
--- source/blender/nodes/intern/SHD_nodes/SHD_geom.c (revision 13145)
+++ source/blender/nodes/intern/SHD_nodes/SHD_geom.c (working copy)
@@ -39,9 +39,10 @@
{ SOCK_VECTOR, 0, "View", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
{ SOCK_VECTOR, 0, "Orco", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
{ SOCK_VECTOR, 0, "UV", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
- { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
+ { SOCK_VECTOR, 0, "View Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
{ SOCK_RGBA, 0, "Vertex Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
{ SOCK_VALUE, 0, "Front/Back", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+ { SOCK_VECTOR, 0, "World Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
{ -1, 0, "" }
};
@@ -73,6 +74,7 @@
VECCOPY(out[GEOM_OUT_ORCO]->vec, shi->lo);
VECCOPY(out[GEOM_OUT_UV]->vec, suv->uv);
VECCOPY(out[GEOM_OUT_NORMAL]->vec, shi->vno);
+ VECCOPY(out[GEOM_OUT_WORLDNORMAL]->vec, shi->worldnor);
if (shi->totcol) {
/* find vertex color layer by name */

Event Timeline