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:
authorTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2011-11-21 01:02:12 +0400
committerTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2011-11-21 01:02:12 +0400
commit2676f2d58f71f438008b413a86b873e7787d80ea (patch)
treeeb541972cf32d5958b7c0f7f8ece525b78cfcbff /source/blender/render
parentbb9976f058ba2090812074e1b774213d20821a30 (diff)
parent4ab1dadf72a821b344a714fff59aed11d15ecb14 (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.txt2
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h1
-rw-r--r--source/blender/render/intern/include/render_types.h3
-rw-r--r--source/blender/render/intern/include/texture_ocean.h28
-rw-r--r--source/blender/render/intern/source/convertblender.c2
-rw-r--r--source/blender/render/intern/source/envmap.c12
-rw-r--r--source/blender/render/intern/source/external_engine.c5
-rw-r--r--source/blender/render/intern/source/initrender.c59
-rw-r--r--source/blender/render/intern/source/pipeline.c18
-rw-r--r--source/blender/render/intern/source/render_texture.c30
-rw-r--r--source/blender/render/intern/source/shadeoutput.c2
-rw-r--r--source/blender/render/intern/source/texture_ocean.c157
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(&params);
+ camera_params_from_object(&params, 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(&params, re->winx, re->winy, 1.0f, 1.0f);
+ camera_params_compute_matrix(&params);
+
+ /* extract results */
+ re_camera_params_get(re, &params, 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(&params);
+ camera_params_from_object(&params, 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(&params, re->winx, re->winy, re->r.xasp, re->r.yasp);
+ camera_params_compute_matrix(&params);
- 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, &params, 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;
+ }
+}