diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2011-11-21 01:02:12 +0400 |
---|---|---|
committer | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2011-11-21 01:02:12 +0400 |
commit | 2676f2d58f71f438008b413a86b873e7787d80ea (patch) | |
tree | eb541972cf32d5958b7c0f7f8ece525b78cfcbff /source/blender/render | |
parent | bb9976f058ba2090812074e1b774213d20821a30 (diff) | |
parent | 4ab1dadf72a821b344a714fff59aed11d15ecb14 (diff) |
Merged changes in the trunk up to revision 42021.
Conflicts resolved:
source/blender/blenkernel/intern/scene.c
source/blender/blenloader/intern/readfile.c
source/blender/editors/interface/resources.c
source/blender/render/intern/source/pipeline.c
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/CMakeLists.txt | 2 | ||||
-rw-r--r-- | source/blender/render/extern/include/RE_pipeline.h | 1 | ||||
-rw-r--r-- | source/blender/render/intern/include/render_types.h | 3 | ||||
-rw-r--r-- | source/blender/render/intern/include/texture_ocean.h | 28 | ||||
-rw-r--r-- | source/blender/render/intern/source/convertblender.c | 2 | ||||
-rw-r--r-- | source/blender/render/intern/source/envmap.c | 12 | ||||
-rw-r--r-- | source/blender/render/intern/source/external_engine.c | 5 | ||||
-rw-r--r-- | source/blender/render/intern/source/initrender.c | 59 | ||||
-rw-r--r-- | source/blender/render/intern/source/pipeline.c | 18 | ||||
-rw-r--r-- | source/blender/render/intern/source/render_texture.c | 30 | ||||
-rw-r--r-- | source/blender/render/intern/source/shadeoutput.c | 2 | ||||
-rw-r--r-- | source/blender/render/intern/source/texture_ocean.c | 157 |
12 files changed, 283 insertions, 36 deletions
diff --git a/source/blender/render/CMakeLists.txt b/source/blender/render/CMakeLists.txt index 5ed920ca2dc..9982eb86460 100644 --- a/source/blender/render/CMakeLists.txt +++ b/source/blender/render/CMakeLists.txt @@ -75,6 +75,7 @@ set(SRC intern/source/sss.c intern/source/strand.c intern/source/sunsky.c + intern/source/texture_ocean.c intern/source/volume_precache.c intern/source/volumetric.c intern/source/voxeldata.c @@ -105,6 +106,7 @@ set(SRC intern/include/strand.h intern/include/sunsky.h intern/include/texture.h + intern/include/texture_ocean.h intern/include/volume_precache.h intern/include/volumetric.h intern/include/voxeldata.h diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h index 2e6e8fa2099..4fe8829eee2 100644 --- a/source/blender/render/extern/include/RE_pipeline.h +++ b/source/blender/render/extern/include/RE_pipeline.h @@ -188,6 +188,7 @@ void RE_SetDispRect (struct Render *re, rcti *disprect); /* set up the viewplane/perspective matrix, three choices */ struct Object *RE_GetCamera(struct Render *re); /* return camera override if set */ void RE_SetCamera(struct Render *re, struct Object *camera); +void RE_SetEnvmapCamera(struct Render *re, struct Object *cam_ob, float viewscale, float clipsta, float clipend); void RE_SetWindow (struct Render *re, rctf *viewplane, float clipsta, float clipend); void RE_SetOrtho (struct Render *re, rctf *viewplane, float clipsta, float clipend); void RE_SetPixelSize(struct Render *re, float pixsize); diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h index dce7484d702..9e522fae4e4 100644 --- a/source/blender/render/intern/include/render_types.h +++ b/source/blender/render/intern/include/render_types.h @@ -152,10 +152,7 @@ struct Render int partx, party; /* values for viewing */ - float lens; - float sensor_x, sensor_y; /* image sensor size, same variable in camera */ float ycor; /* (scene->xasp / scene->yasp), multiplied with 'winy' */ - short sensor_fit; float panophi, panosi, panoco, panodxp, panodxv; diff --git a/source/blender/render/intern/include/texture_ocean.h b/source/blender/render/intern/include/texture_ocean.h new file mode 100644 index 00000000000..b0a0647d115 --- /dev/null +++ b/source/blender/render/intern/include/texture_ocean.h @@ -0,0 +1,28 @@ +/* + * ***** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * Contributors: Matt Ebb + * + * ***** END GPL LICENSE BLOCK ***** + */ + +void prepare_ocean_tex_modifier(struct OceanTex *ot); + +int ocean_texture(struct Tex *tex, float *texvec, struct TexResult *texres); diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index 8e729b827cd..48625192fb2 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -5325,7 +5325,7 @@ static void speedvector_project(Render *re, float zco[2], const float co[3], con if(vec[0]<0.0f) ang= -ang; zco[0]= ang/pixelphix + zmulx; - ang= 0.5f*M_PI - saacos(vec[1]/sqrtf(vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2])); + ang= 0.5f*(float)M_PI - saacos(vec[1]/sqrtf(vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2])); zco[1]= ang/pixelphiy + zmuly; } diff --git a/source/blender/render/intern/source/envmap.c b/source/blender/render/intern/source/envmap.c index 62cb29c3d5f..3512ffa865b 100644 --- a/source/blender/render/intern/source/envmap.c +++ b/source/blender/render/intern/source/envmap.c @@ -131,6 +131,7 @@ static void envmap_split_ima(EnvMap *env, ImBuf *ibuf) static Render *envmap_render_copy(Render *re, EnvMap *env) { Render *envre; + float viewscale; int cuberes; envre= RE_NewRender("Envmap"); @@ -156,15 +157,8 @@ static Render *envmap_render_copy(Render *re, EnvMap *env) envre->lay= re->lay; /* view stuff in env render */ - envre->lens= 16.0f; - envre->sensor_x= 32.0f; - if(env->type==ENV_PLANE) - envre->lens*= env->viewscale; - envre->ycor= 1.0f; - envre->clipsta= env->clipsta; /* render_scene_set_window() respects this for now */ - envre->clipend= env->clipend; - - RE_SetCamera(envre, env->object); + viewscale= (env->type == ENV_PLANE)? env->viewscale: 1.0f; + RE_SetEnvmapCamera(envre, env->object, viewscale, env->clipsta, env->clipend); /* callbacks */ envre->display_draw= re->display_draw; diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c index b7f89e260a8..38ace8d5121 100644 --- a/source/blender/render/intern/source/external_engine.c +++ b/source/blender/render/intern/source/external_engine.c @@ -283,6 +283,11 @@ int RE_engine_render(Render *re, int do_all) if(re->result==NULL) return 1; + /* set render info */ + re->i.cfra= re->scene->r.cfra; + BLI_strncpy(re->i.scenename, re->scene->id.name+2, sizeof(re->i.scenename)); + re->i.totface=re->i.totvert=re->i.totstrand=re->i.totlamp=re->i.tothalo= 0; + /* render */ engine = RE_engine_create(type); engine->re= re; diff --git a/source/blender/render/intern/source/initrender.c b/source/blender/render/intern/source/initrender.c index 7bd8dad6502..b7254cd1221 100644 --- a/source/blender/render/intern/source/initrender.c +++ b/source/blender/render/intern/source/initrender.c @@ -451,15 +451,64 @@ struct Object *RE_GetCamera(Render *re) return re->camera_override ? re->camera_override : re->scene->camera; } +static void re_camera_params_get(Render *re, CameraParams *params, Object *cam_ob) +{ + copy_m4_m4(re->winmat, params->winmat); + + re->clipsta= params->clipsta; + re->clipend= params->clipend; + + re->ycor= params->ycor; + re->viewdx= params->viewdx; + re->viewdy= params->viewdy; + re->viewplane= params->viewplane; + + object_camera_mode(&re->r, cam_ob); +} + +void RE_SetEnvmapCamera(Render *re, Object *cam_ob, float viewscale, float clipsta, float clipend) +{ + CameraParams params; + + /* setup parameters */ + camera_params_init(¶ms); + camera_params_from_object(¶ms, cam_ob); + + params.lens= 16.0f*viewscale; + params.sensor_x= 32.0f; + params.sensor_y= 32.0f; + params.sensor_fit = CAMERA_SENSOR_FIT_AUTO; + params.clipsta= clipsta; + params.clipend= clipend; + + /* compute matrix, viewplane, .. */ + camera_params_compute_viewplane(¶ms, re->winx, re->winy, 1.0f, 1.0f); + camera_params_compute_matrix(¶ms); + + /* extract results */ + re_camera_params_get(re, ¶ms, cam_ob); +} + /* call this after InitState() */ /* per render, there's one persistent viewplane. Parts will set their own viewplanes */ -void RE_SetCamera(Render *re, Object *camera) +void RE_SetCamera(Render *re, Object *cam_ob) { - object_camera_mode(&re->r, camera); + CameraParams params; + + /* setup parameters */ + camera_params_init(¶ms); + camera_params_from_object(¶ms, cam_ob); + + params.use_fields= (re->r.mode & R_FIELDS); + params.field_second= (re->flag & R_SEC_FIELD); + params.field_odd= (re->r.mode & R_ODDFIELD); + + /* compute matrix, viewplane, .. */ + camera_params_compute_viewplane(¶ms, re->winx, re->winy, re->r.xasp, re->r.yasp); + camera_params_compute_matrix(¶ms); - object_camera_matrix(&re->r, camera, re->winx, re->winy, re->flag & R_SEC_FIELD, - re->winmat, &re->viewplane, &re->clipsta, &re->clipend, - &re->lens, &re->sensor_x, &re->sensor_y, &re->sensor_fit, &re->ycor, &re->viewdx, &re->viewdy); + /* extract results */ + re_camera_params_get(re, ¶ms, cam_ob); } void RE_SetPixelSize(Render *re, float pixsize) diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index d4cd6e1da92..c3d7f79b61f 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -134,7 +134,7 @@ Render R; /* ********* alloc and free ******** */ -static int do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh, const char *name_override); +static int do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovieHandle *mh, const char *name_override); static volatile int g_break= 0; static int thread_break(void *UNUSED(arg)) @@ -3040,10 +3040,10 @@ void RE_BlenderFrame(Render *re, Main *bmain, Scene *scene, SceneRenderLayer *sr } else { char name[FILE_MAX]; - BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION, FALSE); - + BKE_makepicstring(name, scene->r.pic, bmain->name, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION, FALSE); + /* reports only used for Movie */ - do_write_image_or_movie(re, scene, NULL, name); + do_write_image_or_movie(re, bmain, scene, NULL, name); } } @@ -3063,7 +3063,7 @@ void RE_RenderFreestyleStrokes(Render *re, Main *bmain, Scene *scene) re->result_ok= 1; } -static int do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh, const char *name_override) +static int do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovieHandle *mh, const char *name_override) { char name[FILE_MAX]; RenderResult rres; @@ -3091,7 +3091,7 @@ static int do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh, c if(name_override) BLI_strncpy(name, name_override, sizeof(name)); else - BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION, TRUE); + BKE_makepicstring(name, scene->r.pic, bmain->name, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION, TRUE); if(re->r.imtype==R_MULTILAYER) { if(re->result) { @@ -3194,7 +3194,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri do_render_all_options(re); if(re->test_break(re->tbh) == 0) { - if(!do_write_image_or_movie(re, scene, mh, NULL)) + if(!do_write_image_or_movie(re, bmain, scene, mh, NULL)) G.afbreek= 1; } @@ -3236,7 +3236,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri /* Touch/NoOverwrite options are only valid for image's */ if(BKE_imtype_is_movie(scene->r.imtype) == 0) { if(scene->r.mode & (R_NO_OVERWRITE | R_TOUCH)) - BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION, TRUE); + BKE_makepicstring(name, scene->r.pic, bmain->name, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION, TRUE); if(scene->r.mode & R_NO_OVERWRITE && BLI_exists(name)) { printf("skipping existing frame \"%s\"\n", name); @@ -3258,7 +3258,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri if(re->test_break(re->tbh) == 0) { if(!G.afbreek) - if(!do_write_image_or_movie(re, scene, mh, NULL)) + if(!do_write_image_or_movie(re, bmain, scene, mh, NULL)) G.afbreek= 1; } else diff --git a/source/blender/render/intern/source/render_texture.c b/source/blender/render/intern/source/render_texture.c index afc52f7c92a..323f04cbd04 100644 --- a/source/blender/render/intern/source/render_texture.c +++ b/source/blender/render/intern/source/render_texture.c @@ -79,6 +79,7 @@ #include "rendercore.h" #include "shading.h" #include "texture.h" +#include "texture_ocean.h" #include "renderdatabase.h" /* needed for UV */ @@ -1264,7 +1265,9 @@ static int multitex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, case TEX_VOXELDATA: retval= voxeldatatex(tex, texvec, texres); break; - + case TEX_OCEAN: + retval= ocean_texture(tex, texvec, texres); + break; } if (tex->flag & TEX_COLORBAND) { @@ -2193,6 +2196,12 @@ void do_material_tex(ShadeInput *shi, Render *re) use_ntap_bump = 0; use_compat_bump = 1; } + + /* case ocean */ + if(tex->type == TEX_OCEAN) { + use_ntap_bump = 0; + use_compat_bump = 0; + } /* which coords */ if(mtex->texco==TEXCO_ORCO) { @@ -2998,7 +3007,7 @@ void do_sky_tex(const float rco[3], float lo[3], const float dxyview[2], float h TexResult texres= {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, NULL}; float *co, fact, stencilTin=1.0; float tempvec[3], texvec[3], dxt[3], dyt[3]; - int tex_nr, rgb= 0, ok; + int tex_nr, rgb= 0; if (R.r.scemode & R_NO_TEX) return; /* todo: add flag to test if there's a tex */ @@ -3162,18 +3171,21 @@ void do_sky_tex(const float rco[3], float lo[3], const float dxyview[2], float h texture_rgb_blend(hor, tcol, hor, texres.tin, mtex->colfac, mtex->blendtype); } if(mtex->mapto & (WOMAP_ZENUP+WOMAP_ZENDOWN)) { - ok= 0; + float zenfac = 0.0f; + if(R.wrld.skytype & WO_SKYREAL) { if((skyflag & WO_ZENUP)) { - if(mtex->mapto & WOMAP_ZENUP) ok= 1; + if(mtex->mapto & WOMAP_ZENUP) zenfac= mtex->zenupfac; } - else if(mtex->mapto & WOMAP_ZENDOWN) ok= 1; + else if(mtex->mapto & WOMAP_ZENDOWN) zenfac= mtex->zendownfac; } - else ok= 1; - - if(ok) { - texture_rgb_blend(zen, tcol, zen, texres.tin, mtex->colfac, mtex->blendtype); + else { + if(mtex->mapto & WOMAP_ZENUP) zenfac= mtex->zenupfac; + else if(mtex->mapto & WOMAP_ZENDOWN) zenfac= mtex->zendownfac; } + + if(zenfac != 0.0f) + texture_rgb_blend(zen, tcol, zen, texres.tin, zenfac, mtex->blendtype); } } if(mtex->mapto & WOMAP_BLEND) { diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c index ad964a74b36..d82ccd05c1e 100644 --- a/source/blender/render/intern/source/shadeoutput.c +++ b/source/blender/render/intern/source/shadeoutput.c @@ -55,6 +55,8 @@ #include "sss.h" #include "texture.h" +#include "shading.h" /* own include */ + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ /* defined in pipeline.c, is hardcopy of active dynamic allocated Render */ /* only to be used here in this file, it's for speed */ diff --git a/source/blender/render/intern/source/texture_ocean.c b/source/blender/render/intern/source/texture_ocean.c new file mode 100644 index 00000000000..c13347dc162 --- /dev/null +++ b/source/blender/render/intern/source/texture_ocean.c @@ -0,0 +1,157 @@ +/* + * ***** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * Contributors: Matt Ebb + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include <stddef.h> + +#include "BLI_math.h" +#include "BLI_utildefines.h" + +#include "DNA_modifier_types.h" +#include "DNA_object_types.h" +#include "DNA_texture_types.h" + +#include "BKE_global.h" /* XXX */ + +#include "BKE_modifier.h" +#include "BKE_ocean.h" +#include "BKE_utildefines.h" + +#include "render_types.h" +#include "RE_shader_ext.h" + +#include "texture.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; +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + + + + +/* ***** actual texture sampling ***** */ +int ocean_texture(Tex *tex, float *texvec, TexResult *texres) +{ + OceanTex *ot= tex->ot; + ModifierData *md; + OceanModifierData *omd; + + texres->tin = 0.0f; + + if ( !(ot) || + !(ot->object) || + !(md = (ModifierData *)modifiers_findByType(ot->object, eModifierType_Ocean)) || + !(omd= (OceanModifierData *)md)->ocean) + { + return 0; + } + else { + const int do_normals = (omd->flag & MOD_OCEAN_GENERATE_NORMALS); + int cfra = R.r.cfra; + int retval = TEX_INT; + + OceanResult ocr; + const float u = 0.5f+0.5f*texvec[0]; + const float v = 0.5f+0.5f*texvec[1]; + + if (omd->oceancache && omd->cached==TRUE) { + + CLAMP(cfra, omd->bakestart, omd->bakeend); + cfra -= omd->bakestart; // shift to 0 based + + BKE_ocean_cache_eval_uv(omd->oceancache, &ocr, cfra, u, v); + + } + else { // non-cached + + if (G.rendering) + BKE_ocean_eval_uv_catrom(omd->ocean, &ocr, u, v); + else + BKE_ocean_eval_uv(omd->ocean, &ocr, u, v); + + ocr.foam = BKE_ocean_jminus_to_foam(ocr.Jminus, omd->foam_coverage); + } + + switch (ot->output) { + case TEX_OCN_DISPLACEMENT: + /* XYZ displacement */ + texres->tr = 0.5f + 0.5f * ocr.disp[0]; + texres->tg = 0.5f + 0.5f * ocr.disp[2]; + texres->tb = 0.5f + 0.5f * ocr.disp[1]; + + texres->tr = MAX2(0.0f, texres->tr); + texres->tg = MAX2(0.0f, texres->tg); + texres->tb = MAX2(0.0f, texres->tb); + + BRICONTRGB; + + retval = TEX_RGB; + break; + + case TEX_OCN_EMINUS: + /* -ve eigenvectors ? */ + texres->tr = ocr.Eminus[0]; + texres->tg = ocr.Eminus[2]; + texres->tb = ocr.Eminus[1]; + retval = TEX_RGB; + break; + + case TEX_OCN_EPLUS: + /* -ve eigenvectors ? */ + texres->tr = ocr.Eplus[0]; + texres->tg = ocr.Eplus[2]; + texres->tb = ocr.Eplus[1]; + retval = TEX_RGB; + break; + + case TEX_OCN_JPLUS: + texres->tin = ocr.Jplus; + retval = TEX_INT; + break; + + case TEX_OCN_FOAM: + + texres->tin = ocr.foam; + + BRICONT; + + retval = TEX_INT; + break; + } + + /* if normals needed */ + + if (texres->nor && do_normals) { + normalize_v3_v3(texres->nor, ocr.normal); + retval |= TEX_NOR; + } + + texres->ta = 1.0f; + + return retval; + } +} |