Fix merge error in 908b696, removed files were accidentally added back.
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Mon, 11 Jun 2018 15:01:17 +0000 (17:01 +0200)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Mon, 11 Jun 2018 15:06:28 +0000 (17:06 +0200)
47 files changed:
source/blender/nodes/shader/nodes/node_shader_geom.c [deleted file]
source/blender/nodes/shader/nodes/node_shader_material.c [deleted file]
source/blender/nodes/shader/nodes/node_shader_output.c [deleted file]
source/blender/nodes/shader/nodes/node_shader_texture.c [deleted file]
source/blender/render/intern/include/envmap.h [deleted file]
source/blender/render/intern/include/pixelblending.h [deleted file]
source/blender/render/intern/include/pixelshading.h [deleted file]
source/blender/render/intern/include/pointdensity.h [deleted file]
source/blender/render/intern/include/raycounter.h [deleted file]
source/blender/render/intern/include/rayintersection.h [deleted file]
source/blender/render/intern/include/rendercore.h [deleted file]
source/blender/render/intern/include/shading.h [deleted file]
source/blender/render/intern/include/strand.h [deleted file]
source/blender/render/intern/include/sunsky.h [deleted file]
source/blender/render/intern/include/texture_ocean.h [deleted file]
source/blender/render/intern/include/voxeldata.h [deleted file]
source/blender/render/intern/raytrace/bvh.h [deleted file]
source/blender/render/intern/raytrace/rayobject.cpp [deleted file]
source/blender/render/intern/raytrace/rayobject_hint.h [deleted file]
source/blender/render/intern/raytrace/rayobject_instance.cpp [deleted file]
source/blender/render/intern/raytrace/rayobject_octree.cpp [deleted file]
source/blender/render/intern/raytrace/rayobject_qbvh.cpp [deleted file]
source/blender/render/intern/raytrace/rayobject_raycounter.cpp [deleted file]
source/blender/render/intern/raytrace/rayobject_rtbuild.cpp [deleted file]
source/blender/render/intern/raytrace/rayobject_rtbuild.h [deleted file]
source/blender/render/intern/raytrace/rayobject_svbvh.cpp [deleted file]
source/blender/render/intern/raytrace/rayobject_vbvh.cpp [deleted file]
source/blender/render/intern/raytrace/reorganize.h [deleted file]
source/blender/render/intern/raytrace/svbvh.h [deleted file]
source/blender/render/intern/raytrace/vbvh.h [deleted file]
source/blender/render/intern/source/bake.c [deleted file]
source/blender/render/intern/source/convertblender.c [deleted file]
source/blender/render/intern/source/envmap.c [deleted file]
source/blender/render/intern/source/occlusion.c [deleted file]
source/blender/render/intern/source/pixelblending.c [deleted file]
source/blender/render/intern/source/pixelshading.c [deleted file]
source/blender/render/intern/source/rayshade.c [deleted file]
source/blender/render/intern/source/rendercore.c [deleted file]
source/blender/render/intern/source/renderdatabase.c [deleted file]
source/blender/render/intern/source/shadbuf.c [deleted file]
source/blender/render/intern/source/shadeinput.c [deleted file]
source/blender/render/intern/source/shadeoutput.c [deleted file]
source/blender/render/intern/source/sss.c [deleted file]
source/blender/render/intern/source/strand.c [deleted file]
source/blender/render/intern/source/sunsky.c [deleted file]
source/blender/render/intern/source/volume_precache.c [deleted file]
source/blender/render/intern/source/volumetric.c [deleted file]

diff --git a/source/blender/nodes/shader/nodes/node_shader_geom.c b/source/blender/nodes/shader/nodes/node_shader_geom.c
deleted file mode 100644 (file)
index 0a51ee8..0000000
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * ***** 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) 2005 Blender Foundation.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/nodes/shader/nodes/node_shader_geom.c
- *  \ingroup shdnodes
- */
-
-
-#include "node_shader_util.h"
-
-#include "DNA_customdata_types.h"
-
-/* **************** GEOMETRY  ******************** */
-
-/* output socket type definition */
-static bNodeSocketTemplate sh_node_geom_out[] = {
-       {       SOCK_VECTOR, 0, N_("Global")},
-       {       SOCK_VECTOR, 0, N_("Local")},
-       {       SOCK_VECTOR, 0, N_("View")},
-       {       SOCK_VECTOR, 0, N_("Orco")},
-       {       SOCK_VECTOR, 0, N_("UV")},
-       {       SOCK_VECTOR, 0, N_("Normal")},
-       {       SOCK_RGBA,   0, N_("Vertex Color")},
-       {       SOCK_FLOAT,   0, N_("Vertex Alpha")},
-       {       SOCK_FLOAT,   0, N_("Front/Back")},
-       {       -1, 0, ""       }
-};
-
-/* node execute callback */
-static void node_shader_exec_geom(void *data, int UNUSED(thread), bNode *node, bNodeExecData *UNUSED(execdata), bNodeStack **UNUSED(in), bNodeStack **out)
-{
-       if (data) {
-               ShadeInput *shi = ((ShaderCallData *)data)->shi;
-               NodeGeometry *ngeo = (NodeGeometry *)node->storage;
-               ShadeInputUV *suv = &shi->uv[shi->actuv];
-               static float defaultvcol[4] = {1.0f, 1.0f, 1.0f, 1.0f};
-               int i;
-
-               if (ngeo->uvname[0]) {
-                       /* find uv map by name */
-                       for (i = 0; i < shi->totuv; i++) {
-                               if (STREQ(shi->uv[i].name, ngeo->uvname)) {
-                                       suv = &shi->uv[i];
-                                       break;
-                               }
-                       }
-               }
-
-               /* out: global, local, view, orco, uv, normal, vertex color */
-               copy_v3_v3(out[GEOM_OUT_GLOB]->vec, shi->gl);
-               copy_v3_v3(out[GEOM_OUT_LOCAL]->vec, shi->co);
-               copy_v3_v3(out[GEOM_OUT_VIEW]->vec, shi->view);
-               copy_v3_v3(out[GEOM_OUT_ORCO]->vec, shi->lo);
-               copy_v3_v3(out[GEOM_OUT_UV]->vec, suv->uv);
-               copy_v3_v3(out[GEOM_OUT_NORMAL]->vec, shi->vno);
-
-               if (shi->use_world_space_shading) {
-                       negate_v3(out[GEOM_OUT_NORMAL]->vec);
-                       mul_mat3_m4_v3((float (*)[4])RE_render_current_get_matrix(RE_VIEWINV_MATRIX), out[GEOM_OUT_NORMAL]->vec);
-               }
-               if (shi->totcol) {
-                       /* find vertex color layer by name */
-                       ShadeInputCol *scol = &shi->col[0];
-
-                       if (ngeo->colname[0]) {
-                               for (i = 0; i < shi->totcol; i++) {
-                                       if (STREQ(shi->col[i].name, ngeo->colname)) {
-                                               scol = &shi->col[i];
-                                               break;
-                                       }
-                               }
-                       }
-
-                       srgb_to_linearrgb_v3_v3(out[GEOM_OUT_VCOL]->vec, scol->col);
-                       out[GEOM_OUT_VCOL]->vec[3] = scol->col[3];
-                       out[GEOM_OUT_VCOL_ALPHA]->vec[0] = scol->col[3];
-               }
-               else {
-                       memcpy(out[GEOM_OUT_VCOL]->vec, defaultvcol, sizeof(defaultvcol));
-                       out[GEOM_OUT_VCOL_ALPHA]->vec[0] = 1.0f;
-               }
-
-               if (shi->osatex) {
-                       out[GEOM_OUT_GLOB]->data = shi->dxgl;
-                       out[GEOM_OUT_GLOB]->datatype = NS_OSA_VECTORS;
-                       out[GEOM_OUT_LOCAL]->data = shi->dxco;
-                       out[GEOM_OUT_LOCAL]->datatype = NS_OSA_VECTORS;
-                       out[GEOM_OUT_VIEW]->data = &shi->dxview;
-                       out[GEOM_OUT_VIEW]->datatype = NS_OSA_VALUES;
-                       out[GEOM_OUT_ORCO]->data = shi->dxlo;
-                       out[GEOM_OUT_ORCO]->datatype = NS_OSA_VECTORS;
-                       out[GEOM_OUT_UV]->data = suv->dxuv;
-                       out[GEOM_OUT_UV]->datatype = NS_OSA_VECTORS;
-                       out[GEOM_OUT_NORMAL]->data = shi->dxno;
-                       out[GEOM_OUT_NORMAL]->datatype = NS_OSA_VECTORS;
-               }
-
-               /* front/back, normal flipping was stored */
-               out[GEOM_OUT_FRONTBACK]->vec[0] = (shi->flippednor) ? 0.0f : 1.0f;
-       }
-}
-
-static void node_shader_init_geometry(bNodeTree *UNUSED(ntree), bNode *node)
-{
-       node->storage = MEM_callocN(sizeof(NodeGeometry), "NodeGeometry");
-}
-
-static int gpu_shader_geom(GPUMaterial *mat, bNode *node, bNodeExecData *UNUSED(execdata), GPUNodeStack *in, GPUNodeStack *out)
-{
-       NodeGeometry *ngeo = (NodeGeometry *)node->storage;
-       GPUNodeLink *orco = GPU_attribute(CD_ORCO, "");
-       GPUNodeLink *mtface = GPU_attribute(CD_MTFACE, ngeo->uvname);
-       GPUNodeLink *mcol = GPU_attribute(CD_MCOL, ngeo->colname);
-
-       bool ret = GPU_stack_link(mat, "geom", in, out,
-                             GPU_builtin(GPU_VIEW_POSITION), GPU_builtin(GPU_VIEW_NORMAL),
-                             GPU_builtin(GPU_INVERSE_VIEW_MATRIX), orco, mtface, mcol);
-       if (GPU_material_use_world_space_shading(mat)) {
-               GPU_link(mat, "vec_math_negate", out[5].link, &out[5].link);
-               ret &= GPU_link(mat, "direction_transform_m4v3", out[5].link, GPU_builtin(GPU_INVERSE_VIEW_MATRIX), &out[5].link);
-       }
-       return ret;
-}
-
-/* node type definition */
-void register_node_type_sh_geom(void)
-{
-       static bNodeType ntype;
-
-       sh_node_type_base(&ntype, SH_NODE_GEOMETRY, "Geometry", NODE_CLASS_INPUT, 0);
-       node_type_compatibility(&ntype, NODE_OLD_SHADING);
-       node_type_socket_templates(&ntype, NULL, sh_node_geom_out);
-       node_type_init(&ntype, node_shader_init_geometry);
-       node_type_storage(&ntype, "NodeGeometry", node_free_standard_storage, node_copy_standard_storage);
-       node_type_exec(&ntype, NULL, NULL, node_shader_exec_geom);
-       node_type_gpu(&ntype, gpu_shader_geom);
-
-       nodeRegisterType(&ntype);
-}
diff --git a/source/blender/nodes/shader/nodes/node_shader_material.c b/source/blender/nodes/shader/nodes/node_shader_material.c
deleted file mode 100644 (file)
index 8a73ddc..0000000
+++ /dev/null
@@ -1,374 +0,0 @@
-/*
- * ***** 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) 2005 Blender Foundation.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/nodes/shader/nodes/node_shader_material.c
- *  \ingroup shdnodes
- */
-
-#include "node_shader_util.h"
-
-/* **************** MATERIAL ******************** */
-
-static bNodeSocketTemplate sh_node_material_in[] = {
-       {       SOCK_RGBA, 1, N_("Color"),              0.0f, 0.0f, 0.0f, 1.0f},
-       {       SOCK_RGBA, 1, N_("Spec"),               0.0f, 0.0f, 0.0f, 1.0f},
-       {       SOCK_FLOAT, 1, N_("DiffuseIntensity"),          0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
-       {       SOCK_VECTOR, 1, N_("Normal"),   0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_DIRECTION},
-       {       -1, 0, ""       }
-};
-
-static bNodeSocketTemplate sh_node_material_out[] = {
-       {       SOCK_RGBA, 0, N_("Color")},
-       {       SOCK_FLOAT, 0, N_("Alpha")},
-       {       SOCK_VECTOR, 0, N_("Normal")},
-       {       -1, 0, ""       }
-};
-
-/* **************** EXTENDED MATERIAL ******************** */
-
-static bNodeSocketTemplate sh_node_material_ext_in[] = {
-       {       SOCK_RGBA, 1, N_("Color"),              0.0f, 0.0f, 0.0f, 1.0f},
-       {       SOCK_RGBA, 1, N_("Spec"),               0.0f, 0.0f, 0.0f, 1.0f},
-       {       SOCK_FLOAT, 1, N_("DiffuseIntensity"),          0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
-       {       SOCK_VECTOR, 1, N_("Normal"),   0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_DIRECTION},
-       {       SOCK_RGBA, 1, N_("Mirror"),             0.0f, 0.0f, 0.0f, 1.0f},
-       {       SOCK_FLOAT, 1, N_("Ambient"),   0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
-       {       SOCK_FLOAT, 1, N_("Emit"),              0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_UNSIGNED},
-       {       SOCK_FLOAT, 1, N_("SpecTra"),   0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
-       {       SOCK_FLOAT, 1, N_("Reflectivity"),      0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE},
-       {       SOCK_FLOAT, 1, N_("Alpha"),             0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_UNSIGNED},
-       {       SOCK_FLOAT, 1, N_("Translucency"),      0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
-       {       -1, 0, ""       }
-};
-
-static bNodeSocketTemplate sh_node_material_ext_out[] = {
-       {       SOCK_RGBA, 0, N_("Color")},
-       {       SOCK_FLOAT, 0, N_("Alpha")},
-       {       SOCK_VECTOR, 0, N_("Normal")},
-       {       SOCK_RGBA, 0, N_("Diffuse")},
-       {       SOCK_RGBA, 0, N_("Spec")},
-       {       SOCK_RGBA, 0, N_("AO")},
-       {       -1, 0, ""       }
-};
-
-static void node_shader_exec_material(void *data, int UNUSED(thread), bNode *node, bNodeExecData *execdata, bNodeStack **in, bNodeStack **out)
-{
-       if (data && node->id) {
-               ShadeResult shrnode;
-               ShadeInput *shi;
-               ShaderCallData *shcd = data;
-               float col[4];
-               bNodeSocket *sock;
-               char hasinput[NUM_MAT_IN] = {'\0'};
-               int i, mode;
-
-               /* note: cannot use the in[]->hasinput flags directly, as these are not necessarily
-                * the constant input stack values (e.g. in case material node is inside a group).
-                * we just want to know if a node input uses external data or the material setting.
-                * this is an ugly hack, but so is this node as a whole.
-                */
-               for (sock = node->inputs.first, i = 0; sock; sock = sock->next, ++i)
-                       hasinput[i] = (sock->link != NULL);
-
-               shi = shcd->shi;
-               shi->mat = (Material *)node->id;
-
-               /* copy all relevant material vars, note, keep this synced with render_types.h */
-               memcpy(&shi->r, &shi->mat->r, 23 * sizeof(float));
-               shi->har = shi->mat->har;
-
-               /* write values */
-               if (hasinput[MAT_IN_COLOR])
-                       nodestack_get_vec(&shi->r, SOCK_VECTOR, in[MAT_IN_COLOR]);
-
-               if (hasinput[MAT_IN_SPEC])
-                       nodestack_get_vec(&shi->specr, SOCK_VECTOR, in[MAT_IN_SPEC]);
-
-               if (hasinput[MAT_IN_REFL])
-                       nodestack_get_vec(&shi->refl, SOCK_FLOAT, in[MAT_IN_REFL]);
-
-               /* retrieve normal */
-               if (hasinput[MAT_IN_NORMAL]) {
-                       nodestack_get_vec(shi->vn, SOCK_VECTOR, in[MAT_IN_NORMAL]);
-                       if (shi->use_world_space_shading) {
-                               negate_v3(shi->vn);
-                               mul_mat3_m4_v3((float (*)[4])RE_render_current_get_matrix(RE_VIEW_MATRIX), shi->vn);
-                       }
-                       normalize_v3(shi->vn);
-               }
-               else
-                       copy_v3_v3(shi->vn, shi->vno);
-
-               /* custom option to flip normal */
-               if (node->custom1 & SH_NODE_MAT_NEG) {
-                       negate_v3(shi->vn);
-               }
-
-               if (node->type == SH_NODE_MATERIAL_EXT) {
-                       if (hasinput[MAT_IN_MIR])
-                               nodestack_get_vec(&shi->mirr, SOCK_VECTOR, in[MAT_IN_MIR]);
-                       if (hasinput[MAT_IN_AMB])
-                               nodestack_get_vec(&shi->amb, SOCK_FLOAT, in[MAT_IN_AMB]);
-                       if (hasinput[MAT_IN_EMIT])
-                               nodestack_get_vec(&shi->emit, SOCK_FLOAT, in[MAT_IN_EMIT]);
-                       if (hasinput[MAT_IN_SPECTRA])
-                               nodestack_get_vec(&shi->spectra, SOCK_FLOAT, in[MAT_IN_SPECTRA]);
-                       if (hasinput[MAT_IN_RAY_MIRROR])
-                               nodestack_get_vec(&shi->ray_mirror, SOCK_FLOAT, in[MAT_IN_RAY_MIRROR]);
-                       if (hasinput[MAT_IN_ALPHA])
-                               nodestack_get_vec(&shi->alpha, SOCK_FLOAT, in[MAT_IN_ALPHA]);
-                       if (hasinput[MAT_IN_TRANSLUCENCY])
-                               nodestack_get_vec(&shi->translucency, SOCK_FLOAT, in[MAT_IN_TRANSLUCENCY]);
-               }
-
-               /* make alpha output give results even if transparency is only enabled on
-                * the material linked in this not and not on the parent material */
-               mode = shi->mode;
-               if (shi->mat->mode & MA_TRANSP)
-                       shi->mode |= MA_TRANSP;
-
-               shi->nodes = 1; /* temp hack to prevent trashadow recursion */
-               node_shader_lamp_loop(shi, &shrnode);   /* clears shrnode */
-               shi->nodes = 0;
-
-               shi->mode = mode;
-
-               /* write to outputs */
-               if (node->custom1 & SH_NODE_MAT_DIFF) {
-                       copy_v3_v3(col, shrnode.combined);
-                       if (!(node->custom1 & SH_NODE_MAT_SPEC)) {
-                               sub_v3_v3(col, shrnode.spec);
-                       }
-               }
-               else if (node->custom1 & SH_NODE_MAT_SPEC) {
-                       copy_v3_v3(col, shrnode.spec);
-               }
-               else
-                       col[0] = col[1] = col[2] = 0.0f;
-
-               col[3] = shrnode.alpha;
-
-               if (shi->do_preview)
-                       BKE_node_preview_set_pixel(execdata->preview, col, shi->xs, shi->ys, shi->do_manage);
-
-               copy_v3_v3(out[MAT_OUT_COLOR]->vec, col);
-               out[MAT_OUT_ALPHA]->vec[0] = shrnode.alpha;
-
-               if (node->custom1 & SH_NODE_MAT_NEG) {
-                       shi->vn[0] = -shi->vn[0];
-                       shi->vn[1] = -shi->vn[1];
-                       shi->vn[2] = -shi->vn[2];
-               }
-
-               copy_v3_v3(out[MAT_OUT_NORMAL]->vec, shi->vn);
-
-               if (shi->use_world_space_shading) {
-                       negate_v3(out[MAT_OUT_NORMAL]->vec);
-                       mul_mat3_m4_v3((float (*)[4])RE_render_current_get_matrix(RE_VIEWINV_MATRIX), out[MAT_OUT_NORMAL]->vec);
-               }
-               /* Extended material options */
-               if (node->type == SH_NODE_MATERIAL_EXT) {
-                       /* Shadow, Reflect, Refract, Radiosity, Speed seem to cause problems inside
-                        * a node tree :( */
-                       copy_v3_v3(out[MAT_OUT_DIFFUSE]->vec, shrnode.diffshad);
-                       copy_v3_v3(out[MAT_OUT_SPEC]->vec, shrnode.spec);
-                       copy_v3_v3(out[MAT_OUT_AO]->vec, shrnode.ao);
-               }
-
-               /* copy passes, now just active node */
-               if (node->flag & NODE_ACTIVE_ID) {
-                       float combined[4], alpha;
-
-                       copy_v4_v4(combined, shcd->shr->combined);
-                       alpha = shcd->shr->alpha;
-
-                       *(shcd->shr) = shrnode;
-
-                       copy_v4_v4(shcd->shr->combined, combined);
-                       shcd->shr->alpha = alpha;
-               }
-       }
-}
-
-
-static void node_shader_init_material(bNodeTree *UNUSED(ntree), bNode *node)
-{
-       node->custom1 = SH_NODE_MAT_DIFF | SH_NODE_MAT_SPEC;
-}
-
-/* XXX this is also done as a local static function in gpu_codegen.c,
- * but we need this to hack around the crappy material node.
- */
-static GPUNodeLink *gpu_get_input_link(GPUMaterial *mat, GPUNodeStack *in)
-{
-       if (in->link) {
-               return in->link;
-       }
-       else {
-               GPUNodeLink *result = NULL;
-
-               /* note GPU_uniform() is only intended to be used as a parameter to
-                * GPU_link(), returning it directly results in leaks or double frees */
-               if (in->type == GPU_FLOAT)
-                       GPU_link(mat, "set_value", GPU_uniform(in->vec), &result);
-               else if (in->type == GPU_VEC3)
-                       GPU_link(mat, "set_rgb", GPU_uniform(in->vec), &result);
-               else if (in->type == GPU_VEC4)
-                       GPU_link(mat, "set_rgba", GPU_uniform(in->vec), &result);
-               else
-                       BLI_assert(0);
-
-               return result;
-       }
-}
-
-static int gpu_shader_material(GPUMaterial *mat, bNode *node, bNodeExecData *UNUSED(execdata), GPUNodeStack *in, GPUNodeStack *out)
-{
-       if (node->id) {
-               GPUShadeInput shi;
-               GPUShadeResult shr;
-               bNodeSocket *sock;
-               char hasinput[NUM_MAT_IN] = {'\0'};
-               int i;
-
-               /* note: cannot use the in[]->hasinput flags directly, as these are not necessarily
-                * the constant input stack values (e.g. in case material node is inside a group).
-                * we just want to know if a node input uses external data or the material setting.
-                */
-               for (sock = node->inputs.first, i = 0; sock; sock = sock->next, ++i)
-                       hasinput[i] = (sock->link != NULL);
-
-               GPU_shadeinput_set(mat, (Material *)node->id, &shi);
-
-               /* write values */
-               if (hasinput[MAT_IN_COLOR])
-                       shi.rgb = gpu_get_input_link(mat, &in[MAT_IN_COLOR]);
-
-               if (hasinput[MAT_IN_SPEC])
-                       shi.specrgb = gpu_get_input_link(mat, &in[MAT_IN_SPEC]);
-
-               if (hasinput[MAT_IN_REFL])
-                       shi.refl = gpu_get_input_link(mat, &in[MAT_IN_REFL]);
-
-               /* retrieve normal */
-               if (hasinput[MAT_IN_NORMAL]) {
-                       GPUNodeLink *tmp;
-                       shi.vn = gpu_get_input_link(mat, &in[MAT_IN_NORMAL]);
-                       if (GPU_material_use_world_space_shading(mat)) {
-                               GPU_link(mat, "vec_math_negate", shi.vn, &shi.vn);
-                               GPU_link(mat, "direction_transform_m4v3", shi.vn, GPU_builtin(GPU_VIEW_MATRIX), &shi.vn);
-                       }
-                       GPU_link(mat, "vec_math_normalize", shi.vn, &shi.vn, &tmp);
-               }
-
-               /* custom option to flip normal */
-               if (node->custom1 & SH_NODE_MAT_NEG)
-                       GPU_link(mat, "vec_math_negate", shi.vn, &shi.vn);
-
-               if (node->type == SH_NODE_MATERIAL_EXT) {
-                       if (hasinput[MAT_IN_MIR])
-                               shi.mir = gpu_get_input_link(mat, &in[MAT_IN_MIR]);
-                       if (hasinput[MAT_IN_AMB])
-                               shi.amb = gpu_get_input_link(mat, &in[MAT_IN_AMB]);
-                       if (hasinput[MAT_IN_EMIT])
-                               shi.emit = gpu_get_input_link(mat, &in[MAT_IN_EMIT]);
-                       if (hasinput[MAT_IN_SPECTRA])
-                               shi.spectra = gpu_get_input_link(mat, &in[MAT_IN_SPECTRA]);
-                       if (hasinput[MAT_IN_ALPHA])
-                               shi.alpha = gpu_get_input_link(mat, &in[MAT_IN_ALPHA]);
-               }
-
-               GPU_shaderesult_set(&shi, &shr); /* clears shr */
-
-               /* write to outputs */
-               if (node->custom1 & SH_NODE_MAT_DIFF) {
-                       out[MAT_OUT_COLOR].link = shr.combined;
-
-                       if (!(node->custom1 & SH_NODE_MAT_SPEC)) {
-                               GPUNodeLink *link;
-                               GPU_link(mat, "vec_math_sub", shr.combined, shr.spec, &out[MAT_OUT_COLOR].link, &link);
-                       }
-               }
-               else if (node->custom1 & SH_NODE_MAT_SPEC) {
-                       out[MAT_OUT_COLOR].link = shr.spec;
-               }
-               else
-                       GPU_link(mat, "set_rgb_zero", &out[MAT_OUT_COLOR].link);
-
-               GPU_link(mat, "mtex_alpha_to_col", out[MAT_OUT_COLOR].link, shr.alpha, &out[MAT_OUT_COLOR].link);
-
-               out[MAT_OUT_ALPHA].link = shr.alpha; //
-
-               if (node->custom1 & SH_NODE_MAT_NEG)
-                       GPU_link(mat, "vec_math_negate", shi.vn, &shi.vn);
-               out[MAT_OUT_NORMAL].link = shi.vn;
-               if (GPU_material_use_world_space_shading(mat)) {
-                       GPU_link(mat, "vec_math_negate", out[MAT_OUT_NORMAL].link, &out[MAT_OUT_NORMAL].link);
-                       GPU_link(mat, "direction_transform_m4v3", out[MAT_OUT_NORMAL].link, GPU_builtin(GPU_INVERSE_VIEW_MATRIX), &out[MAT_OUT_NORMAL].link);
-               }
-
-               if (node->type == SH_NODE_MATERIAL_EXT) {
-                       out[MAT_OUT_DIFFUSE].link = shr.diff;
-                       out[MAT_OUT_SPEC].link = shr.spec;
-                       GPU_link(mat, "set_rgb_one", &out[MAT_OUT_AO].link);
-               }
-
-               return 1;
-       }
-
-       return 0;
-}
-
-void register_node_type_sh_material(void)
-{
-       static bNodeType ntype;
-
-       sh_node_type_base(&ntype, SH_NODE_MATERIAL, "Material", NODE_CLASS_INPUT, NODE_PREVIEW);
-       node_type_compatibility(&ntype, NODE_OLD_SHADING);
-       node_type_socket_templates(&ntype, sh_node_material_in, sh_node_material_out);
-       node_type_init(&ntype, node_shader_init_material);
-       node_type_exec(&ntype, NULL, NULL, node_shader_exec_material);
-       node_type_gpu(&ntype, gpu_shader_material);
-
-       nodeRegisterType(&ntype);
-}
-
-
-void register_node_type_sh_material_ext(void)
-{
-       static bNodeType ntype;
-
-       sh_node_type_base(&ntype, SH_NODE_MATERIAL_EXT, "Extended Material", NODE_CLASS_INPUT, NODE_PREVIEW);
-       node_type_compatibility(&ntype, NODE_OLD_SHADING);
-       node_type_socket_templates(&ntype, sh_node_material_ext_in, sh_node_material_ext_out);
-       node_type_init(&ntype, node_shader_init_material);
-       node_type_size_preset(&ntype, NODE_SIZE_MIDDLE);
-       node_type_exec(&ntype, NULL, NULL, node_shader_exec_material);
-       node_type_gpu(&ntype, gpu_shader_material);
-
-       nodeRegisterType(&ntype);
-}
diff --git a/source/blender/nodes/shader/nodes/node_shader_output.c b/source/blender/nodes/shader/nodes/node_shader_output.c
deleted file mode 100644 (file)
index 5b1a68b..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * ***** 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) 2005 Blender Foundation.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/nodes/shader/nodes/node_shader_output.c
- *  \ingroup shdnodes
- */
-
-
-#include "node_shader_util.h"
-
-/* **************** OUTPUT ******************** */
-static bNodeSocketTemplate sh_node_output_in[] = {
-       {       SOCK_RGBA, 1, N_("Color"),              0.0f, 0.0f, 0.0f, 1.0f},
-       {       SOCK_FLOAT, 1, N_("Alpha"),             1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE},
-       {       -1, 0, ""       }
-};
-
-static void node_shader_exec_output(void *data, int UNUSED(thread), bNode *node, bNodeExecData *execdata, bNodeStack **in, bNodeStack **UNUSED(out))
-{
-       if (data) {
-               ShadeInput *shi = ((ShaderCallData *)data)->shi;
-               float col[4];
-
-               /* stack order input sockets: col, alpha, normal */
-               nodestack_get_vec(col, SOCK_VECTOR, in[0]);
-               nodestack_get_vec(col + 3, SOCK_FLOAT, in[1]);
-
-               if (shi->do_preview) {
-                       BKE_node_preview_set_pixel(execdata->preview, col, shi->xs, shi->ys, shi->do_manage);
-                       node->lasty = shi->ys;
-               }
-
-               if (node->flag & NODE_DO_OUTPUT) {
-                       ShadeResult *shr = ((ShaderCallData *)data)->shr;
-
-                       copy_v4_v4(shr->combined, col);
-                       shr->alpha = col[3];
-
-                       //      copy_v3_v3(shr->nor, in[3]->vec);
-               }
-       }
-}
-
-static int gpu_shader_output(GPUMaterial *mat, bNode *UNUSED(node), bNodeExecData *UNUSED(execdata), GPUNodeStack *in, GPUNodeStack *out)
-{
-       GPUNodeLink *outlink;
-
-#if 0
-       if (in[1].hasinput)
-               GPU_material_enable_alpha(mat);
-#endif
-
-       GPU_stack_link(mat, "output_node", in, out, &outlink);
-       GPU_material_output_link(mat, outlink);
-
-       return 1;
-}
-
-void register_node_type_sh_output(void)
-{
-       static bNodeType ntype;
-
-       sh_node_type_base(&ntype, SH_NODE_OUTPUT, "Output", NODE_CLASS_OUTPUT, NODE_PREVIEW);
-       node_type_compatibility(&ntype, NODE_OLD_SHADING);
-       node_type_socket_templates(&ntype, sh_node_output_in, NULL);
-       node_type_exec(&ntype, NULL, NULL, node_shader_exec_output);
-       node_type_gpu(&ntype, gpu_shader_output);
-
-       /* Do not allow muting output node. */
-       node_type_internal_links(&ntype, NULL);
-
-       nodeRegisterType(&ntype);
-}
diff --git a/source/blender/nodes/shader/nodes/node_shader_texture.c b/source/blender/nodes/shader/nodes/node_shader_texture.c
deleted file mode 100644 (file)
index 737ec7d..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * ***** 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) 2005 Blender Foundation.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/nodes/shader/nodes/node_shader_texture.c
- *  \ingroup shdnodes
- */
-
-#include "DNA_texture_types.h"
-
-#include "node_shader_util.h"
-
-#include "GPU_material.h"
-
-/* **************** TEXTURE ******************** */
-static bNodeSocketTemplate sh_node_texture_in[] = {
-       {       SOCK_VECTOR, 1, "Vector",       0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},       /* no limit */
-       {       -1, 0, ""       }
-};
-static bNodeSocketTemplate sh_node_texture_out[] = {
-       {       SOCK_FLOAT, 0, N_("Value"), 0, 0, 0, 0, 0, 0, PROP_NONE, SOCK_NO_INTERNAL_LINK},
-       {       SOCK_RGBA, 0, N_("Color"), 0, 0, 0, 0, 0, 0, PROP_NONE, SOCK_NO_INTERNAL_LINK},
-       {       SOCK_VECTOR, 0, N_("Normal"), 0, 0, 0, 0, 0, 0, PROP_NONE, SOCK_NO_INTERNAL_LINK},
-       {       -1, 0, ""       }
-};
-
-static void node_shader_exec_texture(void *data, int UNUSED(thread), bNode *node, bNodeExecData *execdata, bNodeStack **in, bNodeStack **out)
-{
-       if (data && node->id) {
-               ShadeInput *shi = ((ShaderCallData *)data)->shi;
-               TexResult texres;
-               bNodeSocket *sock_vector = node->inputs.first;
-               float vec[3], nor[3] = {0.0f, 0.0f, 0.0f};
-               int retval;
-               short which_output = node->custom1;
-
-               short thread = shi->thread;
-
-               /* out: value, color, normal */
-
-               /* we should find out if a normal as output is needed, for now we do all */
-               texres.nor = nor;
-               texres.tr = texres.tg = texres.tb = 0.0f;
-
-               /* don't use in[0]->hasinput, see material node for explanation */
-               if (sock_vector->link) {
-                       nodestack_get_vec(vec, SOCK_VECTOR, in[0]);
-
-                       if (in[0]->datatype == NS_OSA_VECTORS) {
-                               float *fp = in[0]->data;
-                               retval = multitex_nodes((Tex *)node->id, vec, fp, fp + 3, shi->osatex, &texres, thread, which_output, NULL, NULL, NULL);
-                       }
-                       else if (in[0]->datatype == NS_OSA_VALUES) {
-                               const float *fp = in[0]->data;
-                               float dxt[3], dyt[3];
-
-                               dxt[0] = fp[0]; dxt[1] = dxt[2] = 0.0f;
-                               dyt[0] = fp[1]; dyt[1] = dyt[2] = 0.0f;
-                               retval = multitex_nodes((Tex *)node->id, vec, dxt, dyt, shi->osatex, &texres, thread, which_output, NULL, NULL, NULL);
-                       }
-                       else
-                               retval = multitex_nodes((Tex *)node->id, vec, NULL, NULL, 0, &texres, thread, which_output, NULL, NULL, NULL);
-               }
-               else {
-                       copy_v3_v3(vec, shi->lo);
-                       retval = multitex_nodes((Tex *)node->id, vec, NULL, NULL, 0, &texres, thread, which_output, NULL, NULL, NULL);
-               }
-
-               /* stupid exception */
-               if ( ((Tex *)node->id)->type == TEX_STUCCI) {
-                       texres.tin = 0.5f + 0.7f * texres.nor[0];
-                       CLAMP(texres.tin, 0.0f, 1.0f);
-               }
-
-               /* intensity and color need some handling */
-               if (texres.talpha)
-                       out[0]->vec[0] = texres.ta;
-               else
-                       out[0]->vec[0] = texres.tin;
-
-               if ((retval & TEX_RGB) == 0) {
-                       copy_v3_fl(out[1]->vec, out[0]->vec[0]);
-                       out[1]->vec[3] = 1.0f;
-               }
-               else {
-                       copy_v3_v3(out[1]->vec, &texres.tr);
-                       out[1]->vec[3] = 1.0f;
-               }
-
-               copy_v3_v3(out[2]->vec, nor);
-
-               if (shi->do_preview) {
-                       BKE_node_preview_set_pixel(execdata->preview, out[1]->vec, shi->xs, shi->ys, shi->do_manage);
-               }
-
-       }
-}
-
-static int gpu_shader_texture(GPUMaterial *mat, bNode *node, bNodeExecData *UNUSED(execdata), GPUNodeStack *in, GPUNodeStack *out)
-{
-       Tex *tex = (Tex *)node->id;
-
-       if (tex && tex->ima && (tex->type == TEX_IMAGE || tex->type == TEX_ENVMAP)) {
-               if (tex->type == TEX_IMAGE) {
-                       GPUNodeLink *texlink = GPU_image(tex->ima, &tex->iuser, false);
-                       GPU_stack_link(mat, "texture_image", in, out, texlink);
-               }
-               else { /* TEX_ENVMAP */
-                       if (!in[0].link)
-                               in[0].link = GPU_uniform(in[0].vec);
-                       if (!GPU_material_use_world_space_shading(mat))
-                               GPU_link(mat, "direction_transform_m4v3", in[0].link, GPU_builtin(GPU_INVERSE_VIEW_MATRIX), &in[0].link);
-                       GPU_link(mat, "mtex_cube_map_refl_from_refldir",
-                               GPU_cube_map(tex->ima, &tex->iuser, false), in[0].link, &out[0].link, &out[1].link);
-                       GPU_link(mat, "color_to_normal", out[1].link, &out[2].link);
-               }
-
-               ImBuf *ibuf = BKE_image_acquire_ibuf(tex->ima, &tex->iuser, NULL);
-               if (ibuf && (ibuf->colormanage_flag & IMB_COLORMANAGE_IS_DATA) == 0 &&
-                   GPU_material_do_color_management(mat))
-               {
-                       GPU_link(mat, "srgb_to_linearrgb", out[1].link, &out[1].link);
-               }
-               BKE_image_release_ibuf(tex->ima, ibuf, NULL);
-
-               return true;
-       }
-
-       return false;
-}
-
-void register_node_type_sh_texture(void)
-{
-       static bNodeType ntype;
-
-       sh_node_type_base(&ntype, SH_NODE_TEXTURE, "Texture", NODE_CLASS_INPUT, NODE_PREVIEW);
-       node_type_compatibility(&ntype, NODE_OLD_SHADING);
-       node_type_socket_templates(&ntype, sh_node_texture_in, sh_node_texture_out);
-       node_type_exec(&ntype, NULL, NULL, node_shader_exec_texture);
-       node_type_gpu(&ntype, gpu_shader_texture);
-
-       nodeRegisterType(&ntype);
-}
diff --git a/source/blender/render/intern/include/envmap.h b/source/blender/render/intern/include/envmap.h
deleted file mode 100644 (file)
index c66427a..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * envmap_ext.h
- *
- *
- * ***** 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.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/render/intern/include/envmap.h
- *  \ingroup render
- */
-
-
-#ifndef __ENVMAP_H__
-#define __ENVMAP_H__
-
-/**
- * Make environment maps for all objects in the scene that have an
- * environment map as texture.
- * (initrender.c)
- */
-
-struct Render;
-struct TexResult;
-struct ImagePool;
-
-void make_envmaps(struct Render *re);
-int envmaptex(struct Tex *tex, const float texvec[3], float dxt[3], float dyt[3], int osatex, struct TexResult *texres, struct ImagePool *pool, const bool skip_image_load);
-void env_rotate_scene(struct Render *re, float mat[4][4], int do_rotate);
-
-#endif /* __ENVMAP_H__ */
-
diff --git a/source/blender/render/intern/include/pixelblending.h b/source/blender/render/intern/include/pixelblending.h
deleted file mode 100644 (file)
index 022510c..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * ***** 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.
- *
- * Contributor(s): 2004-2006 Blender Foundation, full recode
- *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
- */
-
-/** \file blender/render/intern/include/pixelblending.h
- *  \ingroup render
- */
-
-
-#ifndef __PIXELBLENDING_H__
-#define __PIXELBLENDING_H__
-
-
-/**
- * add 1 pixel to into filtered three lines
- * (float vecs to float vec)
- */
-void add_filt_fmask(unsigned int mask, const float col[4], float *rowbuf, int row_w);
-void add_filt_fmask_pixsize(unsigned int mask, float *in, float *rowbuf, int row_w, int pixsize);
-void add_filt_fmask_coord(float filt[3][3], const float col[4], float *rowbuf, int row_stride, int x, int y, rcti *mask);
-void mask_array(unsigned int mask, float filt[3][3]);
-
-/**
- * Alpha-over blending for floats.
- */
-void addAlphaOverFloat(float dest[4], const float source[4]);
-
-/**
- * Alpha-under blending for floats.
- */
-void addAlphaUnderFloat(float dest[4], const float source[4]);
-
-
-/**
- * Same for floats
- */
-void addalphaAddfacFloat(float dest[4], const float source[4], char addfac);
-
-/**
- * dest = dest + source
- */
-void addalphaAddFloat(float dest[4], const float source[4]);
-
-#endif /* __PIXELBLENDING_H__ */
diff --git a/source/blender/render/intern/include/pixelshading.h b/source/blender/render/intern/include/pixelshading.h
deleted file mode 100644 (file)
index 0e630ed..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * ***** 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.
- *
- * Contributor(s): 2004-2006, Blender Foundation, full recode
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/render/intern/include/pixelshading.h
- *  \ingroup render
- *
- * These functions determine what actual color a pixel will have.
- */
-
-#ifndef __PIXELSHADING_H__
-#define __PIXELSHADING_H__
-
-
-/**
- * Render the pixel at (x,y) for object ap. Apply the jitter mask.
- * Output is given in float collector[4]. The type vector:
- * t[0] - min. distance
- * t[1] - face/halo index
- * t[2] - jitter mask
- * t[3] - type ZB_POLY or ZB_HALO
- * t[4] - max. distance
- * mask is pixel coverage in bits
- * \return pointer to the object
- */
-int shadeHaloFloat(HaloRen *har,
-                   float *col, int zz,
-                   float dist, float xn,
-                   float yn, short flarec);
-
-/**
- * Render the sky at pixel (x, y).
- */
-void shadeSkyPixel(float collector[4], float fx, float fy, short thread);
-void shadeSkyView(float col_r[3], const float rco[3], const float view[3], const float dxyview[2], short thread);
-void shadeAtmPixel(struct SunSky *sunsky, float *collector, float fx, float fy, float distance);
-void shadeSunView(float col_r[3], const float view[3]);
-/* ------------------------------------------------------------------------- */
-
-#endif
-
diff --git a/source/blender/render/intern/include/pointdensity.h b/source/blender/render/intern/include/pointdensity.h
deleted file mode 100644 (file)
index eadf714..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * ***** 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.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): Matt Ebb
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/render/intern/include/pointdensity.h
- *  \ingroup render
- */
-
-
-#ifndef __POINTDENSITY_H__
-#define __POINTDENSITY_H__
-
-/**
- * Make point density kd-trees for all point density textures in the scene
- */
-
-struct PointDensity;
-struct Render;
-struct TexResult;
-
-void free_pointdensity(struct PointDensity *pd);
-void cache_pointdensity(struct Render *re, struct PointDensity *pd);
-void make_pointdensities(struct Render *re);
-void free_pointdensities(struct Render *re);
-int pointdensitytex(struct Tex *tex, const float texvec[3], struct TexResult *texres);
-
-#endif /* __POINTDENSITY_H__ */
-
diff --git a/source/blender/render/intern/include/raycounter.h b/source/blender/render/intern/include/raycounter.h
deleted file mode 100644 (file)
index e16c6e1..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * ***** 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) 2009 Blender Foundation.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): André Pinto.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/render/intern/include/raycounter.h
- *  \ingroup render
- */
-
-
-#ifndef __RAYCOUNTER_H__
-#define __RAYCOUNTER_H__
-
-//#define RE_RAYCOUNTER                        /* enable counters per ray, useful for measuring raytrace structures performance */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef RE_RAYCOUNTER
-
-/* ray counter functions */
-
-typedef struct RayCounter {
-       struct {
-               unsigned long long test, hit;
-       } faces, bb, simd_bb, raycast, raytrace_hint, rayshadow_last_hit;
-} RayCounter;
-
-#define RE_RC_INIT(isec, shi) (isec).raycounter = &((shi).shading.raycounter)
-void RE_RC_INFO(RayCounter *rc);
-void RE_RC_MERGE(RayCounter *rc, RayCounter *tmp);
-#define RE_RC_COUNT(var) (var)++
-
-extern RayCounter re_rc_counter[];
-
-#else
-
-/* ray counter stubs */
-
-#define RE_RC_INIT(isec,shi)
-#define RE_RC_INFO(rc)
-#define RE_RC_MERGE(dest,src)
-#define        RE_RC_COUNT(var)
-
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/source/blender/render/intern/include/rayintersection.h b/source/blender/render/intern/include/rayintersection.h
deleted file mode 100644 (file)
index a303301..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * ***** 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) 2007 Blender Foundation.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): André Pinto.
- *
- * ***** END GPL LICENSE BLOCK *****
- * RE_raytrace.h: ray tracing api, can be used independently from the renderer.
- */
-
-/** \file blender/render/intern/include/rayintersection.h
- *  \ingroup render
- */
-
-
-#ifndef __RAYINTERSECTION_H__
-#define __RAYINTERSECTION_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "BLI_math_geom.h"
-
-struct RayObject;
-
-/* Ray Hints */
-
-#define RE_RAY_LCTS_MAX_SIZE   256
-#define RT_USE_LAST_HIT                        /* last shadow hit is reused before raycasting on whole tree */
-//#define RT_USE_HINT                  /* last hit object is reused before raycasting on whole tree */
-
-typedef struct LCTSHint {
-       int size;
-       struct RayObject *stack[RE_RAY_LCTS_MAX_SIZE];
-} LCTSHint;
-
-typedef struct RayHint {
-       union { LCTSHint lcts; } data;
-} RayHint;
-
-/* Ray Intersection */
-
-typedef struct Isect {
-       /* ray start, direction (normalized vector), and max distance. on hit,
-        * the distance is modified to be the distance to the hit point. */
-       float start[3];
-       float dir[3];
-       float dist;
-
-       /* for envmap and incremental view update renders */
-       float origstart[3];
-       float origdir[3];
-
-       /* precomputed values to accelerate bounding box intersection */
-       int bv_index[6];
-       float idot_axis[3];
-
-       /* intersection options */
-       int mode;                               /* RE_RAY_SHADOW, RE_RAY_MIRROR, RE_RAY_SHADOW_TRA */
-       int lay;                                /* -1 default, set for layer lamps */
-       int skip;                               /* skip flags */
-       int check;                              /* check flags */
-       void *userdata;                 /* used by bake check */
-
-       /* hit information */
-       float u, v;
-       int isect;                              /* which half of quad */
-
-       struct {
-               void *ob;
-               void *face;
-       } hit, orig;
-
-       /* last hit optimization */
-       struct RayObject *last_hit;
-
-       /* hints */
-#ifdef RT_USE_HINT
-       RayTraceHint *hint, *hit_hint;
-#endif
-       RayHint *hint;
-
-       /* ray counter */
-#ifdef RE_RAYCOUNTER
-       RayCounter *raycounter;
-#endif
-
-       /* Precalculated coefficients for watertight intersection check. */
-       struct IsectRayPrecalc isect_precalc;
-} Isect;
-
-/* ray types */
-#define RE_RAY_SHADOW 0
-#define RE_RAY_MIRROR 1
-#define RE_RAY_SHADOW_TRA 2
-
-/* skip options */
-#define RE_SKIP_CULLFACE                (1 << 0)
-/* if using this flag then *face should be a pointer to a VlakRen */
-#define RE_SKIP_VLR_NEIGHBOUR           (1 << 1)
-
-/* check options */
-#define RE_CHECK_VLR_NONE               0
-#define RE_CHECK_VLR_RENDER             1
-#define RE_CHECK_VLR_NON_SOLID_MATERIAL 2
-#define RE_CHECK_VLR_BAKE               3
-
-/* arbitrary, but can't use e.g. FLT_MAX because of precision issues */
-#define RE_RAYTRACE_MAXDIST    1e15f
-#define RE_RAYTRACE_EPSILON 0.0f
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __RAYINTERSECTION_H__ */
-
diff --git a/source/blender/render/intern/include/rendercore.h b/source/blender/render/intern/include/rendercore.h
deleted file mode 100644 (file)
index aa3efca..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * ***** 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.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#ifndef __RENDERCORE_H__
-#define __RENDERCORE_H__
-
-/** \file blender/render/intern/include/rendercore.h
- *  \ingroup render
- */
-
-#include "render_types.h"
-
-#include "RE_engine.h"
-
-#include "DNA_node_types.h"
-
-#include "NOD_composite.h"
-
-struct ShadeInput;
-struct ShadeResult;
-struct World;
-struct RenderPart;
-struct RenderLayer;
-struct RayObject;
-
-/* ------------------------------------------------------------------------- */
-
-typedef struct PixStr {
-       struct PixStr *next;
-       int obi, facenr, z, maskz;
-       unsigned short mask;
-       short shadfac;
-} PixStr;
-
-typedef struct PixStrMain {
-       struct PixStrMain *next, *prev;
-       struct PixStr *ps;
-       int counter;
-} PixStrMain;
-
-/* ------------------------------------------------------------------------- */
-
-
-void   calc_view_vector(float view[3], float x, float y);
-float   mistfactor(float zcor, const float co[3]); /* dist and height, return alpha */
-
-void   renderspothalo(struct ShadeInput *shi, float col[4], float alpha);
-void   add_halo_flare(Render *re);
-
-void calc_renderco_zbuf(float co[3], const float view[3], int z);
-void calc_renderco_ortho(float co[3], float x, float y, int z);
-
-int count_mask(unsigned short mask);
-
-void zbufshade_tile(struct RenderPart *pa);
-void zbufshadeDA_tile(struct RenderPart *pa);
-
-void zbufshade_sss_tile(struct RenderPart *pa);
-
-int get_sample_layers(struct RenderPart *pa, struct RenderLayer *rl, struct RenderLayer **rlpp);
-
-void render_internal_update_passes(struct RenderEngine *engine, struct Scene *scene, struct SceneRenderLayer *srl);
-
-
-/* -------- ray.c ------- */
-
-struct RayObject *RE_rayobject_create(int type, int size, int octree_resolution);
-
-extern void freeraytree(Render *re);
-extern void makeraytree(Render *re);
-struct RayObject* makeraytree_object(Render *re, ObjectInstanceRen *obi);
-
-extern void ray_shadow(ShadeInput *shi, LampRen *lar, float shadfac[4]);
-extern void ray_trace(ShadeInput *shi, ShadeResult *);
-extern void ray_ao(ShadeInput *shi, float ao[3], float env[3]);
-extern void init_jitter_plane(LampRen *lar);
-extern void init_ao_sphere(Render *re, struct World *wrld);
-extern void init_render_qmcsampler(Render *re);
-extern void free_render_qmcsampler(Render *re);
-
-#endif  /* __RENDERCORE_H__ */
diff --git a/source/blender/render/intern/include/shading.h b/source/blender/render/intern/include/shading.h
deleted file mode 100644 (file)
index e306c3c..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * ***** 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) 2006 Blender Foundation
- * All rights reserved.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/render/intern/include/shading.h
- *  \ingroup render
- */
-
-
-struct ShadeInput;
-struct ShadeResult;
-struct RenderPart;
-struct RenderLayer;
-struct PixStr;
-struct LampRen;
-struct VlakRen;
-struct StrandPoint;
-struct ObjectInstanceRen;
-struct Isect;
-
-/* shadeinput.c */
-
-#define RE_MAX_OSA 16
-
-/* needed to calculate shadow and AO for an entire pixel */
-typedef struct ShadeSample {
-       int tot;                                                /* amount of shi in use, can be 1 for not FULL_OSA */
-
-       RenderLayer *rlpp[RE_MAX_OSA];  /* fast lookup from sample to renderlayer (fullsample buf) */
-
-       /* could be malloced once */
-       ShadeInput shi[RE_MAX_OSA];
-       ShadeResult shr[RE_MAX_OSA];
-} ShadeSample;
-
-
-       /* also the node shader callback */
-void shade_material_loop(struct ShadeInput *shi, struct ShadeResult *shr);
-
-void shade_input_set_triangle_i(struct ShadeInput *shi, struct ObjectInstanceRen *obi, struct VlakRen *vlr, short i1, short i2, short i3);
-void shade_input_set_triangle(struct ShadeInput *shi, int obi, int facenr, int normal_flip);
-void shade_input_copy_triangle(struct ShadeInput *shi, struct ShadeInput *from);
-void shade_input_calc_viewco(struct ShadeInput *shi, float x, float y, float z, float view[3], float dxyview[2], float co[3], float dxco[3], float dyco[3]);
-void shade_input_set_viewco(struct ShadeInput *shi, float x, float y, float sx, float sy, float z);
-void shade_input_set_uv(struct ShadeInput *shi);
-void shade_input_set_normals(struct ShadeInput *shi);
-void shade_input_set_vertex_normals(struct ShadeInput *shi);
-void shade_input_flip_normals(struct ShadeInput *shi);
-void shade_input_set_shade_texco(struct ShadeInput *shi);
-void shade_input_set_strand(struct ShadeInput *shi, struct StrandRen *strand, struct StrandPoint *spoint);
-void shade_input_set_strand_texco(struct ShadeInput *shi, struct StrandRen *strand, struct StrandVert *svert, struct StrandPoint *spoint);
-void shade_input_do_shade(struct ShadeInput *shi, struct ShadeResult *shr);
-
-void shade_input_init_material(struct ShadeInput *shi);
-void shade_input_initialize(struct ShadeInput *shi, struct RenderPart *pa, struct RenderLayer *rl, int sample);
-
-void shade_sample_initialize(struct ShadeSample *ssamp, struct RenderPart *pa, struct RenderLayer *rl);
-void shade_samples_do_AO(struct ShadeSample *ssamp);
-void shade_samples_fill_with_ps(struct ShadeSample *ssamp, struct PixStr *ps, int x, int y);
-int shade_samples(struct ShadeSample *ssamp, struct PixStr *ps, int x, int y);
-
-void vlr_set_uv_indices(struct VlakRen *vlr, int *i1, int *i2, int *i3);
-
-void   calc_R_ref(struct ShadeInput *shi);
-
-void barycentric_differentials_from_position(
-       const float co[3], const float v1[3], const float v2[3], const float v3[3],
-       const float dxco[3], const float dyco[3], const float facenor[3], const bool differentials,
-       float *u, float *v, float *dx_u, float *dx_v, float *dy_u, float *dy_v);
-
-/* shadeoutput. */
-void shade_lamp_loop(struct ShadeInput *shi, struct ShadeResult *shr);
-
-void shade_color(struct ShadeInput *shi, ShadeResult *shr);
-
-void ambient_occlusion(struct ShadeInput *shi);
-void environment_lighting_apply(struct ShadeInput *shi, struct ShadeResult *shr);
-
-ListBase *get_lights(struct ShadeInput *shi);
-float lamp_get_visibility(struct LampRen *lar, const float co[3], float lv[3], float *dist);
-void lamp_get_shadow(struct LampRen *lar, ShadeInput *shi, float inp, float shadfac[4], int do_real);
-
-float fresnel_fac(const float view[3], const float vn[3], float fresnel, float fac);
-
-/* rayshade.c */
-extern void shade_ray(struct Isect *is, struct ShadeInput *shi, struct ShadeResult *shr);
diff --git a/source/blender/render/intern/include/strand.h b/source/blender/render/intern/include/strand.h
deleted file mode 100644 (file)
index f4e22c7..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * ***** 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.
- *
- * Contributor(s): Brecht Van Lommel.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/render/intern/include/strand.h
- *  \ingroup render
- */
-
-
-#ifndef __STRAND_H__
-#define __STRAND_H__
-
-struct StrandVert;
-struct StrandRen;
-struct StrandBuffer;
-struct ShadeSample;
-struct StrandPart;
-struct Render;
-struct ZSpan;
-struct ObjectInstanceRen;
-struct StrandSurface;
-struct DerivedMesh;
-struct ObjectRen;
-
-typedef struct StrandPoint {
-       /* position within segment */
-       float t;
-
-       /* camera space */
-       float co[3];
-       float nor[3];
-       float tan[3];
-       float strandco;
-       float width;
-
-       /* derivatives */
-       float dtco[3], dsco[3];
-       float dtstrandco;
-
-       /* outer points */
-       float co1[3], co2[3];
-       float hoco1[4], hoco2[4];
-       float zco1[3], zco2[3];
-       int clip1, clip2;
-
-       /* screen space */
-       float hoco[4];
-       float x, y;
-
-       /* simplification */
-       float alpha;
-} StrandPoint;
-
-typedef struct StrandSegment {
-       struct StrandVert *v[4];
-       struct StrandRen *strand;
-       struct StrandBuffer *buffer;
-       struct ObjectInstanceRen *obi;
-       float sqadaptcos;
-
-       StrandPoint point1, point2;
-       int shaded;
-} StrandSegment;
-
-struct StrandShadeCache;
-typedef struct StrandShadeCache StrandShadeCache;
-
-void strand_eval_point(StrandSegment *sseg, StrandPoint *spoint);
-void render_strand_segment(struct Render *re, float winmat[4][4], struct StrandPart *spart, struct ZSpan *zspan, int totzspan, StrandSegment *sseg);
-void strand_minmax(struct StrandRen *strand, float min[3], float max[3], const float width);
-
-struct StrandSurface *cache_strand_surface(struct Render *re, struct ObjectRen *obr, struct DerivedMesh *dm, float mat[4][4], int timeoffset);
-void free_strand_surface(struct Render *re);
-
-struct StrandShadeCache *strand_shade_cache_create(void);
-void strand_shade_cache_free(struct StrandShadeCache *cache);
-void strand_shade_segment(struct Render *re, struct StrandShadeCache *cache, struct StrandSegment *sseg, struct ShadeSample *ssamp, float t, float s, int addpassflag);
-void strand_shade_unref(struct StrandShadeCache *cache, struct ObjectInstanceRen *obi, struct StrandVert *svert);
-
-#endif
-
diff --git a/source/blender/render/intern/include/sunsky.h b/source/blender/render/intern/include/sunsky.h
deleted file mode 100644 (file)
index c608f9f..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * ***** 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.
- *
- * Contributor(s): zaghaghi
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/render/intern/include/sunsky.h
- *  \ingroup render
- */
-
-#ifndef __SUNSKY_H__
-#define __SUNSKY_H__
-
-// #define SPECTRUM_MAX_COMPONENTS     100
-
-typedef struct SunSky {
-       short effect_type, skyblendtype, sky_colorspace;
-       float turbidity;
-       float theta, phi;
-
-       float toSun[3];
-
-       /*float sunSpectralRaddata[SPECTRUM_MAX_COMPONENTS];*/
-       float sunSolidAngle;
-
-       float zenith_Y, zenith_x, zenith_y;
-
-       float perez_Y[5], perez_x[5], perez_y[5];
-
-       /* suggested by glome in patch [#8063] */
-       float horizon_brightness;
-       float spread;
-       float sun_brightness;
-       float sun_size;
-       float backscattered_light;
-       float skyblendfac;
-       float sky_exposure;
-
-       float atm_HGg;
-
-       float atm_SunIntensity;
-       float atm_InscatteringMultiplier;
-       float atm_ExtinctionMultiplier;
-       float atm_BetaRayMultiplier;
-       float atm_BetaMieMultiplier;
-       float atm_DistanceMultiplier;
-
-       float atm_BetaRay[3];
-       float atm_BetaDashRay[3];
-       float atm_BetaMie[3];
-       float atm_BetaDashMie[3];
-       float atm_BetaRM[3];
-} SunSky;
-
-void InitSunSky(struct SunSky *sunsky, float turb, const float toSun[3], float horizon_brightness,
-                float spread, float sun_brightness, float sun_size, float back_scatter,
-                float skyblendfac, short skyblendtype, float sky_exposure, float sky_colorspace);
-
-void GetSkyXYZRadiance(struct SunSky *sunsky, float theta, float phi, float color_out[3]);
-void GetSkyXYZRadiancef(struct SunSky *sunsky, const float varg[3], float color_out[3]);
-void InitAtmosphere(struct SunSky *sunSky, float sun_intens, float mief, float rayf, float inscattf, float extincf, float disf);
-void AtmospherePixleShader(struct SunSky *sunSky, float view[3], float s, float rgb[3]);
-void ClipColor(float c[3]);
-
-#endif /*__SUNSKY_H__*/
diff --git a/source/blender/render/intern/include/texture_ocean.h b/source/blender/render/intern/include/texture_ocean.h
deleted file mode 100644 (file)
index 6d7bc6f..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * ***** 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 *****
- */
-
-#ifndef __TEXTURE_OCEAN_H__
-#define __TEXTURE_OCEAN_H__
-
-/** \file blender/render/intern/include/texture_ocean.h
- *  \ingroup render
- */
-
-int ocean_texture(struct Tex *tex, const float texvec[2], struct TexResult *texres);
-
-#endif  /* __TEXTURE_OCEAN_H__ */
diff --git a/source/blender/render/intern/include/voxeldata.h b/source/blender/render/intern/include/voxeldata.h
deleted file mode 100644 (file)
index 041ca78..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * ***** 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.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): Raul Fernandez Hernandez (Farsthary), Matt Ebb.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/render/intern/include/voxeldata.h
- *  \ingroup render
- */
-
-#ifndef __VOXELDATA_H__
-#define __VOXELDATA_H__
-
-struct Render;
-struct TexResult;
-
-typedef struct VoxelDataHeader {
-       int resolX, resolY, resolZ;
-       int frames;
-} VoxelDataHeader;
-
-void cache_voxeldata(Tex *tex, int scene_frame);
-void make_voxeldata(struct Render *re);
-int  voxeldatatex(struct Tex *tex, const float texvec[3], struct TexResult *texres);
-
-#endif /* __VOXELDATA_H__ */
diff --git a/source/blender/render/intern/raytrace/bvh.h b/source/blender/render/intern/raytrace/bvh.h
deleted file mode 100644 (file)
index 0f9a506..0000000
+++ /dev/null
@@ -1,407 +0,0 @@
-/*
- * ***** 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) 2009 Blender Foundation.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): André Pinto.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/render/intern/raytrace/bvh.h
- *  \ingroup render
- */
-
-
-#include "MEM_guardedalloc.h"
-
-#include "BLI_math.h"
-
-#include "raycounter.h"
-#include "rayintersection.h"
-#include "rayobject.h"
-#include "rayobject_hint.h"
-#include "rayobject_rtbuild.h"
-
-#include <assert.h>
-
-#ifdef __SSE__
-#include <xmmintrin.h>
-#endif
-
-#ifndef __BVH_H__
-#define __BVH_H__
-
-#ifdef __SSE__
-inline int test_bb_group4(__m128 *bb_group, const Isect *isec)
-{
-       const __m128 tmin0 = _mm_setzero_ps();
-       const __m128 tmax0 = _mm_set_ps1(isec->dist);
-
-       float start[3], idot_axis[3];
-       copy_v3_v3(start, isec->start);
-       copy_v3_v3(idot_axis, isec->idot_axis);
-
-       const __m128 tmin1 = _mm_max_ps(tmin0, _mm_mul_ps(_mm_sub_ps(bb_group[isec->bv_index[0]], _mm_set_ps1(start[0]) ), _mm_set_ps1(idot_axis[0])) );
-       const __m128 tmax1 = _mm_min_ps(tmax0, _mm_mul_ps(_mm_sub_ps(bb_group[isec->bv_index[1]], _mm_set_ps1(start[0]) ), _mm_set_ps1(idot_axis[0])) );
-       const __m128 tmin2 = _mm_max_ps(tmin1, _mm_mul_ps(_mm_sub_ps(bb_group[isec->bv_index[2]], _mm_set_ps1(start[1]) ), _mm_set_ps1(idot_axis[1])) );
-       const __m128 tmax2 = _mm_min_ps(tmax1, _mm_mul_ps(_mm_sub_ps(bb_group[isec->bv_index[3]], _mm_set_ps1(start[1]) ), _mm_set_ps1(idot_axis[1])) );
-       const __m128 tmin3 = _mm_max_ps(tmin2, _mm_mul_ps(_mm_sub_ps(bb_group[isec->bv_index[4]], _mm_set_ps1(start[2]) ), _mm_set_ps1(idot_axis[2])) );
-       const __m128 tmax3 = _mm_min_ps(tmax2, _mm_mul_ps(_mm_sub_ps(bb_group[isec->bv_index[5]], _mm_set_ps1(start[2]) ), _mm_set_ps1(idot_axis[2])) );
-
-       return _mm_movemask_ps(_mm_cmpge_ps(tmax3, tmin3));
-}
-#endif
-
-/*
- * Determines the distance that the ray must travel to hit the bounding volume of the given node
- * Based on Tactical Optimization of Ray/Box Intersection, by Graham Fyffe
- *  [http://tog.acm.org/resources/RTNews/html/rtnv21n1.html#art9]
- */
-static inline int rayobject_bb_intersect_test(const Isect *isec, const float *_bb)
-{
-       const float *bb = _bb;
-
-       float t1x = (bb[isec->bv_index[0]] - isec->start[0]) * isec->idot_axis[0];
-       float t2x = (bb[isec->bv_index[1]] - isec->start[0]) * isec->idot_axis[0];
-       float t1y = (bb[isec->bv_index[2]] - isec->start[1]) * isec->idot_axis[1];
-       float t2y = (bb[isec->bv_index[3]] - isec->start[1]) * isec->idot_axis[1];
-       float t1z = (bb[isec->bv_index[4]] - isec->start[2]) * isec->idot_axis[2];
-       float t2z = (bb[isec->bv_index[5]] - isec->start[2]) * isec->idot_axis[2];
-
-       RE_RC_COUNT(isec->raycounter->bb.test);
-
-       if (t1x > t2y  || t2x < t1y  || t1x > t2z || t2x < t1z || t1y > t2z || t2y < t1z) return 0;
-       if (t2x < 0.0f || t2y < 0.0f || t2z < 0.0f) return 0;
-       if (t1x > isec->dist || t1y > isec->dist || t1z > isec->dist) return 0;
-       RE_RC_COUNT(isec->raycounter->bb.hit);
-
-       return 1;
-}
-
-/* bvh tree generics */
-template<class Tree> static void bvh_add(Tree *obj, RayObject *ob)
-{
-       rtbuild_add(obj->builder, ob);
-}
-
-template<class Node>
-inline bool is_leaf(Node *node)
-{
-       return !RE_rayobject_isAligned(node);
-}
-
-template<class Tree> static void bvh_done(Tree *obj);
-
-template<class Tree>
-static void bvh_free(Tree *obj)
-{
-       if (obj->builder)
-               rtbuild_free(obj->builder);
-
-       if (obj->node_arena)
-               BLI_memarena_free(obj->node_arena);
-
-       MEM_freeN(obj);
-}
-
-template<class Tree>
-static void bvh_bb(Tree *obj, float *min, float *max)
-{
-       if (obj->root)
-               bvh_node_merge_bb(obj->root, min, max);
-}
-
-
-template<class Tree>
-static float bvh_cost(Tree *obj)
-{
-       assert(obj->cost >= 0.0f);
-       return obj->cost;
-}
-
-
-
-/* bvh tree nodes generics */
-template<class Node> static inline int bvh_node_hit_test(Node *node, Isect *isec)
-{
-       return rayobject_bb_intersect_test(isec, (const float *)node->bb);
-}
-
-
-template<class Node>
-static inline void bvh_node_merge_bb(Node *node, float min[3], float max[3])
-{
-       if (is_leaf(node)) {
-               RE_rayobject_merge_bb((RayObject *)node, min, max);
-       }
-       else {
-               DO_MIN(node->bb,     min);
-               DO_MAX(node->bb + 3, max);
-       }
-}
-
-
-
-/*
- * recursively transverse a BVH looking for a rayhit using a local stack
- */
-template<class Node> static inline void bvh_node_push_childs(Node *node, Isect *isec, Node **stack, int &stack_pos);
-
-template<class Node, int MAX_STACK_SIZE, bool TEST_ROOT, bool SHADOW>
-static int bvh_node_stack_raycast(Node *root, Isect *isec)
-{
-       Node *stack[MAX_STACK_SIZE];
-       int hit = 0, stack_pos = 0;
-
-       if (!TEST_ROOT && !is_leaf(root))
-               bvh_node_push_childs(root, isec, stack, stack_pos);
-       else
-               stack[stack_pos++] = root;
-
-       while (stack_pos) {
-               Node *node = stack[--stack_pos];
-               if (!is_leaf(node)) {
-                       if (bvh_node_hit_test(node, isec)) {
-                               bvh_node_push_childs(node, isec, stack, stack_pos);
-                               assert(stack_pos <= MAX_STACK_SIZE);
-                       }
-               }
-               else {
-                       hit |= RE_rayobject_intersect( (RayObject *)node, isec);
-                       if (SHADOW && hit) return hit;
-               }
-       }
-       return hit;
-}
-
-
-#ifdef __SSE__
-/*
- * Generic SIMD bvh recursion
- * this was created to be able to use any simd (with the cost of some memmoves)
- * it can take advantage of any SIMD width and doens't needs any special tree care
- */
-template<class Node, int MAX_STACK_SIZE, bool TEST_ROOT>
-static int bvh_node_stack_raycast_simd(Node *root, Isect *isec)
-{
-       Node *stack[MAX_STACK_SIZE];
-
-       int hit = 0, stack_pos = 0;
-
-       if (!TEST_ROOT) {
-               if (!is_leaf(root)) {
-                       if (!is_leaf(root->child))
-                               bvh_node_push_childs(root, isec, stack, stack_pos);
-                       else
-                               return RE_rayobject_intersect( (RayObject *)root->child, isec);
-               }
-               else
-                       return RE_rayobject_intersect( (RayObject *)root, isec);
-       }
-       else {
-               if (!is_leaf(root))
-                       stack[stack_pos++] = root;
-               else
-                       return RE_rayobject_intersect( (RayObject *)root, isec);
-       }
-
-       while (true) {
-               //Use SIMD 4
-               if (stack_pos >= 4) {
-                       __m128 t_bb[6];
-                       Node *t_node[4];
-
-                       stack_pos -= 4;
-
-                       /* prepare the 4BB for SIMD */
-                       t_node[0] = stack[stack_pos + 0]->child;
-                       t_node[1] = stack[stack_pos + 1]->child;
-                       t_node[2] = stack[stack_pos + 2]->child;
-                       t_node[3] = stack[stack_pos + 3]->child;
-
-                       const float *bb0 = stack[stack_pos + 0]->bb;
-                       const float *bb1 = stack[stack_pos + 1]->bb;
-                       const float *bb2 = stack[stack_pos + 2]->bb;
-                       const float *bb3 = stack[stack_pos + 3]->bb;
-
-                       const __m128 x0y0x1y1 = _mm_shuffle_ps(_mm_load_ps(bb0), _mm_load_ps(bb1), _MM_SHUFFLE(1, 0, 1, 0) );
-                       const __m128 x2y2x3y3 = _mm_shuffle_ps(_mm_load_ps(bb2), _mm_load_ps(bb3), _MM_SHUFFLE(1, 0, 1, 0) );
-                       t_bb[0] = _mm_shuffle_ps(x0y0x1y1, x2y2x3y3, _MM_SHUFFLE(2, 0, 2, 0) );
-                       t_bb[1] = _mm_shuffle_ps(x0y0x1y1, x2y2x3y3, _MM_SHUFFLE(3, 1, 3, 1) );
-
-                       const __m128 z0X0z1X1 = _mm_shuffle_ps(_mm_load_ps(bb0), _mm_load_ps(bb1), _MM_SHUFFLE(3, 2, 3, 2) );
-                       const __m128 z2X2z3X3 = _mm_shuffle_ps(_mm_load_ps(bb2), _mm_load_ps(bb3), _MM_SHUFFLE(3, 2, 3, 2) );
-                       t_bb[2] = _mm_shuffle_ps(z0X0z1X1, z2X2z3X3, _MM_SHUFFLE(2, 0, 2, 0) );
-                       t_bb[3] = _mm_shuffle_ps(z0X0z1X1, z2X2z3X3, _MM_SHUFFLE(3, 1, 3, 1) );
-
-                       const __m128 Y0Z0Y1Z1 = _mm_shuffle_ps(_mm_load_ps(bb0 + 4), _mm_load_ps(bb1 + 4), _MM_SHUFFLE(1, 0, 1, 0) );
-                       const __m128 Y2Z2Y3Z3 = _mm_shuffle_ps(_mm_load_ps(bb2 + 4), _mm_load_ps(bb3 + 4), _MM_SHUFFLE(1, 0, 1, 0) );
-                       t_bb[4] = _mm_shuffle_ps(Y0Z0Y1Z1, Y2Z2Y3Z3, _MM_SHUFFLE(2, 0, 2, 0) );
-                       t_bb[5] = _mm_shuffle_ps(Y0Z0Y1Z1, Y2Z2Y3Z3, _MM_SHUFFLE(3, 1, 3, 1) );
-#if 0
-                       for (int i = 0; i < 4; i++)
-                       {
-                               Node *t = stack[stack_pos + i];
-                               assert(!is_leaf(t));
-
-                               float *bb = ((float *)t_bb) + i;
-                               bb[4 * 0] = t->bb[0];
-                               bb[4 * 1] = t->bb[1];
-                               bb[4 * 2] = t->bb[2];
-                               bb[4 * 3] = t->bb[3];
-                               bb[4 * 4] = t->bb[4];
-                               bb[4 * 5] = t->bb[5];
-                               t_node[i] = t->child;
-                       }
-#endif
-                       RE_RC_COUNT(isec->raycounter->simd_bb.test);
-                       int res = test_bb_group4(t_bb, isec);
-
-                       for (int i = 0; i < 4; i++)
-                               if (res & (1 << i)) {
-                                       RE_RC_COUNT(isec->raycounter->simd_bb.hit);
-                                       if (!is_leaf(t_node[i])) {
-                                               for (Node *t = t_node[i]; t; t = t->sibling) {
-                                                       assert(stack_pos < MAX_STACK_SIZE);
-                                                       stack[stack_pos++] = t;
-                                               }
-                                       }
-                                       else {
-                                               hit |= RE_rayobject_intersect( (RayObject *)t_node[i], isec);
-                                               if (hit && isec->mode == RE_RAY_SHADOW) return hit;
-                                       }
-                               }
-               }
-               else if (stack_pos > 0) {
-                       Node *node = stack[--stack_pos];
-                       assert(!is_leaf(node));
-
-                       if (bvh_node_hit_test(node, isec)) {
-                               if (!is_leaf(node->child)) {
-                                       bvh_node_push_childs(node, isec, stack, stack_pos);
-                                       assert(stack_pos <= MAX_STACK_SIZE);
-                               }
-                               else {
-                                       hit |= RE_rayobject_intersect( (RayObject *)node->child, isec);
-                                       if (hit && isec->mode == RE_RAY_SHADOW) return hit;
-                               }
-                       }
-               }
-               else break;
-       }
-       return hit;
-}
-#endif
-
-/*
- * recursively transverse a BVH looking for a rayhit using system stack
- */
-#if 0
-template<class Node>
-static int bvh_node_raycast(Node *node, Isect *isec)
-{
-       int hit = 0;
-       if (bvh_test_node(node, isec))
-       {
-               if (isec->idot_axis[node->split_axis] > 0.0f)
-               {
-                       int i;
-                       for (i = 0; i < BVH_NCHILDS; i++)
-                               if (!is_leaf(node->child[i]))
-                               {
-                                       if (node->child[i] == 0) break;
-
-                                       hit |= bvh_node_raycast(node->child[i], isec);
-                                       if (hit && isec->mode == RE_RAY_SHADOW) return hit;
-                               }
-                               else {
-                                       hit |= RE_rayobject_intersect( (RayObject *)node->child[i], isec);
-                                       if (hit && isec->mode == RE_RAY_SHADOW) return hit;
-                               }
-               }
-               else {
-                       int i;
-                       for (i = BVH_NCHILDS - 1; i >= 0; i--)
-                               if (!is_leaf(node->child[i]))
-                               {
-                                       if (node->child[i])
-                                       {
-                                               hit |= dfs_raycast(node->child[i], isec);
-                                               if (hit && isec->mode == RE_RAY_SHADOW) return hit;
-                                       }
-                               }
-                               else {
-                                       hit |= RE_rayobject_intersect( (RayObject *)node->child[i], isec);
-                                       if (hit && isec->mode == RE_RAY_SHADOW) return hit;
-                               }
-               }
-       }
-       return hit;
-}
-#endif
-
-template<class Node, class HintObject>
-static void bvh_dfs_make_hint(Node *node, LCTSHint *hint, int reserve_space, HintObject *hintObject)
-{
-       assert(hint->size + reserve_space + 1 <= RE_RAY_LCTS_MAX_SIZE);
-
-       if (is_leaf(node)) {
-               hint->stack[hint->size++] = (RayObject *)node;
-       }
-       else {
-               int childs = count_childs(node);
-               if (hint->size + reserve_space + childs <= RE_RAY_LCTS_MAX_SIZE) {
-                       int result = hint_test_bb(hintObject, node->bb, node->bb + 3);
-                       if (result == HINT_RECURSE) {
-                               /* We are 100% sure the ray will be pass inside this node */
-                               bvh_dfs_make_hint_push_siblings(node->child, hint, reserve_space, hintObject);
-                       }
-                       else if (result == HINT_ACCEPT) {
-                               hint->stack[hint->size++] = (RayObject *)node;
-                       }
-               }
-               else {
-                       hint->stack[hint->size++] = (RayObject *)node;
-               }
-       }
-}
-
-
-template<class Tree>
-static RayObjectAPI *bvh_get_api(int maxstacksize);
-
-
-template<class Tree, int DFS_STACK_SIZE>
-static inline RayObject *bvh_create_tree(int size)
-{
-       Tree *obj = (Tree *)MEM_callocN(sizeof(Tree), "BVHTree");
-       assert(RE_rayobject_isAligned(obj)); /* RayObject API assumes real data to be 4-byte aligned */
-
-       obj->rayobj.api = bvh_get_api<Tree>(DFS_STACK_SIZE);
-       obj->root = NULL;
-
-       obj->node_arena = NULL;
-       obj->builder    = rtbuild_create(size);
-
-       return RE_rayobject_unalignRayAPI((RayObject *) obj);
-}
-
-#endif
diff --git a/source/blender/render/intern/raytrace/rayobject.cpp b/source/blender/render/intern/raytrace/rayobject.cpp
deleted file mode 100644 (file)
index fee877b..0000000
+++ /dev/null
@@ -1,534 +0,0 @@
-/*
- * ***** 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) 2009 Blender Foundation.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): André Pinto.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/render/intern/raytrace/rayobject.cpp
- *  \ingroup render
- */
-
-
-#include <assert.h>
-
-#include "MEM_guardedalloc.h"
-
-#include "BLI_math.h"
-#include "BLI_utildefines.h"
-
-#include "DNA_material_types.h"
-
-#include "rayintersection.h"
-#include "rayobject.h"
-#include "raycounter.h"
-#include "render_types.h"
-#include "renderdatabase.h"
-
-/* RayFace
- *
- * note we force always inline here, because compiler refuses to otherwise
- * because function is too long. Since this is code that is called billions
- * of times we really do want to inline. */
-
-MALWAYS_INLINE RayObject *rayface_from_coords(RayFace *rayface, void *ob, void *face,
-                                              float *v1, float *v2, float *v3, float *v4)
-{
-       rayface->ob = ob;
-       rayface->face = face;
-
-       copy_v3_v3(rayface->v1, v1);
-       copy_v3_v3(rayface->v2, v2);
-       copy_v3_v3(rayface->v3, v3);
-
-       if (v4) {
-               copy_v3_v3(rayface->v4, v4);
-               rayface->quad = 1;
-       }
-       else {
-               rayface->quad = 0;
-       }
-
-       return RE_rayobject_unalignRayFace(rayface);
-}
-
-MALWAYS_INLINE void rayface_from_vlak(RayFace *rayface, ObjectInstanceRen *obi, VlakRen *vlr)
-{
-       rayface_from_coords(rayface, obi, vlr, vlr->v1->co, vlr->v2->co, vlr->v3->co, vlr->v4 ? vlr->v4->co : NULL);
-
-       if (obi->transform_primitives) {
-               mul_m4_v3(obi->mat, rayface->v1);
-               mul_m4_v3(obi->mat, rayface->v2);
-               mul_m4_v3(obi->mat, rayface->v3);
-
-               if (RE_rayface_isQuad(rayface))
-                       mul_m4_v3(obi->mat, rayface->v4);
-       }
-}
-
-RayObject *RE_rayface_from_vlak(RayFace *rayface, ObjectInstanceRen *obi, VlakRen *vlr)
-{
-       return rayface_from_coords(rayface, obi, vlr, vlr->v1->co, vlr->v2->co, vlr->v3->co, vlr->v4 ? vlr->v4->co : NULL);
-}
-
-RayObject *RE_rayface_from_coords(RayFace *rayface, void *ob, void *face, float *v1, float *v2, float *v3, float *v4)
-{
-       return rayface_from_coords(rayface, ob, face, v1, v2, v3, v4);
-}
-
-/* VlakPrimitive */
-
-RayObject *RE_vlakprimitive_from_vlak(VlakPrimitive *face, struct ObjectInstanceRen *obi, struct VlakRen *vlr)
-{
-       face->ob = obi;
-       face->face = vlr;
-
-       return RE_rayobject_unalignVlakPrimitive(face);
-}
-
-/* Checks for ignoring faces or materials */
-
-MALWAYS_INLINE int vlr_check_intersect(Isect *is, ObjectInstanceRen *obi, VlakRen *vlr)
-{
-       /* for baking selected to active non-traceable materials might still
-        * be in the raytree */
-       if (!(vlr->flag & R_TRACEBLE))
-               return 0;
-
-       /* I know... cpu cycle waste, might do smarter once */
-       if (is->mode == RE_RAY_MIRROR)
-               return !(vlr->mat->mode & MA_ONLYCAST);
-       else
-               return (vlr->mat->mode2 & MA_CASTSHADOW) && (is->lay & obi->lay);
-}
-
-MALWAYS_INLINE int vlr_check_intersect_solid(Isect *UNUSED(is), ObjectInstanceRen *UNUSED(obi), VlakRen *vlr)
-{
-       /* solid material types only */
-       if (vlr->mat->material_type == MA_TYPE_SURFACE)
-               return 1;
-       else
-               return 0;
-}
-
-MALWAYS_INLINE int vlr_check_bake(Isect *is, ObjectInstanceRen *obi, VlakRen *UNUSED(vlr))
-{
-       return (obi->obr->ob != is->userdata) && (obi->obr->ob->flag & SELECT);
-}
-
-/* Ray Triangle/Quad Intersection */
-
-static bool isect_ray_tri_watertight_no_sign_check_v3(
-        const float ray_origin[3], const struct IsectRayPrecalc *isect_precalc,
-        const float v0[3], const float v1[3], const float v2[3],
-        float *r_lambda, float r_uv[2])
-{
-       const int kx = isect_precalc->kx;
-       const int ky = isect_precalc->ky;
-       const int kz = isect_precalc->kz;
-       const float sx = isect_precalc->sx;
-       const float sy = isect_precalc->sy;
-       const float sz = isect_precalc->sz;
-
-       /* Calculate vertices relative to ray origin. */
-       const float a[3] = {v0[0] - ray_origin[0], v0[1] - ray_origin[1], v0[2] - ray_origin[2]};
-       const float b[3] = {v1[0] - ray_origin[0], v1[1] - ray_origin[1], v1[2] - ray_origin[2]};
-       const float c[3] = {v2[0] - ray_origin[0], v2[1] - ray_origin[1], v2[2] - ray_origin[2]};
-
-       const float a_kx = a[kx], a_ky = a[ky], a_kz = a[kz];
-       const float b_kx = b[kx], b_ky = b[ky], b_kz = b[kz];
-       const float c_kx = c[kx], c_ky = c[ky], c_kz = c[kz];
-
-       /* Perform shear and scale of vertices. */
-       const float ax = a_kx - sx * a_kz;
-       const float ay = a_ky - sy * a_kz;
-       const float bx = b_kx - sx * b_kz;
-       const float by = b_ky - sy * b_kz;
-       const float cx = c_kx - sx * c_kz;
-       const float cy = c_ky - sy * c_kz;
-
-       /* Calculate scaled barycentric coordinates. */
-       const float u = cx * by - cy * bx;
-       const float v = ax * cy - ay * cx;
-       const float w = bx * ay - by * ax;
-       float det;
-
-       if ((u < 0.0f || v < 0.0f || w < 0.0f) &&
-           (u > 0.0f || v > 0.0f || w > 0.0f))
-       {
-               return false;
-       }
-
-       /* Calculate determinant. */
-       det = u + v + w;
-       if (UNLIKELY(det == 0.0f)) {
-               return false;
-       }
-       else {
-               /* Calculate scaled z-coordinates of vertices and use them to calculate
-                * the hit distance.
-                */
-               const float t = (u * a_kz + v * b_kz + w * c_kz) * sz;
-               /* Normalize u, v and t. */
-               const float inv_det = 1.0f / det;
-               if (r_uv) {
-                       r_uv[0] = u * inv_det;
-                       r_uv[1] = v * inv_det;
-               }
-               *r_lambda = t * inv_det;
-               return true;
-       }
-}
-
-MALWAYS_INLINE int isec_tri_quad(const float start[3],
-                                 const struct IsectRayPrecalc *isect_precalc,
-                                 const RayFace *face,
-                                 float r_uv[2], float *r_lambda)
-{
-       float uv[2], l;
-
-       if (isect_ray_tri_watertight_v3(start, isect_precalc, face->v1, face->v2, face->v3, &l, uv)) {
-               /* check if intersection is within ray length */
-               if (l > -RE_RAYTRACE_EPSILON && l < *r_lambda) {
-                       r_uv[0] = -uv[0];
-                       r_uv[1] = -uv[1];
-                       *r_lambda = l;
-                       return 1;
-               }
-       }
-
-       /* intersect second triangle in quad */
-       if (RE_rayface_isQuad(face)) {
-               if (isect_ray_tri_watertight_v3(start, isect_precalc, face->v1, face->v3, face->v4, &l, uv)) {
-                       /* check if intersection is within ray length */
-                       if (l > -RE_RAYTRACE_EPSILON && l < *r_lambda) {
-                               r_uv[0] = -uv[0];
-                               r_uv[1] = -uv[1];
-                               *r_lambda = l;
-                               return 2;
-                       }
-               }
-       }
-
-       return 0;
-}
-
-/* Simpler yes/no Ray Triangle/Quad Intersection */
-
-MALWAYS_INLINE int isec_tri_quad_neighbour(const float start[3],
-                                           const float dir[3],
-                                           const RayFace *face)
-{
-       float r[3];
-       struct IsectRayPrecalc isect_precalc;
-       float uv[2], l;
-
-       negate_v3_v3(r, dir); /* note, different than above function */
-
-       isect_ray_tri_watertight_v3_precalc(&isect_precalc, r);
-
-       if (isect_ray_tri_watertight_no_sign_check_v3(start, &isect_precalc, face->v1, face->v2, face->v3, &l, uv)) {
-               return 1;
-       }
-
-       /* intersect second triangle in quad */
-       if (RE_rayface_isQuad(face)) {
-               if (isect_ray_tri_watertight_no_sign_check_v3(start, &isect_precalc, face->v1, face->v3, face->v4, &l, uv)) {
-                       return 2;
-               }
-       }
-
-       return 0;
-}
-
-/* RayFace intersection with checks and neighbor verifaction included,
- * Isect is modified if the face is hit. */
-
-MALWAYS_INLINE int intersect_rayface(RayObject *hit_obj, RayFace *face, Isect *is)
-{
-       float dist, uv[2];
-       int ok = 0;
-
-       /* avoid self-intersection */
-       if (is->orig.ob == face->ob && is->orig.face == face->face)
-               return 0;
-
-       /* check if we should intersect this face */
-       if (is->check == RE_CHECK_VLR_RENDER) {
-               if (vlr_check_intersect(is, (ObjectInstanceRen *)face->ob, (VlakRen *)face->face) == 0)
-                       return 0;
-       }
-       else if (is->check == RE_CHECK_VLR_NON_SOLID_MATERIAL) {
-               if (vlr_check_intersect(is, (ObjectInstanceRen *)face->ob, (VlakRen *)face->face) == 0)
-                       return 0;
-               if (vlr_check_intersect_solid(is, (ObjectInstanceRen *)face->ob, (VlakRen *)face->face) == 0)
-                       return 0;
-       }
-       else if (is->check == RE_CHECK_VLR_BAKE) {
-               if (vlr_check_bake(is, (ObjectInstanceRen *)face->ob, (VlakRen *)face->face) == 0)
-                       return 0;
-       }
-
-       /* ray counter */
-       RE_RC_COUNT(is->raycounter->faces.test);
-
-       dist = is->dist;
-       ok = isec_tri_quad(is->start, &is->isect_precalc, face, uv, &dist);
-
-       if (ok) {
-
-               /* when a shadow ray leaves a face, it can be little outside the edges
-                * of it, causing intersection to be detected in its neighbor face */
-               if (is->skip & RE_SKIP_VLR_NEIGHBOUR) {
-                       if (dist < 0.1f && is->orig.ob == face->ob) {
-                               VlakRen *a = (VlakRen *)is->orig.face;
-                               VlakRen *b = (VlakRen *)face->face;
-                               ObjectRen *obr = ((ObjectInstanceRen *)face->ob)->obr;
-
-                               VertRen **va, **vb;
-                               int *org_idx_a, *org_idx_b;
-                               int i, j;
-                               bool is_neighbor = false;
-
-                               /* "same" vertex means either the actual same VertRen, or the same 'final org index', if available
-                                * (autosmooth only, currently). */
-                               for (i = 0, va = &a->v1; !is_neighbor && i < 4 && *va; ++i, ++va) {
-                                       org_idx_a = RE_vertren_get_origindex(obr, *va, false);
-                                       for (j = 0, vb = &b->v1; !is_neighbor && j < 4 && *vb; ++j, ++vb) {
-                                               if (*va == *vb) {
-                                                       is_neighbor = true;
-                                               }
-                                               else if (org_idx_a) {
-                                                       org_idx_b = RE_vertren_get_origindex(obr, *vb, 0);
-                                                       if (org_idx_b && *org_idx_a == *org_idx_b) {
-                                                               is_neighbor = true;
-                                                       }
-                                               }
-                                       }
-                               }
-
-                               /* So there's a shared edge or vertex, let's intersect ray with self, if that's true
-                                * we can safely return 1, otherwise we assume the intersection is invalid, 0 */
-                               if (is_neighbor) {
-                                       /* create RayFace from original face, transformed if necessary */
-                                       RayFace origface;
-                                       ObjectInstanceRen *ob = (ObjectInstanceRen *)is->orig.ob;
-                                       rayface_from_vlak(&origface, ob, (VlakRen *)is->orig.face);
-
-                                       if (!isec_tri_quad_neighbour(is->start, is->dir, &origface)) {
-                                               return 0;
-                                       }
-                               }
-                       }
-               }
-
-               RE_RC_COUNT(is->raycounter->faces.hit);
-
-               is->isect = ok;  // which half of the quad
-               is->dist = dist;
-               is->u = uv[0]; is->v = uv[1];
-
-               is->hit.ob   = face->ob;
-               is->hit.face = face->face;
-#ifdef RT_USE_LAST_HIT
-               is->last_hit = hit_obj;
-#endif
-               return 1;
-       }
-
-       return 0;
-}
-
-/* Intersection */
-
-int RE_rayobject_raycast(RayObject *r, Isect *isec)
-{
-       int i;
-
-       /* Pre-calculate orientation for watertight intersection checks. */
-       isect_ray_tri_watertight_v3_precalc(&isec->isect_precalc, isec->dir);
-
-       RE_RC_COUNT(isec->raycounter->raycast.test);
-
-       /* setup vars used on raycast */
-       for (i = 0; i < 3; i++) {
-               isec->idot_axis[i]          = 1.0f / isec->dir[i];
-
-               isec->bv_index[2 * i]       = isec->idot_axis[i] < 0.0f ? 1 : 0;
-               isec->bv_index[2 * i + 1]   = 1 - isec->bv_index[2 * i];
-
-               isec->bv_index[2 * i]       = i + 3 * isec->bv_index[2 * i];
-               isec->bv_index[2 * i + 1]   = i + 3 * isec->bv_index[2 * i + 1];
-       }
-
-#ifdef RT_USE_LAST_HIT
-       /* last hit heuristic */
-       if (isec->mode == RE_RAY_SHADOW && isec->last_hit) {
-               RE_RC_COUNT(isec->raycounter->rayshadow_last_hit.test);
-
-               if (RE_rayobject_intersect(isec->last_hit, isec)) {
-                       RE_RC_COUNT(isec->raycounter->raycast.hit);
-                       RE_RC_COUNT(isec->raycounter->rayshadow_last_hit.hit);
-                       return 1;
-               }
-       }
-#endif
-
-#ifdef RT_USE_HINT
-       isec->hit_hint = 0;
-#endif
-
-       if (RE_rayobject_intersect(r, isec)) {
-               RE_RC_COUNT(isec->raycounter->raycast.hit);
-
-#ifdef RT_USE_HINT
-               isec->hint = isec->hit_hint;
-#endif
-               return 1;
-       }
-
-       return 0;
-}
-
-int RE_rayobject_intersect(RayObject *r, Isect *i)
-{
-       if (RE_rayobject_isRayFace(r)) {
-               return intersect_rayface(r, (RayFace *) RE_rayobject_align(r), i);
-       }
-       else if (RE_rayobject_isVlakPrimitive(r)) {
-               //TODO optimize (useless copy to RayFace to avoid duplicate code)
-               VlakPrimitive *face = (VlakPrimitive *) RE_rayobject_align(r);
-               RayFace nface;
-               rayface_from_vlak(&nface, face->ob, face->face);
-
-               return intersect_rayface(r, &nface, i);
-       }
-       else if (RE_rayobject_isRayAPI(r)) {
-               r = RE_rayobject_align(r);
-               return r->api->raycast(r, i);
-       }
-       else {
-               assert(0);
-               return 0;
-       }
-}
-
-/* Building */
-
-void RE_rayobject_add(RayObject *r, RayObject *o)
-{
-       r = RE_rayobject_align(r);
-       return r->api->add(r, o);
-}
-
-void RE_rayobject_done(RayObject *r)
-{
-       r = RE_rayobject_align(r);
-       r->api->done(r);
-}
-
-void RE_rayobject_free(RayObject *r)
-{
-       r = RE_rayobject_align(r);
-       r->api->free(r);
-}
-
-float RE_rayobject_cost(RayObject *r)
-{
-       if (RE_rayobject_isRayFace(r) || RE_rayobject_isVlakPrimitive(r)) {
-               return 1.0f;
-       }
-       else if (RE_rayobject_isRayAPI(r)) {
-               r = RE_rayobject_align(r);
-               return r->api->cost(r);
-       }
-       else {
-               assert(0);
-               return 1.0f;
-       }
-}
-
-/* Bounding Boxes */
-
-void RE_rayobject_merge_bb(RayObject *r, float min[3], float max[3])
-{
-       if (RE_rayobject_isRayFace(r)) {
-               RayFace *face = (RayFace *) RE_rayobject_align(r);
-
-               DO_MINMAX(face->v1, min, max);
-               DO_MINMAX(face->v2, min, max);
-               DO_MINMAX(face->v3, min, max);
-               if (RE_rayface_isQuad(face)) DO_MINMAX(face->v4, min, max);
-       }
-       else if (RE_rayobject_isVlakPrimitive(r)) {
-               VlakPrimitive *face = (VlakPrimitive *) RE_rayobject_align(r);
-               RayFace nface;
-               rayface_from_vlak(&nface, face->ob, face->face);
-
-               DO_MINMAX(nface.v1, min, max);
-               DO_MINMAX(nface.v2, min, max);
-               DO_MINMAX(nface.v3, min, max);
-               if (RE_rayface_isQuad(&nface)) DO_MINMAX(nface.v4, min, max);
-       }
-       else if (RE_rayobject_isRayAPI(r)) {
-               r = RE_rayobject_align(r);
-               r->api->bb(r, min, max);
-       }
-       else
-               assert(0);
-}
-
-/* Hints */
-
-void RE_rayobject_hint_bb(RayObject *r, RayHint *hint, float *min, float *max)
-{
-       if (RE_rayobject_isRayFace(r) || RE_rayobject_isVlakPrimitive(r)) {
-               return;
-       }
-       else if (RE_rayobject_isRayAPI(r)) {
-               r = RE_rayobject_align(r);
-               return r->api->hint_bb(r, hint, min, max);
-       }
-       else
-               assert(0);
-}
-
-/* RayObjectControl */
-
-int RE_rayobjectcontrol_test_break(RayObjectControl *control)
-{
-       if (control->test_break)
-               return control->test_break(control->data);
-
-       return 0;
-}
-
-void RE_rayobject_set_control(RayObject *r, void *data, RE_rayobjectcontrol_test_break_callback test_break)
-{
-       if (RE_rayobject_isRayAPI(r)) {
-               r = RE_rayobject_align(r);
-               r->control.data = data;
-               r->control.test_break = test_break;
-       }
-}
-
diff --git a/source/blender/render/intern/raytrace/rayobject_hint.h b/source/blender/render/intern/raytrace/rayobject_hint.h
deleted file mode 100644 (file)
index 88a3281..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * ***** 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) 2009 Blender Foundation.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): André Pinto.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/render/intern/raytrace/rayobject_hint.h
- *  \ingroup render
- */
-
-
-#ifndef __RAYOBJECT_HINT_H__
-#define __RAYOBJECT_HINT_H__
-
-#define HINT_RECURSE     1
-#define HINT_ACCEPT      0
-#define HINT_DISCARD    -1
-
-struct HintBB {
-       float bb[6];
-};
-
-inline int hint_test_bb(HintBB *obj, float *Nmin, float *Nmax)
-{
-       if (bb_fits_inside(Nmin, Nmax, obj->bb, obj->bb + 3) )
-               return HINT_RECURSE;
-       else
-               return HINT_ACCEPT;
-}
-#if 0
-struct HintFrustum {
-       float co[3];
-       float no[4][3];
-};
-
-inline int hint_test_bb(HintFrustum &obj, float *Nmin, float *Nmax)
-{
-       //if frustum inside BB
-       {
-               return HINT_RECURSE;
-       }
-       //if BB outside frustum
-       {
-               return HINT_DISCARD;
-       }
-
-       return HINT_ACCEPT;
-}
-#endif
-
-#endif /* __RAYOBJECT_HINT_H__ */
diff --git a/source/blender/render/intern/raytrace/rayobject_instance.cpp b/source/blender/render/intern/raytrace/rayobject_instance.cpp
deleted file mode 100644 (file)
index 361e796..0000000
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * ***** 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) 2009 Blender Foundation.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): André Pinto.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/render/intern/raytrace/rayobject_instance.cpp
- *  \ingroup render
- */
-
-
-#include <assert.h>
-
-#include "MEM_guardedalloc.h"
-
-#include "BLI_math.h"
-#include "BLI_utildefines.h"
-
-#include "rayintersection.h"
-#include "rayobject.h"
-
-#define RE_COST_INSTANCE (1.0f)
-
-static int  RE_rayobject_instance_intersect(RayObject *o, Isect *isec);
-static void RE_rayobject_instance_free(RayObject *o);
-static void RE_rayobject_instance_bb(RayObject *o, float *min, float *max);
-static float RE_rayobject_instance_cost(RayObject *o);
-
-static void RE_rayobject_instance_hint_bb(RayObject *UNUSED(o), RayHint *UNUSED(hint),
-                                          float *UNUSED(min), float *UNUSED(max))
-{}
-
-static RayObjectAPI instance_api =
-{
-       RE_rayobject_instance_intersect,
-       NULL, //static void RE_rayobject_instance_add(RayObject *o, RayObject *ob);
-       NULL, //static void RE_rayobject_instance_done(RayObject *o);
-       RE_rayobject_instance_free,
-       RE_rayobject_instance_bb,
-       RE_rayobject_instance_cost,
-       RE_rayobject_instance_hint_bb
-};
-
-typedef struct InstanceRayObject {
-       RayObject rayobj;
-       RayObject *target;
-
-       void *ob; //Object represented by this instance
-       void *target_ob; //Object represented by the inner RayObject, needed to handle self-intersection
-
-       float global2target[4][4];
-       float target2global[4][4];
-
-} InstanceRayObject;
-
-
-RayObject *RE_rayobject_instance_create(RayObject *target, float transform[4][4], void *ob, void *target_ob)
-{
-       InstanceRayObject *obj = (InstanceRayObject *)MEM_callocN(sizeof(InstanceRayObject), "InstanceRayObject");
-       assert(RE_rayobject_isAligned(obj) );  /* RayObject API assumes real data to be 4-byte aligned */
-
-       obj->rayobj.api = &instance_api;
-       obj->target = target;
-       obj->ob = ob;
-       obj->target_ob = target_ob;
-
-       copy_m4_m4(obj->target2global, transform);
-       invert_m4_m4(obj->global2target, obj->target2global);
-
-       return RE_rayobject_unalignRayAPI((RayObject *) obj);
-}
-
-static int  RE_rayobject_instance_intersect(RayObject *o, Isect *isec)
-{
-       InstanceRayObject *obj = (InstanceRayObject *)o;
-       float start[3], dir[3], idot_axis[3], dist;
-       int changed = 0, i, res;
-
-       // TODO - this is disabling self intersection on instances
-       if (isec->orig.ob == obj->ob && obj->ob) {
-               changed = 1;
-               isec->orig.ob = obj->target_ob;
-       }
-
-       // backup old values
-       copy_v3_v3(start, isec->start);
-       copy_v3_v3(dir, isec->dir);
-       copy_v3_v3(idot_axis, isec->idot_axis);
-       dist = isec->dist;
-
-       // transform to target coordinates system
-       mul_m4_v3(obj->global2target, isec->start);
-       mul_mat3_m4_v3(obj->global2target, isec->dir);
-       isec->dist *= normalize_v3(isec->dir);
-
-       // update idot_axis and bv_index
-       for (i = 0; i < 3; i++) {
-               isec->idot_axis[i]        = 1.0f / isec->dir[i];
-
-               isec->bv_index[2 * i]     = isec->idot_axis[i] < 0.0f ? 1 : 0;
-               isec->bv_index[2 * i + 1] = 1 - isec->bv_index[2 * i];
-
-               isec->bv_index[2 * i]     = i + 3 * isec->bv_index[2 * i];
-               isec->bv_index[2 * i + 1] = i + 3 * isec->bv_index[2 * i + 1];
-       }
-
-       // Pre-calculate orientation for watertight intersection checks.
-       isect_ray_tri_watertight_v3_precalc(&isec->isect_precalc, isec->dir);
-
-       // raycast
-       res = RE_rayobject_intersect(obj->target, isec);
-
-       // map dist into original coordinate space
-       if (res == 0) {
-               isec->dist = dist;
-       }
-       else {
-               // note we don't just multiply dist, because of possible
-               // non-uniform scaling in the transform matrix
-               float vec[3];
-
-               mul_v3_v3fl(vec, isec->dir, isec->dist);
-               mul_mat3_m4_v3(obj->target2global, vec);
-
-               isec->dist = len_v3(vec);
-               isec->hit.ob = obj->ob;
-
-#ifdef RT_USE_LAST_HIT
-               // TODO support for last hit optimization in instances that can jump
-               // directly to the last hit face.
-               // For now it jumps directly to the last-hit instance root node.
-               isec->last_hit = RE_rayobject_unalignRayAPI((RayObject *) obj);
-#endif
-       }
-
-       // restore values
-       copy_v3_v3(isec->start, start);
-       copy_v3_v3(isec->dir, dir);
-       copy_v3_v3(isec->idot_axis, idot_axis);
-
-       if (changed)
-               isec->orig.ob = obj->ob;
-
-       // restore bv_index
-       for (i = 0; i < 3; i++) {
-               isec->bv_index[2 * i]     = isec->idot_axis[i] < 0.0f ? 1 : 0;
-               isec->bv_index[2 * i + 1] = 1 - isec->bv_index[2 * i];
-
-               isec->bv_index[2 * i]     = i + 3 * isec->bv_index[2 * i];
-               isec->bv_index[2 * i + 1] = i + 3 * isec->bv_index[2 * i + 1];
-       }
-
-       // Pre-calculate orientation for watertight intersection checks.
-       isect_ray_tri_watertight_v3_precalc(&isec->isect_precalc, isec->dir);
-
-       return res;
-}
-
-static void RE_rayobject_instance_free(RayObject *o)
-{
-       InstanceRayObject *obj = (InstanceRayObject *)o;
-       MEM_freeN(obj);
-}
-
-static float RE_rayobject_instance_cost(RayObject *o)
-{
-       InstanceRayObject *obj = (InstanceRayObject *)o;
-       return RE_rayobject_cost(obj->target) + RE_COST_INSTANCE;
-}
-
-static void RE_rayobject_instance_bb(RayObject *o, float *min, float *max)
-{
-       //TODO:
-       // *better bb.. calculated without rotations of bb
-       // *maybe cache that better-fitted-BB at the InstanceRayObject
-       InstanceRayObject *obj = (InstanceRayObject *)o;
-
-       float m[3], M[3], t[3];
-       int i, j;
-       INIT_MINMAX(m, M);
-       RE_rayobject_merge_bb(obj->target, m, M);
-
-       //There must be a faster way than rotating all the 8 vertexs of the BB
-       for (i = 0; i < 8; i++) {
-               for (j = 0; j < 3; j++) t[j] = (i & (1 << j)) ? M[j] : m[j];
-               mul_m4_v3(obj->target2global, t);
-               DO_MINMAX(t, min, max);
-       }
-}
-
diff --git a/source/blender/render/intern/raytrace/rayobject_octree.cpp b/source/blender/render/intern/raytrace/rayobject_octree.cpp
deleted file mode 100644 (file)
index 4b73e64..0000000
+++ /dev/null
@@ -1,1101 +0,0 @@
-/*
- * ***** 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) 1990-1998 NeoGeo BV.
- * All rights reserved.
- *
- * Contributors: 2004/2005 Blender Foundation, full recode
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/render/intern/raytrace/rayobject_octree.cpp
- *  \ingroup render
- */
-
-
-/* IMPORTANT NOTE: this code must be independent of any other render code
- * to use it outside the renderer! */
-
-#include <math.h>
-#include <string.h>
-#include <stdlib.h>
-#include <float.h>
-#include <assert.h>
-
-#include "MEM_guardedalloc.h"
-
-#include "DNA_material_types.h"
-
-#include "BLI_math.h"
-#include "BLI_utildefines.h"
-
-#include "rayintersection.h"
-#include "rayobject.h"
-
-/* ********** structs *************** */
-#define BRANCH_ARRAY 1024
-#define NODE_ARRAY 4096
-
-typedef struct Branch {
-       struct Branch *b[8];
-} Branch;
-
-typedef struct OcVal {
-       short ocx, ocy, ocz;
-} OcVal;
-
-typedef struct Node {
-       struct RayFace *v[8];
-       struct OcVal ov[8];
-       struct Node *next;
-} Node;
-
-typedef struct Octree {
-       RayObject rayobj;
-
-       struct Branch **adrbranch;
-       struct Node **adrnode;
-       float ocsize;   /* ocsize: mult factor,  max size octree */
-       float ocfacx, ocfacy, ocfacz;
-       float min[3], max[3];
-       int ocres;
-       int branchcount, nodecount;
-
-       /* during building only */
-       char *ocface;
-
-       RayFace **ro_nodes;
-       int ro_nodes_size, ro_nodes_used;
-
-} Octree;
-
-static int  RE_rayobject_octree_intersect(RayObject *o, Isect *isec);
-static void RE_rayobject_octree_add(RayObject *o, RayObject *ob);
-static void RE_rayobject_octree_done(RayObject *o);
-static void RE_rayobject_octree_free(RayObject *o);
-static void RE_rayobject_octree_bb(RayObject *o, float *min, float *max);
-
-/*
- * This function is not expected to be called by current code state.
- */
-static float RE_rayobject_octree_cost(RayObject *UNUSED(o))
-{
-       return 1.0;
-}
-
-static void RE_rayobject_octree_hint_bb(RayObject *UNUSED(o), RayHint *UNUSED(hint),
-                                        float *UNUSED(min), float *UNUSED(max))
-{
-       return;
-}
-
-static RayObjectAPI octree_api =
-{
-       RE_rayobject_octree_intersect,
-       RE_rayobject_octree_add,
-       RE_rayobject_octree_done,
-       RE_rayobject_octree_free,
-       RE_rayobject_octree_bb,
-       RE_rayobject_octree_cost,
-       RE_rayobject_octree_hint_bb
-};
-
-/* **************** ocval method ******************* */
-/* within one octree node, a set of 3x15 bits defines a 'boundbox' to OR with */
-
-#define OCVALRES    15
-#define BROW16(min, max) \
-       (((max) >= OCVALRES ? 0xFFFF : (1 << ((max) + 1)) - 1) - (((min) > 0) ? ((1 << (min)) - 1) : 0))
-
-static void calc_ocval_face(float *v1, float *v2, float *v3, float *v4, short x, short y, short z, OcVal *ov)
-{
-       float min[3], max[3];
-       int ocmin, ocmax;
-
-       copy_v3_v3(min, v1);
-       copy_v3_v3(max, v1);
-       DO_MINMAX(v2, min, max);
-       DO_MINMAX(v3, min, max);
-       if (v4) {
-               DO_MINMAX(v4, min, max);
-       }
-
-       ocmin = OCVALRES * (min[0] - x);
-       ocmax = OCVALRES * (max[0] - x);
-       ov->ocx = BROW16(ocmin, ocmax);
-
-       ocmin = OCVALRES * (min[1] - y);
-       ocmax = OCVALRES * (max[1] - y);
-       ov->ocy = BROW16(ocmin, ocmax);
-
-       ocmin = OCVALRES * (min[2] - z);
-       ocmax = OCVALRES * (max[2] - z);
-       ov->ocz = BROW16(ocmin, ocmax);
-
-}
-
-static void calc_ocval_ray(OcVal *ov, float xo, float yo, float zo, float *vec1, float *vec2)
-{
-       int ocmin, ocmax;
-
-       if (vec1[0] < vec2[0]) {
-               ocmin = OCVALRES * (vec1[0] - xo);
-               ocmax = OCVALRES * (vec2[0] - xo);
-       }
-       else {
-               ocmin = OCVALRES * (vec2[0] - xo);
-               ocmax = OCVALRES * (vec1[0] - xo);
-       }
-       ov->ocx = BROW16(ocmin, ocmax);
-
-       if (vec1[1] < vec2[1]) {
-               ocmin = OCVALRES * (vec1[1] - yo);
-               ocmax = OCVALRES * (vec2[1] - yo);
-       }
-       else {
-               ocmin = OCVALRES * (vec2[1] - yo);
-               ocmax = OCVALRES * (vec1[1] - yo);
-       }
-       ov->ocy = BROW16(ocmin, ocmax);
-
-       if (vec1[2] < vec2[2]) {
-               ocmin = OCVALRES * (vec1[2] - zo);
-               ocmax = OCVALRES * (vec2[2] - zo);
-       }
-       else {
-               ocmin = OCVALRES * (vec2[2] - zo);
-               ocmax = OCVALRES * (vec1[2] - zo);
-       }
-       ov->ocz = BROW16(ocmin, ocmax);
-}
-
-/* ************* octree ************** */
-
-static Branch *addbranch(Octree *oc, Branch *br, short ocb)
-{
-       int index;
-
-       if (br->b[ocb]) return br->b[ocb];
-
-       oc->branchcount++;
-       index = oc->branchcount >> 12;
-
-       if (oc->adrbranch[index] == NULL)
-               oc->adrbranch[index] = (Branch *)MEM_callocN(4096 * sizeof(Branch), "new oc branch");
-
-       if (oc->branchcount >= BRANCH_ARRAY * 4096) {
-               printf("error; octree branches full\n");
-               oc->branchcount = 0;
-       }
-
-       return br->b[ocb] = oc->adrbranch[index] + (oc->branchcount & 4095);
-}
-
-static Node *addnode(Octree *oc)
-{
-       int index;
-
-       oc->nodecount++;
-       index = oc->nodecount >> 12;
-
-       if (oc->adrnode[index] == NULL)
-               oc->adrnode[index] = (Node *)MEM_callocN(4096 * sizeof(Node), "addnode");
-
-       if (oc->nodecount > NODE_ARRAY * NODE_ARRAY) {
-               printf("error; octree nodes full\n");
-               oc->nodecount = 0;
-       }
-
-       return oc->adrnode[index] + (oc->nodecount & 4095);
-}
-
-static bool face_in_node(RayFace *face, short x, short y, short z, float rtf[4][3])
-{
-       static float nor[3], d;
-       float fx, fy, fz;
-
-       // init static vars
-       if (face) {
-               normal_tri_v3(nor, rtf[0], rtf[1], rtf[2]);
-               d = -nor[0] * rtf[0][0] - nor[1] * rtf[0][1] - nor[2] * rtf[0][2];
-               return 0;
-       }
-
-       fx = x;
-       fy = y;
-       fz = z;
-
-       if ((fx) * nor[0] + (fy) * nor[1] + (fz) * nor[2] + d > 0.0f) {
-               if ((fx + 1) * nor[0] + (fy    ) * nor[1] + (fz    ) * nor[2] + d < 0.0f) return 1;
-               if ((fx    ) * nor[0] + (fy + 1) * nor[1] + (fz    ) * nor[2] + d < 0.0f) return 1;
-               if ((fx + 1) * nor[0] + (fy + 1) * nor[1] + (fz    ) * nor[2] + d < 0.0f) return 1;
-
-               if ((fx    ) * nor[0] + (fy    ) * nor[1] + (fz + 1) * nor[2] + d < 0.0f) return 1;
-               if ((fx + 1) * nor[0] + (fy    ) * nor[1] + (fz + 1) * nor[2] + d < 0.0f) return 1;
-               if ((fx    ) * nor[0] + (fy + 1) * nor[1] + (fz + 1) * nor[2] + d < 0.0f) return 1;
-               if ((fx + 1) * nor[0] + (fy + 1) * nor[1] + (fz + 1) * nor[2] + d < 0.0f) return 1;
-       }
-       else {
-               if ((fx + 1) * nor[0] + (fy    ) * nor[1] + (fz    ) * nor[2] + d > 0.0f) return 1;
-               if ((fx    ) * nor[0] + (fy + 1) * nor[1] + (fz    ) * nor[2] + d > 0.0f) return 1;
-               if ((fx + 1) * nor[0] + (fy + 1) * nor[1] + (fz    ) * nor[2] + d > 0.0f) return 1;
-
-               if ((fx    ) * nor[0] + (fy    ) * nor[1] + (fz + 1) * nor[2] + d > 0.0f) return 1;
-               if ((fx + 1) * nor[0] + (fy    ) * nor[1] + (fz + 1) * nor[2] + d > 0.0f) return 1;
-               if ((fx    ) * nor[0] + (fy + 1) * nor[1] + (fz + 1) * nor[2] + d > 0.0f) return 1;
-               if ((fx + 1) * nor[0] + (fy + 1) * nor[1] + (fz + 1) * nor[2] + d > 0.0f) return 1;
-       }
-
-       return 0;
-}
-
-static void ocwrite(Octree *oc, RayFace *face, int quad, short x, short y, short z, float rtf[4][3])
-{
-       Branch *br;
-       Node *no;
-       short a, oc0, oc1, oc2, oc3, oc4, oc5;
-
-       x <<= 2;
-       y <<= 1;
-
-       br = oc->adrbranch[0];
-
-       if (oc->ocres == 512) {
-               oc0 = ((x & 1024) + (y & 512) + (z & 256)) >> 8;
-               br = addbranch(oc, br, oc0);
-       }
-       if (oc->ocres >= 256) {
-               oc0 = ((x & 512) + (y & 256) + (z & 128)) >> 7;
-               br = addbranch(oc, br, oc0);
-       }
-       if (oc->ocres >= 128) {
-               oc0 = ((x & 256) + (y & 128) + (z & 64)) >> 6;
-               br = addbranch(oc, br, oc0);
-       }
-
-       oc0 = ((x & 128) + (y & 64) + (z & 32)) >> 5;
-       oc1 = ((x & 64) + (y & 32) + (z & 16)) >> 4;
-       oc2 = ((x & 32) + (y & 16) + (z & 8)) >> 3;
-       oc3 = ((x & 16) + (y & 8) + (z & 4)) >> 2;
-       oc4 = ((x & 8) + (y & 4) + (z & 2)) >> 1;
-       oc5 = ((x & 4) + (y & 2) + (z & 1));
-
-       br = addbranch(oc, br, oc0);
-       br = addbranch(oc, br, oc1);
-       br = addbranch(oc, br, oc2);
-       br = addbranch(oc, br, oc3);
-       br = addbranch(oc, br, oc4);
-       no = (Node *)br->b[oc5];
-       if (no == NULL) br->b[oc5] = (Branch *)(no = addnode(oc));
-
-       while (no->next) no = no->next;
-
-       a = 0;
-       if (no->v[7]) {     /* node full */
-               no->next = addnode(oc);
-               no = no->next;
-       }
-       else {
-               while (no->v[a] != NULL) a++;
-       }
-
-       no->v[a] = (RayFace *) RE_rayobject_align(face);
-
-       if (quad)
-               calc_ocval_face(rtf[0], rtf[1], rtf[2], rtf[3], x >> 2, y >> 1, z, &no->ov[a]);
-       else
-               calc_ocval_face(rtf[0], rtf[1], rtf[2], NULL, x >> 2, y >> 1, z, &no->ov[a]);
-}
-
-static void d2dda(Octree *oc, short b1, short b2, short c1, short c2, char *ocface, short rts[4][3], float rtf[4][3])
-{
-       int ocx1, ocx2, ocy1, ocy2;
-       int x, y, dx = 0, dy = 0;
-       float ox1, ox2, oy1, oy2;
-       float lambda, lambda_o, lambda_x, lambda_y, ldx, ldy;
-
-       ocx1 = rts[b1][c1];
-       ocy1 = rts[b1][c2];
-       ocx2 = rts[b2][c1];
-       ocy2 = rts[b2][c2];
-
-       if (ocx1 == ocx2 && ocy1 == ocy2) {
-               ocface[oc->ocres * ocx1 + ocy1] = 1;
-               return;
-       }
-
-       ox1 = rtf[b1][c1];
-       oy1 = rtf[b1][c2];
-       ox2 = rtf[b2][c1];
-       oy2 = rtf[b2][c2];
-
-       if (ox1 != ox2) {
-               if (ox2 - ox1 > 0.0f) {
-                       lambda_x = (ox1 - ocx1 - 1.0f) / (ox1 - ox2);
-                       ldx = -1.0f / (ox1 - ox2);
-                       dx = 1;
-               }
-               else {
-                       lambda_x = (ox1 - ocx1) / (ox1 - ox2);
-                       ldx = 1.0f / (ox1 - ox2);
-                       dx = -1;
-               }
-       }
-       else {
-               lambda_x = 1.0f;
-               ldx = 0;
-       }
-
-       if (oy1 != oy2) {
-               if (oy2 - oy1 > 0.0f) {
-                       lambda_y = (oy1 - ocy1 - 1.0f) / (oy1 - oy2);
-                       ldy = -1.0f / (oy1 - oy2);
-                       dy = 1;
-               }
-               else {
-                       lambda_y = (oy1 - ocy1) / (oy1 - oy2);
-                       ldy = 1.0f / (oy1 - oy2);
-                       dy = -1;
-               }
-       }
-       else {
-               lambda_y = 1.0f;
-               ldy = 0;
-       }
-
-       x = ocx1; y = ocy1;
-       lambda = MIN2(lambda_x, lambda_y);
-
-       while (true) {
-
-               if (x < 0 || y < 0 || x >= oc->ocres || y >= oc->ocres) {
-                       /* pass*/
-               }
-               else {
-                       ocface[oc->ocres * x + y] = 1;
-               }
-
-               lambda_o = lambda;
-               if (lambda_x == lambda_y) {
-                       lambda_x += ldx;
-                       x += dx;
-                       lambda_y += ldy;
-                       y += dy;
-               }
-               else {
-                       if (lambda_x < lambda_y) {
-                               lambda_x += ldx;
-                               x += dx;
-                       }
-                       else {
-                               lambda_y += ldy;
-                               y += dy;
-                       }
-               }
-               lambda = MIN2(lambda_x, lambda_y);
-               if (lambda == lambda_o) break;
-               if (lambda >= 1.0f) break;
-       }
-       ocface[oc->ocres * ocx2 + ocy2] = 1;
-}
-
-static void filltriangle(Octree *oc, short c1, short c2, char *ocface, short *ocmin, short *ocmax)
-{
-       int a, x, y, y1, y2;
-
-       for (x = ocmin[c1]; x <= ocmax[c1]; x++) {
-               a = oc->ocres * x;
-               for (y = ocmin[c2]; y <= ocmax[c2]; y++) {
-                       if (ocface[a + y]) {
-                               y++;
-                               while (ocface[a + y] && y != ocmax[c2]) y++;
-                               for (y1 = ocmax[c2]; y1 > y; y1--) {
-                                       if (ocface[a + y1]) {
-                                               for (y2 = y; y2 <= y1; y2++) ocface[a + y2] = 1;
-                                               y1 = 0;
-                                       }
-                               }
-                               y = ocmax[c2];
-                       }
-               }
-       }
-}
-
-static void RE_rayobject_octree_free(RayObject *tree)
-{
-       Octree *oc = (Octree *)tree;
-
-#if 0
-       printf("branches %d nodes %d\n", oc->branchcount, oc->nodecount);
-       printf("raycount %d\n", raycount);
-       printf("ray coherent %d\n", coherent_ray);
-       printf("accepted %d rejected %d\n", accepted, rejected);
-#endif
-       if (oc->ocface)
-               MEM_freeN(oc->ocface);
-
-       if (oc->adrbranch) {
-               int a = 0;
-               while (oc->adrbranch[a]) {
-                       MEM_freeN(oc->adrbranch[a]);
-                       oc->adrbranch[a] = NULL;
-                       a++;
-               }
-               MEM_freeN(oc->adrbranch);
-               oc->adrbranch = NULL;
-       }
-       oc->branchcount = 0;
-
-       if (oc->adrnode) {
-               int a = 0;
-               while (oc->adrnode[a]) {
-                       MEM_freeN(oc->adrnode[a]);
-                       oc->adrnode[a] = NULL;
-                       a++;
-               }
-               MEM_freeN(oc->adrnode);
-               oc->adrnode = NULL;
-       }
-       oc->nodecount = 0;
-
-       MEM_freeN(oc);
-}
-
-
-RayObject *RE_rayobject_octree_create(int ocres, int size)
-{
-       Octree *oc = (Octree *)MEM_callocN(sizeof(Octree), "Octree");
-       assert(RE_rayobject_isAligned(oc) );  /* RayObject API assumes real data to be 4-byte aligned */
-
-       oc->rayobj.api = &octree_api;
-
-       oc->ocres = ocres;
-
-       oc->ro_nodes = (RayFace **)MEM_callocN(sizeof(RayFace *) * size, "octree rayobject nodes");
-       oc->ro_nodes_size = size;
-       oc->ro_nodes_used = 0;
-
-
-       return RE_rayobject_unalignRayAPI((RayObject *) oc);
-}
-
-
-static void RE_rayobject_octree_add(RayObject *tree, RayObject *node)
-{
-       Octree *oc = (Octree *)tree;
-
-       assert(RE_rayobject_isRayFace(node) );
-       assert(oc->ro_nodes_used < oc->ro_nodes_size);
-       oc->ro_nodes[oc->ro_nodes_used++] = (RayFace *)RE_rayobject_align(node);
-}
-
-static void octree_fill_rayface(Octree *oc, RayFace *face)
-{
-       float ocfac[3], rtf[4][3];
-       float co1[3], co2[3], co3[3], co4[3];
-       short rts[4][3];
-       short ocmin[3], ocmax[3];
-       char *ocface = oc->ocface;   // front, top, size view of face, to fill in
-       int a, b, c, oc1, oc2, oc3, oc4, x, y, z, ocres2;
-
-       ocfac[0] = oc->ocfacx;
-       ocfac[1] = oc->ocfacy;
-       ocfac[2] = oc->ocfacz;
-
-       ocres2 = oc->ocres * oc->ocres;
-
-       copy_v3_v3(co1, face->v1);
-       copy_v3_v3(co2, face->v2);
-       copy_v3_v3(co3, face->v3);
-       if (RE_rayface_isQuad(face))
-               copy_v3_v3(co4, face->v4);
-
-       for (c = 0; c < 3; c++) {
-               rtf[0][c] = (co1[c] - oc->min[c]) * ocfac[c];
-               rts[0][c] = (short)rtf[0][c];
-               rtf[1][c] = (co2[c] - oc->min[c]) * ocfac[c];
-               rts[1][c] = (short)rtf[1][c];
-               rtf[2][c] = (co3[c] - oc->min[c]) * ocfac[c];
-               rts[2][c] = (short)rtf[2][c];
-               if (RE_rayface_isQuad(face)) {
-                       rtf[3][c] = (co4[c] - oc->min[c]) * ocfac[c];
-                       rts[3][c] = (short)rtf[3][c];
-               }
-       }
-
-       for (c = 0; c < 3; c++) {
-               oc1 = rts[0][c];
-               oc2 = rts[1][c];
-               oc3 = rts[2][c];
-               if (!RE_rayface_isQuad(face)) {
-                       ocmin[c] = min_iii(oc1, oc2, oc3);
-                       ocmax[c] = max_iii(oc1, oc2, oc3);
-               }
-               else {
-                       oc4 = rts[3][c];
-                       ocmin[c] = min_iiii(oc1, oc2, oc3, oc4);
-                       ocmax[c] = max_iiii(oc1, oc2, oc3, oc4);
-               }
-               if (ocmax[c] > oc->ocres - 1) ocmax[c] = oc->ocres - 1;
-               if (ocmin[c] < 0) ocmin[c] = 0;
-       }
-
-       if (ocmin[0] == ocmax[0] && ocmin[1] == ocmax[1] && ocmin[2] == ocmax[2]) {
-               ocwrite(oc, face, RE_rayface_isQuad(face), ocmin[0], ocmin[1], ocmin[2], rtf);
-       }
-       else {
-
-               d2dda(oc, 0, 1, 0, 1, ocface + ocres2, rts, rtf);
-               d2dda(oc, 0, 1, 0, 2, ocface, rts, rtf);
-               d2dda(oc, 0, 1, 1, 2, ocface + 2 * ocres2, rts, rtf);
-               d2dda(oc, 1, 2, 0, 1, ocface + ocres2, rts, rtf);
-               d2dda(oc, 1, 2, 0, 2, ocface, rts, rtf);
-               d2dda(oc, 1, 2, 1, 2, ocface + 2 * ocres2, rts, rtf);
-               if (!RE_rayface_isQuad(face)) {
-                       d2dda(oc, 2, 0, 0, 1, ocface + ocres2, rts, rtf);
-                       d2dda(oc, 2, 0, 0, 2, ocface, rts, rtf);
-                       d2dda(oc, 2, 0, 1, 2, ocface + 2 * ocres2, rts, rtf);
-               }
-               else {
-                       d2dda(oc, 2, 3, 0, 1, ocface + ocres2, rts, rtf);
-                       d2dda(oc, 2, 3, 0, 2, ocface, rts, rtf);
-                       d2dda(oc, 2, 3, 1, 2, ocface + 2 * ocres2, rts, rtf);
-                       d2dda(oc, 3, 0, 0, 1, ocface + ocres2, rts, rtf);
-                       d2dda(oc, 3, 0, 0, 2, ocface, rts, rtf);
-                       d2dda(oc, 3, 0, 1, 2, ocface + 2 * ocres2, rts, rtf);
-               }
-               /* nothing todo with triangle..., just fills :) */
-               filltriangle(oc, 0, 1, ocface + ocres2, ocmin, ocmax);
-               filltriangle(oc, 0, 2, ocface, ocmin, ocmax);
-               filltriangle(oc, 1, 2, ocface + 2 * ocres2, ocmin, ocmax);
-
-               /* init static vars here */
-               face_in_node(face, 0, 0, 0, rtf);
-
-               for (x = ocmin[0]; x <= ocmax[0]; x++) {
-                       a = oc->ocres * x;
-                       for (y = ocmin[1]; y <= ocmax[1]; y++) {
-                               if (ocface[a + y + ocres2]) {
-                                       b = oc->ocres * y + 2 * ocres2;
-                                       for (z = ocmin[2]; z <= ocmax[2]; z++) {
-                                               if (ocface[b + z] && ocface[a + z]) {
-                                                       if (face_in_node(NULL, x, y, z, rtf))
-                                                               ocwrite(oc, face, RE_rayface_isQuad(face), x, y, z, rtf);
-                                               }
-                                       }
-                               }
-                       }
-               }
-
-               /* same loops to clear octree, doubt it can be done smarter */
-               for (x = ocmin[0]; x <= ocmax[0]; x++) {
-                       a = oc->ocres * x;
-                       for (y = ocmin[1]; y <= ocmax[1]; y++) {
-                               /* x-y */
-                               ocface[a + y + ocres2] = 0;
-
-                               b = oc->ocres * y + 2 * ocres2;
-                               for (z = ocmin[2]; z <= ocmax[2]; z++) {
-                                       /* y-z */
-                                       ocface[b + z] = 0;
-                                       /* x-z */
-                                       ocface[a + z] = 0;
-                               }
-                       }
-               }
-       }
-}
-
-static void RE_rayobject_octree_done(RayObject *tree)
-{
-       Octree *oc = (Octree *)tree;
-       int c;
-       float t00, t01, t02;
-       int ocres2 = oc->ocres * oc->ocres;
-
-       INIT_MINMAX(oc->min, oc->max);
-
-       /* Calculate Bounding Box */
-       for (c = 0; c < oc->ro_nodes_used; c++)
-               RE_rayobject_merge_bb(RE_rayobject_unalignRayFace(oc->ro_nodes[c]), oc->min, oc->max);
-
-       /* Alloc memory */
-       oc->adrbranch = (Branch **)MEM_callocN(sizeof(void *) * BRANCH_ARRAY, "octree branches");
-       oc->adrnode = (Node **)MEM_callocN(sizeof(void *) * NODE_ARRAY, "octree nodes");
-
-       oc->adrbranch[0] = (Branch *)MEM_callocN(4096 * sizeof(Branch), "makeoctree");
-
-       /* the lookup table, per face, for which nodes to fill in */
-       oc->ocface = (char *)MEM_callocN(3 * ocres2 + 8, "ocface");
-       memset(oc->ocface, 0, 3 * ocres2);
-
-       for (c = 0; c < 3; c++) { /* octree enlarge, still needed? */
-               oc->min[c] -= 0.01f;
-               oc->max[c] += 0.01f;
-       }
-
-       t00 = oc->max[0] - oc->min[0];
-       t01 = oc->max[1] - oc->min[1];
-       t02 = oc->max[2] - oc->min[2];
-
-       /* this minus 0.1 is old safety... seems to be needed? */
-       oc->ocfacx = (oc->ocres - 0.1f) / t00;
-       oc->ocfacy = (oc->ocres - 0.1f) / t01;
-       oc->ocfacz = (oc->ocres - 0.1f) / t02;
-
-       oc->ocsize = sqrtf(t00 * t00 + t01 * t01 + t02 * t02);  /* global, max size octree */
-
-       for (c = 0; c < oc->ro_nodes_used; c++) {
-               octree_fill_rayface(oc, oc->ro_nodes[c]);
-       }
-
-       MEM_freeN(oc->ocface);
-       oc->ocface = NULL;
-       MEM_freeN(oc->ro_nodes);
-       oc->ro_nodes = NULL;
-
-#if 0
-       printf("%f %f - %f\n", oc->min[0], oc->max[0], oc->ocfacx);
-       printf("%f %f - %f\n", oc->min[1], oc->max[1], oc->ocfacy);
-       printf("%f %f - %f\n", oc->min[2], oc->max[2], oc->ocfacz);
-#endif
-}
-
-static void RE_rayobject_octree_bb(RayObject *tree, float *min, float *max)
-{
-       Octree *oc = (Octree *)tree;
-       DO_MINMAX(oc->min, min, max);
-       DO_MINMAX(oc->max, min, max);
-}
-
-/* check all faces in this node */
-static int testnode(Octree *UNUSED(oc), Isect *is, Node *no, OcVal ocval)
-{
-       short nr = 0;
-
-       /* return on any first hit */
-       if (is->mode == RE_RAY_SHADOW) {
-
-               for (; no; no = no->next) {
-                       for (nr = 0; nr < 8; nr++) {
-                               RayFace *face = no->v[nr];
-                               OcVal     *ov = no->ov + nr;
-
-                               if (!face) break;
-
-                               if ( (ov->ocx & ocval.ocx) && (ov->ocy & ocval.ocy) && (ov->ocz & ocval.ocz) ) {
-                                       if (RE_rayobject_intersect(RE_rayobject_unalignRayFace(face), is) )
-                                               return 1;
-                               }
-                       }
-               }
-       }
-       else {
-               /* else mirror or glass or shadowtra, return closest face  */
-               int found = 0;
-
-               for (; no; no = no->next) {
-                       for (nr = 0; nr < 8; nr++) {
-                               RayFace *face = no->v[nr];
-                               OcVal     *ov = no->ov + nr;
-
-                               if (!face) break;
-
-                               if ( (ov->ocx & ocval.ocx) && (ov->ocy & ocval.ocy) && (ov->ocz & ocval.ocz) ) {
-                                       if (RE_rayobject_intersect(RE_rayobject_unalignRayFace(face), is) ) {
-                                               found = 1;
-                                       }
-                               }
-                       }
-               }
-
-               return found;
-       }
-
-       return 0;
-}
-
-/* find the Node for the octree coord x y z */
-static Node *ocread(Octree *oc, int x, int y, int z)
-{
-       Branch *br;
-       int oc1;
-
-       x <<= 2;
-       y <<= 1;
-
-       br = oc->adrbranch[0];
-
-       if (oc->ocres == 512) {
-               oc1 = ((x & 1024) + (y & 512) + (z & 256)) >> 8;
-               br = br->b[oc1];
-               if (br == NULL) {
-                       return NULL;
-               }
-       }
-       if (oc->ocres >= 256) {
-               oc1 = ((x & 512) + (y & 256) + (z & 128)) >> 7;
-               br = br->b[oc1];
-               if (br == NULL) {
-                       return NULL;
-               }
-       }
-       if (oc->ocres >= 128) {
-               oc1 = ((x & 256) + (y & 128) + (z & 64)) >> 6;
-               br = br->b[oc1];
-               if (br == NULL) {
-                       return NULL;
-               }
-       }
-
-       oc1 = ((x & 128) + (y & 64) + (z & 32)) >> 5;
-       br = br->b[oc1];
-       if (br) {
-               oc1 = ((x & 64) + (y & 32) + (z & 16)) >> 4;
-               br = br->b[oc1];
-               if (br) {
-                       oc1 = ((x & 32) + (y & 16) + (z & 8)) >> 3;
-                       br = br->b[oc1];
-                       if (br) {
-                               oc1 = ((x & 16) + (y & 8) + (z & 4)) >> 2;
-                               br = br->b[oc1];
-                               if (br) {
-                                       oc1 = ((x & 8) + (y & 4) + (z & 2)) >> 1;
-                                       br = br->b[oc1];
-                                       if (br) {
-                                               oc1 = ((x & 4) + (y & 2) + (z & 1));
-                                               return (Node *)br->b[oc1];
-                                       }
-                               }
-                       }
-               }
-       }
-
-       return NULL;
-}
-
-static int cliptest(float p, float q, float *u1, float *u2)
-{
-       float r;
-
-       if (p < 0.0f) {
-               if (q < p) return 0;
-               else if (q < 0.0f) {
-                       r = q / p;
-                       if (r > *u2) return 0;
-                       else if (r > *u1) *u1 = r;
-               }
-       }
-       else {
-               if (p > 0.0f) {
-                       if (q < 0.0f) return 0;
-                       else if (q < p) {
-                               r = q / p;
-                               if (r < *u1) return 0;
-                               else if (r < *u2) *u2 = r;
-                       }
-               }
-               else if (q < 0.0f) return 0;
-       }
-       return 1;
-}
-
-/* extensive coherence checks/storage cancels out the benefit of it, and gives errors... we
- * need better methods, sample code commented out below (ton) */
-
-#if 0
-
-in top : static int coh_nodes[16 * 16 * 16][6];
-in makeoctree : memset(coh_nodes, 0, sizeof(coh_nodes));
-
-static void add_coherence_test(int ocx1, int ocx2, int ocy1, int ocy2, int ocz1, int ocz2)
-{
-       short *sp;
-
-       sp = coh_nodes[(ocx2 & 15) + 16 * (ocy2 & 15) + 256 * (ocz2 & 15)];
-       sp[0] = ocx1; sp[1] = ocy1; sp[2] = ocz1;
-       sp[3] = ocx2; sp[4] = ocy2; sp[5] = ocz2;
-
-}
-
-static int do_coherence_test(int ocx1, int ocx2, int ocy1, int ocy2, int ocz1, int ocz2)
-{
-       short *sp;
-
-       sp = coh_nodes[(ocx2 & 15) + 16 * (ocy2 & 15) + 256 * (ocz2 & 15)];
-       if (sp[0] == ocx1 && sp[1] == ocy1 && sp[2] == ocz1 &&
-           sp[3] == ocx2 && sp[4] == ocy2 && sp[5] == ocz2) return 1;
-       return 0;
-}
-
-#endif
-
-/* return 1: found valid intersection */
-/* starts with is->orig.face */
-static int RE_rayobject_octree_intersect(RayObject *tree, Isect *is)
-{
-       Octree *oc = (Octree *)tree;
-       Node *no;
-       OcVal ocval;
-       float vec1[3], vec2[3], start[3], end[3];
-       float u1, u2, ox1, ox2, oy1, oy2, oz1, oz2;
-       float lambda_o, lambda_x, ldx, lambda_y, ldy, lambda_z, ldz, dda_lambda;
-       float o_lambda = 0;
-       int dx, dy, dz;
-       int xo, yo, zo, c1 = 0;
-       int ocx1, ocx2, ocy1, ocy2, ocz1, ocz2;
-
-       /* clip with octree */
-       if (oc->branchcount == 0) return 0;
-
-       /* do this before intersect calls */
-#if 0
-       is->facecontr = NULL;                /* to check shared edge */
-       is->obcontr = 0;
-       is->faceisect = is->isect = 0;        /* shared edge, quad half flag */
-       is->userdata = oc->userdata;
-#endif
-
-       copy_v3_v3(start, is->start);
-       madd_v3_v3v3fl(end, is->start, is->dir, is->dist);
-       ldx = is->dir[0] * is->dist;
-       o_lambda = is->dist;
-       u1 = 0.0f;
-       u2 = 1.0f;
-
-       /* clip with octree cube */
-       if (cliptest(-ldx, start[0] - oc->min[0], &u1, &u2)) {
-               if (cliptest(ldx, oc->max[0] - start[0], &u1, &u2)) {
-                       ldy = is->dir[1] * is->dist;
-                       if (cliptest(-ldy, start[1] - oc->min[1], &u1, &u2)) {
-                               if (cliptest(ldy, oc->max[1] - start[1], &u1, &u2)) {
-                                       ldz = is->dir[2] * is->dist;
-                                       if (cliptest(-ldz, start[2] - oc->min[2], &u1, &u2)) {
-                                               if (cliptest(ldz, oc->max[2] - start[2], &u1, &u2)) {
-                                                       c1 = 1;
-                                                       if (u2 < 1.0f) {
-                                                               end[0] = start[0] + u2 * ldx;
-                                                               end[1] = start[1] + u2 * ldy;
-                                                               end[2] = start[2] + u2 * ldz;
-                                                       }
-
-                                                       if (u1 > 0.0f) {
-                                                               start[0] += u1 * ldx;
-                                                               start[1] += u1 * ldy;
-                                                               start[2] += u1 * ldz;
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-               }
-       }
-
-       if (c1 == 0) return 0;
-
-       /* reset static variables in ocread */
-       //ocread(oc, oc->ocres, 0, 0);
-
-       /* setup 3dda to traverse octree */
-       ox1 = (start[0] - oc->min[0]) * oc->ocfacx;
-       oy1 = (start[1] - oc->min[1]) * oc->ocfacy;
-       oz1 = (start[2] - oc->min[2]) * oc->ocfacz;
-       ox2 = (end[0] - oc->min[0]) * oc->ocfacx;
-       oy2 = (end[1] - oc->min[1]) * oc->ocfacy;
-       oz2 = (end[2] - oc->min[2]) * oc->ocfacz;
-
-       ocx1 = (int)ox1;
-       ocy1 = (int)oy1;
-       ocz1 = (int)oz1;
-       ocx2 = (int)ox2;
-       ocy2 = (int)oy2;
-       ocz2 = (int)oz2;
-
-       if (ocx1 == ocx2 && ocy1 == ocy2 && ocz1 == ocz2) {
-               no = ocread(oc, ocx1, ocy1, ocz1);
-               if (no) {
-                       /* exact intersection with node */
-                       vec1[0] = ox1; vec1[1] = oy1; vec1[2] = oz1;
-                       vec2[0] = ox2; vec2[1] = oy2; vec2[2] = oz2;
-                       calc_ocval_ray(&ocval, (float)ocx1, (float)ocy1, (float)ocz1, vec1, vec2);
-                       if (testnode(oc, is, no, ocval) ) return 1;
-               }
-       }
-       else {
-               int found = 0;
-               //static int coh_ocx1, coh_ocx2, coh_ocy1, coh_ocy2, coh_ocz1, coh_ocz2;
-               float dox, doy, doz;
-               int eqval;
-
-               /* calc lambda en ld */
-               dox = ox1 - ox2;
-               doy = oy1 - oy2;
-               doz = oz1 - oz2;
-
-               if (dox < -FLT_EPSILON) {
-                       ldx = -1.0f / dox;
-                       lambda_x = (ocx1 - ox1 + 1.0f) * ldx;
-                       dx = 1;
-               }
-               else if (dox > FLT_EPSILON) {
-                       ldx = 1.0f / dox;
-                       lambda_x = (ox1 - ocx1) * ldx;
-                       dx = -1;
-               }
-               else {
-                       lambda_x = 1.0f;
-                       ldx = 0;
-                       dx = 0;
-               }
-
-               if (doy < -FLT_EPSILON) {
-                       ldy = -1.0f / doy;
-                       lambda_y = (ocy1 - oy1 + 1.0f) * ldy;
-                       dy = 1;
-               }
-               else if (doy > FLT_EPSILON) {
-                       ldy = 1.0f / doy;
-                       lambda_y = (oy1 - ocy1) * ldy;
-                       dy = -1;
-               }
-               else {
-                       lambda_y = 1.0f;
-                       ldy = 0;
-                       dy = 0;
-               }
-
-               if (doz < -FLT_EPSILON) {
-                       ldz = -1.0f / doz;
-                       lambda_z = (ocz1 - oz1 + 1.0f) * ldz;
-                       dz = 1;
-               }
-               else if (doz > FLT_EPSILON) {
-                       ldz = 1.0f / doz;
-                       lambda_z = (oz1 - ocz1) * ldz;
-                       dz = -1;
-               }
-               else {
-                       lambda_z = 1.0f;
-                       ldz = 0;
-                       dz = 0;
-               }
-
-               xo = ocx1; yo = ocy1; zo = ocz1;
-               dda_lambda = min_fff(lambda_x, lambda_y, lambda_z);
-
-               vec2[0] = ox1;
-               vec2[1] = oy1;
-               vec2[2] = oz1;
-
-               /* this loop has been constructed to make sure the first and last node of ray
-                * are always included, even when dda_lambda==1.0f or larger */
-
-               while (true) {
-
-                       no = ocread(oc, xo, yo, zo);
-                       if (no) {
-
-                               /* calculate ray intersection with octree node */
-                               copy_v3_v3(vec1, vec2);
-                               // dox, y, z is negative
-                               vec2[0] = ox1 - dda_lambda * dox;
-                               vec2[1] = oy1 - dda_lambda * doy;
-                               vec2[2] = oz1 - dda_lambda * doz;
-                               calc_ocval_ray(&ocval, (float)xo, (float)yo, (float)zo, vec1, vec2);
-
-                               //is->dist = (u1 + dda_lambda * (u2 - u1)) * o_lambda;
-                               if (testnode(oc, is, no, ocval) )
-                                       found = 1;
-
-                               if (is->dist < (u1 + dda_lambda * (u2 - u1)) * o_lambda)
-                                       return found;
-                       }
-
-
-                       lambda_o = dda_lambda;
-
-                       /* traversing octree nodes need careful detection of smallest values, with proper
-                        * exceptions for equal lambdas */
-                       eqval = (lambda_x == lambda_y);
-                       if (lambda_y == lambda_z) eqval += 2;
-                       if (lambda_x == lambda_z) eqval += 4;
-
-                       if (eqval) {    // only 4 cases exist!
-                               if (eqval == 7) { // x=y=z
-                                       xo += dx; lambda_x += ldx;
-                                       yo += dy; lambda_y += ldy;
-                                       zo += dz; lambda_z += ldz;
-                               }
-                               else if (eqval == 1) { // x=y
-                                       if (lambda_y < lambda_z) {
-                                               xo += dx; lambda_x += ldx;
-                                               yo += dy; lambda_y += ldy;
-                                       }
-                                       else {
-                                               zo += dz; lambda_z += ldz;
-                                       }
-                               }
-                               else if (eqval == 2) { // y=z
-                                       if (lambda_x < lambda_y) {
-                                               xo += dx; lambda_x += ldx;
-                                       }
-                                       else {
-                                               yo += dy; lambda_y += ldy;
-                                               zo += dz; lambda_z += ldz;
-                                       }
-                               }
-                               else { // x=z
-                                       if (lambda_y < lambda_x) {
-                                               yo += dy; lambda_y += ldy;
-                                       }
-                                       else {
-                                               xo += dx; lambda_x += ldx;
-                                               zo += dz; lambda_z += ldz;
-                                       }
-                               }
-                       }
-                       else {  // all three different, just three cases exist
-                               eqval = (lambda_x < lambda_y);
-                               if (lambda_y < lambda_z) eqval += 2;
-                               if (lambda_x < lambda_z) eqval += 4;
-
-                               if (eqval == 7 || eqval == 5) { // x smallest
-                                       xo += dx; lambda_x += ldx;
-                               }
-                               else if (eqval == 2 || eqval == 6) { // y smallest
-                                       yo += dy; lambda_y += ldy;
-                               }
-                               else { // z smallest
-                                       zo += dz; lambda_z += ldz;
-                               }
-
-                       }
-
-                       dda_lambda = min_fff(lambda_x, lambda_y, lambda_z);
-                       if (dda_lambda == lambda_o) break;
-                       /* to make sure the last node is always checked */
-                       if (lambda_o >= 1.0f) break;
-               }
-       }
-
-       /* reached end, no intersections found */
-       return 0;
-}
-
-
-
diff --git a/source/blender/render/intern/raytrace/rayobject_qbvh.cpp b/source/blender/render/intern/raytrace/rayobject_qbvh.cpp
deleted file mode 100644 (file)
index 8e3dd87..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * ***** 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) 2009 Blender Foundation.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): André Pinto.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/render/intern/raytrace/rayobject_qbvh.cpp
- *  \ingroup render
- */
-
-
-#include "MEM_guardedalloc.h"
-
-#include "BLI_utildefines.h"
-
-#include "vbvh.h"
-#include "svbvh.h"
-#include "reorganize.h"
-
-#ifdef __SSE__
-
-#define DFS_STACK_SIZE  256
-
-struct QBVHTree {
-       RayObject rayobj;
-
-       SVBVHNode *root;
-       MemArena *node_arena;
-
-       float cost;
-       RTBuilder *builder;
-};
-
-
-template<>
-void bvh_done<QBVHTree>(QBVHTree *obj)
-{
-       rtbuild_done(obj->builder, &obj->rayobj.control);
-
-       //TODO find a away to exactly calculate the needed memory
-       MemArena *arena1 = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "qbvh arena");
-       BLI_memarena_use_malloc(arena1);
-
-       MemArena *arena2 = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "qbvh arena 2");
-       BLI_memarena_use_malloc(arena2);
-       BLI_memarena_use_align(arena2, 16);
-
-       //Build and optimize the tree
-       //TODO do this in 1 pass (half memory usage during building)
-       VBVHNode *root = BuildBinaryVBVH<VBVHNode>(arena1, &obj->rayobj.control).transform(obj->builder);
-
-       if (RE_rayobjectcontrol_test_break(&obj->rayobj.control)) {
-               BLI_memarena_free(arena1);
-               BLI_memarena_free(arena2);
-               return;
-       }
-
-       if (root) {
-               pushup_simd<VBVHNode, 4>(root);
-               obj->root = Reorganize_SVBVH<VBVHNode>(arena2).transform(root);
-       }
-       else
-               obj->root = NULL;
-
-       //Free data
-       BLI_memarena_free(arena1);
-
-       obj->node_arena = arena2;
-       obj->cost = 1.0;
-
-       rtbuild_free(obj->builder);
-       obj->builder = NULL;
-}
-
-template<int StackSize>
-static int intersect(QBVHTree *obj, Isect *isec)
-{
-       //TODO renable hint support
-       if (RE_rayobject_isAligned(obj->root)) {
-               if (isec->mode == RE_RAY_SHADOW)
-                       return svbvh_node_stack_raycast<StackSize, true>(obj->root, isec);
-               else
-                       return svbvh_node_stack_raycast<StackSize, false>(obj->root, isec);
-       }
-       else
-               return RE_rayobject_intersect((RayObject *)obj->root, isec);
-}
-
-template<class Tree>
-static void bvh_hint_bb(Tree *tree, LCTSHint *hint, float *UNUSED(min), float *UNUSED(max))
-{
-       //TODO renable hint support
-       {
-               hint->size = 0;
-               hint->stack[hint->size++] = (RayObject *)tree->root;
-       }
-}
-/* the cast to pointer function is needed to workarround gcc bug: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11407 */
-template<class Tree, int STACK_SIZE>
-static RayObjectAPI make_api()
-{
-       static RayObjectAPI api =
-       {
-               (RE_rayobject_raycast_callback) ((int   (*)(Tree *, Isect *)) & intersect<STACK_SIZE>),
-               (RE_rayobject_add_callback)     ((void  (*)(Tree *, RayObject *)) & bvh_add<Tree>),
-               (RE_rayobject_done_callback)    ((void  (*)(Tree *))       & bvh_done<Tree>),
-               (RE_rayobject_free_callback)    ((void  (*)(Tree *))       & bvh_free<Tree>),
-               (RE_rayobject_merge_bb_callback)((void  (*)(Tree *, float *, float *)) & bvh_bb<Tree>),
-               (RE_rayobject_cost_callback)    ((float (*)(Tree *))      & bvh_cost<Tree>),
-               (RE_rayobject_hint_bb_callback) ((void  (*)(Tree *, LCTSHint *, float *, float *)) & bvh_hint_bb<Tree>)
-       };
-
-       return api;
-}
-
-template<class Tree>
-RayObjectAPI *bvh_get_api(int maxstacksize)
-{
-       static RayObjectAPI bvh_api256 = make_api<Tree, 1024>();
-
-       if (maxstacksize <= 1024) return &bvh_api256;
-       assert(maxstacksize <= 256);
-       return NULL;
-}
-
-RayObject *RE_rayobject_qbvh_create(int size)
-{
-       return bvh_create_tree<QBVHTree, DFS_STACK_SIZE>(size);
-}
-
-#else
-
-RayObject *RE_rayobject_qbvh_create(int UNUSED(size))
-{
-       puts("WARNING: SSE disabled at compile time\n");
-       return NULL;
-}
-
-#endif
diff --git a/source/blender/render/intern/raytrace/rayobject_raycounter.cpp b/source/blender/render/intern/raytrace/rayobject_raycounter.cpp
deleted file mode 100644 (file)
index 429c47f..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * ***** 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) 2009 Blender Foundation.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): André Pinto.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/render/intern/raytrace/rayobject_raycounter.cpp
- *  \ingroup render
- */
-
-
-#include "rayobject.h"
-#include "raycounter.h"
-
-#ifdef RE_RAYCOUNTER
-
-void RE_RC_INFO(RayCounter *info)
-{
-       printf("----------- Raycast counter --------\n");
-       printf("Rays total: %llu\n", info->raycast.test );
-       printf("Rays hit: %llu\n",   info->raycast.hit  );
-       printf("\n");
-       printf("BB tests: %llu\n", info->bb.test );
-       printf("BB hits: %llu\n", info->bb.hit );
-       printf("\n");
-       printf("SIMD BB tests: %llu\n", info->simd_bb.test );
-       printf("SIMD BB hits: %llu\n", info->simd_bb.hit );
-       printf("\n");
-       printf("Primitives tests: %llu\n", info->faces.test );
-       printf("Primitives hits: %llu\n", info->faces.hit );
-       printf("------------------------------------\n");
-       printf("Shadow last-hit tests per ray: %f\n", info->rayshadow_last_hit.test / ((float)info->raycast.test) );
-       printf("Shadow last-hit hits per ray: %f\n",  info->rayshadow_last_hit.hit  / ((float)info->raycast.test) );
-       printf("\n");
-       printf("Hint tests per ray: %f\n", info->raytrace_hint.test / ((float)info->raycast.test) );
-       printf("Hint hits per ray: %f\n",  info->raytrace_hint.hit  / ((float)info->raycast.test) );
-       printf("\n");
-       printf("BB tests per ray: %f\n", info->bb.test / ((float)info->raycast.test) );
-       printf("BB hits per ray: %f\n", info->bb.hit / ((float)info->raycast.test) );
-       printf("\n");
-       printf("SIMD tests per ray: %f\n", info->simd_bb.test / ((float)info->raycast.test) );
-       printf("SIMD hits per ray: %f\n", info->simd_bb.hit / ((float)info->raycast.test) );
-       printf("\n");
-       printf("Primitives tests per ray: %f\n", info->faces.test / ((float)info->raycast.test) );
-       printf("Primitives hits per ray: %f\n", info->faces.hit / ((float)info->raycast.test) );
-       printf("------------------------------------\n");
-}
-
-void RE_RC_MERGE(RayCounter *dest, RayCounter *tmp)
-{
-       dest->faces.test += tmp->faces.test;
-       dest->faces.hit  += tmp->faces.hit;
-
-       dest->bb.test += tmp->bb.test;
-       dest->bb.hit  += tmp->bb.hit;
-
-       dest->simd_bb.test += tmp->simd_bb.test;
-       dest->simd_bb.hit  += tmp->simd_bb.hit;
-
-       dest->raycast.test += tmp->raycast.test;
-       dest->raycast.hit  += tmp->raycast.hit;
-
-       dest->rayshadow_last_hit.test += tmp->rayshadow_last_hit.test;
-       dest->rayshadow_last_hit.hit  += tmp->rayshadow_last_hit.hit;
-
-       dest->raytrace_hint.test += tmp->raytrace_hint.test;
-       dest->raytrace_hint.hit  += tmp->raytrace_hint.hit;
-}
-
-#endif
diff --git a/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp b/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp
deleted file mode 100644 (file)
index 51f8978..0000000
+++ /dev/null
@@ -1,531 +0,0 @@
-/*
- * ***** 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) 2009 Blender Foundation.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): André Pinto.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/render/intern/raytrace/rayobject_rtbuild.cpp
- *  \ingroup render
- */
-
-
-#include <assert.h>
-#include <stdlib.h>
-#include <algorithm>
-
-#if __cplusplus >= 201103L
-#include <cmath>
-using std::isfinite;
-#else
-#include <math.h>
-#endif
-
-#include "rayobject_rtbuild.h"
-
-#include "MEM_guardedalloc.h"
-
-#include "BLI_math.h"
-#include "BLI_utildefines.h"
-
-static bool selected_node(RTBuilder::Object *node)
-{
-       return node->selected;
-}
-
-static void rtbuild_init(RTBuilder *b)
-{
-       b->split_axis = -1;
-       b->primitives.begin   = NULL;
-       b->primitives.end     = NULL;
-       b->primitives.maxsize = 0;
-       b->depth = 0;
-
-       for (int i = 0; i < RTBUILD_MAX_CHILDS; i++)
-               b->child_offset[i] = 0;
-
-       for (int i = 0; i < 3; i++)
-               b->sorted_begin[i] = b->sorted_end[i] = NULL;
-
-       INIT_MINMAX(b->bb, b->bb + 3);
-}
-
-RTBuilder *rtbuild_create(int size)
-{
-       RTBuilder *builder  = (RTBuilder *) MEM_mallocN(sizeof(RTBuilder), "RTBuilder");
-       RTBuilder::Object *memblock = (RTBuilder::Object *)MEM_mallocN(sizeof(RTBuilder::Object) * size, "RTBuilder.objects");
-
-
-       rtbuild_init(builder);
-
-       builder->primitives.begin = builder->primitives.end = memblock;
-       builder->primitives.maxsize = size;
-
-       for (int i = 0; i < 3; i++) {
-               builder->sorted_begin[i] = (RTBuilder::Object **)MEM_mallocN(sizeof(RTBuilder::Object *) * size, "RTBuilder.sorted_objects");
-               builder->sorted_end[i]   = builder->sorted_begin[i];
-       }
-
-
-       return builder;
-}
-
-void rtbuild_free(RTBuilder *b)
-{
-       if (b->primitives.begin) MEM_freeN(b->primitives.begin);
-
-       for (int i = 0; i < 3; i++)
-               if (b->sorted_begin[i])
-                       MEM_freeN(b->sorted_begin[i]);
-
-       MEM_freeN(b);
-}
-
-void rtbuild_add(RTBuilder *b, RayObject *o)
-{
-       float bb[6];
-
-       assert(b->primitives.begin + b->primitives.maxsize != b->primitives.end);
-
-       INIT_MINMAX(bb, bb + 3);
-       RE_rayobject_merge_bb(o, bb, bb + 3);
-
-       /* skip objects with invalid bounding boxes, nan causes DO_MINMAX
-        * to do nothing, so we get these invalid values. this shouldn't
-        * happen usually, but bugs earlier in the pipeline can cause it. */
-       if (bb[0] > bb[3] || bb[1] > bb[4] || bb[2] > bb[5])
-               return;
-       /* skip objects with inf bounding boxes */
-       if (!isfinite(bb[0]) || !isfinite(bb[1]) || !isfinite(bb[2]))
-               return;
-       if (!isfinite(bb[3]) || !isfinite(bb[4]) || !isfinite(bb[5]))
-               return;
-       /* skip objects with zero bounding box, they are of no use, and
-        * will give problems in rtbuild_heuristic_object_split later */
-       if (bb[0] == bb[3] && bb[1] == bb[4] && bb[2] == bb[5])
-               return;
-
-       copy_v3_v3(b->primitives.end->bb, bb);
-       copy_v3_v3(b->primitives.end->bb + 3, bb + 3);
-       b->primitives.end->obj = o;
-       b->primitives.end->cost = RE_rayobject_cost(o);
-
-       for (int i = 0; i < 3; i++) {
-               *(b->sorted_end[i]) = b->primitives.end;
-               b->sorted_end[i]++;
-       }
-       b->primitives.end++;
-}
-
-int rtbuild_size(RTBuilder *b)
-{
-       return b->sorted_end[0] - b->sorted_begin[0];
-}
-
-
-template<class Obj, int Axis>
-static bool obj_bb_compare(const Obj &a, const Obj &b)
-{
-       if (a->bb[Axis] != b->bb[Axis])
-               return a->bb[Axis] < b->bb[Axis];
-       return a->obj < b->obj;
-}
-
-template<class Item>
-static void object_sort(Item *begin, Item *end, int axis)
-{
-       if (axis == 0) return std::sort(begin, end, obj_bb_compare<Item, 0> );
-       if (axis == 1) return std::sort(begin, end, obj_bb_compare<Item, 1> );
-       if (axis == 2) return std::sort(begin, end, obj_bb_compare<Item, 2> );
-       assert(false);
-}
-
-void rtbuild_done(RTBuilder *b, RayObjectControl *ctrl)
-{
-       for (int i = 0; i < 3; i++) {
-               if (b->sorted_begin[i]) {
-                       if (RE_rayobjectcontrol_test_break(ctrl)) break;
-                       object_sort(b->sorted_begin[i], b->sorted_end[i], i);
-               }
-       }
-}
-
-RayObject *rtbuild_get_primitive(RTBuilder *b, int index)
-{
-       return b->sorted_begin[0][index]->obj;
-}
-
-RTBuilder *rtbuild_get_child(RTBuilder *b, int child, RTBuilder *tmp)
-{
-       rtbuild_init(tmp);
-
-       tmp->depth = b->depth + 1;
-
-       for (int i = 0; i < 3; i++)
-               if (b->sorted_begin[i]) {
-                       tmp->sorted_begin[i] = b->sorted_begin[i] +  b->child_offset[child];
-                       tmp->sorted_end[i] = b->sorted_begin[i] +  b->child_offset[child + 1];
-               }
-               else {
-                       tmp->sorted_begin[i] = NULL;
-                       tmp->sorted_end[i] = NULL;
-               }
-
-       return tmp;
-}
-
-static void rtbuild_calc_bb(RTBuilder *b)
-{
-       if (b->bb[0] == 1.0e30f) {
-               for (RTBuilder::Object **index = b->sorted_begin[0]; index != b->sorted_end[0]; index++)
-                       RE_rayobject_merge_bb( (*index)->obj, b->bb, b->bb + 3);
-       }
-}
-
-void rtbuild_merge_bb(RTBuilder *b, float min[3], float max[3])
-{
-       rtbuild_calc_bb(b);
-       DO_MIN(b->bb, min);
-       DO_MAX(b->bb + 3, max);
-}
-
-#if 0
-int rtbuild_get_largest_axis(RTBuilder *b)
-{
-       rtbuild_calc_bb(b);
-       return bb_largest_axis(b->bb, b->bb + 3);
-}
-
-//Left balanced tree
-int rtbuild_mean_split(RTBuilder *b, int nchilds, int axis)
-{
-       int i;
-       int mleafs_per_child, Mleafs_per_child;
-       int tot_leafs  = rtbuild_size(b);
-       int missing_leafs;
-
-       long long s;
-
-       assert(nchilds <= RTBUILD_MAX_CHILDS);
-
-       //TODO optimize calc of leafs_per_child
-       for (s = nchilds; s < tot_leafs; s *= nchilds) ;
-       Mleafs_per_child = s / nchilds;
-       mleafs_per_child = Mleafs_per_child / nchilds;
-
-       //split min leafs per child
-       b->child_offset[0] = 0;
-       for (i = 1; i <= nchilds; i++)
-               b->child_offset[i] = mleafs_per_child;
-
-       //split remaining leafs
-       missing_leafs = tot_leafs - mleafs_per_child * nchilds;
-       for (i = 1; i <= nchilds; i++)
-       {
-               if (missing_leafs > Mleafs_per_child - mleafs_per_child)
-               {
-                       b->child_offset[i] += Mleafs_per_child - mleafs_per_child;
-                       missing_leafs -= Mleafs_per_child - mleafs_per_child;
-               }
-               else {
-                       b->child_offset[i] += missing_leafs;
-                       missing_leafs = 0;
-                       break;
-               }
-       }
-
-       //adjust for accumulative offsets
-       for (i = 1; i <= nchilds; i++)
-               b->child_offset[i] += b->child_offset[i - 1];
-
-       //Count created childs
-       for (i = nchilds; b->child_offset[i] == b->child_offset[i - 1]; i--) ;
-       split_leafs(b, b->child_offset, i, axis);
-
-       assert(b->child_offset[0] == 0 && b->child_offset[i] == tot_leafs);
-       return i;
-}
-
-
-int rtbuild_mean_split_largest_axis(RTBuilder *b, int nchilds)
-{
-       int axis = rtbuild_get_largest_axis(b);
-       return rtbuild_mean_split(b, nchilds, axis);
-}
-#endif
-
-/*
- * "separators" is an array of dim NCHILDS-1
- * and indicates where to cut the childs
- */
-#if 0
-int rtbuild_median_split(RTBuilder *b, float *separators, int nchilds, int axis)
-{
-       int size = rtbuild_size(b);
-
-       assert(nchilds <= RTBUILD_MAX_CHILDS);
-       if (size <= nchilds)
-       {
-               return rtbuild_mean_split(b, nchilds, axis);
-       }
-       else {
-               int i;
-
-               b->split_axis = axis;
-
-               //Calculate child offsets
-               b->child_offset[0] = 0;
-               for (i = 0; i < nchilds - 1; i++)
-                       b->child_offset[i + 1] = split_leafs_by_plane(b, b->child_offset[i], size, separators[i]);
-               b->child_offset[nchilds] = size;
-
-               for (i = 0; i < nchilds; i++)
-                       if (b->child_offset[i + 1] - b->child_offset[i] == size)
-                               return rtbuild_mean_split(b, nchilds, axis);
-
-               return nchilds;
-       }
-}
-
-int rtbuild_median_split_largest_axis(RTBuilder *b, int nchilds)
-{
-       int la, i;
-       float separators[RTBUILD_MAX_CHILDS];
-
-       rtbuild_calc_bb(b);
-
-       la = bb_largest_axis(b->bb, b->bb + 3);
-       for (i = 1; i < nchilds; i++)
-               separators[i - 1] = (b->bb[la + 3] - b->bb[la]) * i / nchilds;
-
-       return rtbuild_median_split(b, separators, nchilds, la);
-}
-#endif
-
-//Heuristics Object Splitter
-
-
-struct SweepCost {
-       float bb[6];
-       float cost;
-};
-
-/* Object Surface Area Heuristic splitter */
-int rtbuild_heuristic_object_split(RTBuilder *b, int nchilds)
-{
-       int size = rtbuild_size(b);
-       assert(nchilds == 2);
-       assert(size > 1);
-       int baxis = -1, boffset = 0;
-
-       if (size > nchilds) {
-               if (b->depth > RTBUILD_MAX_SAH_DEPTH) {
-                       // for degenerate cases we avoid running out of stack space
-                       // by simply splitting the children in the middle
-                       b->child_offset[0] = 0;
-                       b->child_offset[1] = (size+1)/2;
-                       b->child_offset[2] = size;
-                       return 2;
-               }
-
-               float bcost = FLT_MAX;
-               baxis = -1;
-               boffset = size / 2;
-
-               SweepCost *sweep = (SweepCost *)MEM_mallocN(sizeof(SweepCost) * size, "RTBuilder.HeuristicSweep");
-
-               for (int axis = 0; axis < 3; axis++) {
-                       SweepCost sweep_left;
-
-                       RTBuilder::Object **obj = b->sorted_begin[axis];
-
-//                     float right_cost = 0;
-                       for (int i = size - 1; i >= 0; i--) {
-                               if (i == size - 1) {
-                                       copy_v3_v3(sweep[i].bb, obj[i]->bb);
-                                       copy_v3_v3(sweep[i].bb + 3, obj[i]->bb + 3);
-                                       sweep[i].cost = obj[i]->cost;
-                               }
-                               else {
-                                       sweep[i].bb[0] = min_ff(obj[i]->bb[0], sweep[i + 1].bb[0]);
-                                       sweep[i].bb[1] = min_ff(obj[i]->bb[1], sweep[i + 1].bb[1]);
-                                       sweep[i].bb[2] = min_ff(obj[i]->bb[2], sweep[i + 1].bb[2]);
-                                       sweep[i].bb[3] = max_ff(obj[i]->bb[3], sweep[i + 1].bb[3]);
-                                       sweep[i].bb[4] = max_ff(obj[i]->bb[4], sweep[i + 1].bb[4]);
-                                       sweep[i].bb[5] = max_ff(obj[i]->bb[5], sweep[i + 1].bb[5]);
-                                       sweep[i].cost  = obj[i]->cost + sweep[i + 1].cost;
-                               }
-//                             right_cost += obj[i]->cost;
-                       }
-
-                       sweep_left.bb[0] = obj[0]->bb[0];
-                       sweep_left.bb[1] = obj[0]->bb[1];
-                       sweep_left.bb[2] = obj[0]->bb[2];
-                       sweep_left.bb[3] = obj[0]->bb[3];
-                       sweep_left.bb[4] = obj[0]->bb[4];
-                       sweep_left.bb[5] = obj[0]->bb[5];
-                       sweep_left.cost  = obj[0]->cost;
-
-//                     right_cost -= obj[0]->cost;     if (right_cost < 0) right_cost = 0;
-
-                       for (int i = 1; i < size; i++) {
-                               //Worst case heuristic (cost of each child is linear)
-                               float hcost, left_side, right_side;
-
-                               // not using log seems to have no impact on raytracing perf, but
-                               // makes tree construction quicker, left out for now to test (brecht)
-                               // left_side  = bb_area(sweep_left.bb, sweep_left.bb + 3) * (sweep_left.cost + logf((float)i));
-                               // right_side = bb_area(sweep[i].bb,   sweep[i].bb   + 3) * (sweep[i].cost   + logf((float)size - i));
-                               left_side = bb_area(sweep_left.bb, sweep_left.bb + 3) * (sweep_left.cost);
-                               right_side = bb_area(sweep[i].bb, sweep[i].bb + 3) * (sweep[i].cost);
-                               hcost = left_side + right_side;
-
-                               assert(left_side >= 0);
-                               assert(right_side >= 0);
-
-                               if (left_side > bcost) break;   //No way we can find a better heuristic in this axis
-
-                               assert(hcost >= 0);
-                               // this makes sure the tree built is the same whatever is the order of the sorting axis
-                               if (hcost < bcost || (hcost == bcost && axis < baxis)) {
-                                       bcost = hcost;
-                                       baxis = axis;
-                                       boffset = i;
-                               }
-                               DO_MIN(obj[i]->bb,   sweep_left.bb);
-                               DO_MAX(obj[i]->bb + 3, sweep_left.bb + 3);
-
-                               sweep_left.cost += obj[i]->cost;
-//                             right_cost -= obj[i]->cost; if (right_cost < 0) right_cost = 0;
-                       }
-
-                       //assert(baxis >= 0 && baxis < 3);
-                       if (!(baxis >= 0 && baxis < 3))
-                               baxis = 0;
-               }
-
-
-               MEM_freeN(sweep);
-       }
-       else if (size == 2) {
-               baxis = 0;
-               boffset = 1;
-       }
-       else if (size == 1) {
-               b->child_offset[0] = 0;
-               b->child_offset[1] = 1;
-               return 1;
-       }
-
-       b->child_offset[0] = 0;
-       b->child_offset[1] = boffset;
-       b->child_offset[2] = size;
-
-
-       /* Adjust sorted arrays for childs */
-       for (int i = 0; i < boffset; i++) b->sorted_begin[baxis][i]->selected = true;
-       for (int i = boffset; i < size; i++) b->sorted_begin[baxis][i]->selected = false;
-       for (int i = 0; i < 3; i++)
-               std::stable_partition(b->sorted_begin[i], b->sorted_end[i], selected_node);
-
-       return nchilds;
-}
-
-/*
- * Helper code
- * PARTITION code / used on mean-split
- * basically this a std::nth_element (like on C++ STL algorithm)
- */
-#if 0
-static void split_leafs(RTBuilder *b, int *nth, int partitions, int split_axis)
-{
-       int i;
-       b->split_axis = split_axis;
-
-       for (i = 0; i < partitions - 1; i++)
-       {
-               assert(nth[i] < nth[i + 1] && nth[i + 1] < nth[partitions]);
-
-               if (split_axis == 0) std::nth_element(b, nth[i],  nth[i + 1], nth[partitions], obj_bb_compare<RTBuilder::Object, 0>);
-               if (split_axis == 1) std::nth_element(b, nth[i],  nth[i + 1], nth[partitions], obj_bb_compare<RTBuilder::Object, 1>);
-               if (split_axis == 2) std::nth_element(b, nth[i],  nth[i + 1], nth[partitions], obj_bb_compare<RTBuilder::Object, 2>);
-       }
-}
-#endif
-
-/*
- * Bounding Box utils
- */
-float bb_volume(const float min[3], const float max[3])
-{
-       return (max[0] - min[0]) * (max[1] - min[1]) * (max[2] - min[2]);
-}
-
-float bb_area(const float min[3], const float max[3])
-{
-       float sub[3], a;
-       sub[0] = max[0] - min[0];
-       sub[1] = max[1] - min[1];
-       sub[2] = max[2] - min[2];
-
-       a = (sub[0] * sub[1] + sub[0] * sub[2] + sub[1] * sub[2]) * 2.0f;
-       /* used to have an assert() here on negative results
-        * however, in this case its likely some overflow or ffast math error.
-        * so just return 0.0f instead. */
-       return a < 0.0f ? 0.0f : a;
-}
-
-int bb_largest_axis(const float min[3], const float max[3])
-{
-       float sub[3];
-
-       sub[0] = max[0] - min[0];
-       sub[1] = max[1] - min[1];
-       sub[2] = max[2] - min[2];
-       if (sub[0] > sub[1]) {
-               if (sub[0] > sub[2])
-                       return 0;
-               else
-                       return 2;
-       }
-       else {
-               if (sub[1] > sub[2])
-                       return 1;
-               else
-                       return 2;
-       }
-}
-
-/* only returns 0 if merging inner and outerbox would create a box larger than outer box */
-int bb_fits_inside(const float outer_min[3], const float outer_max[3],
-                   const float inner_min[3], const float inner_max[3])
-{
-       int i;
-       for (i = 0; i < 3; i++)
-               if (outer_min[i] > inner_min[i]) return 0;
-
-       for (i = 0; i < 3; i++)
-               if (outer_max[i] < inner_max[i]) return 0;
-
-       return 1;
-}
diff --git a/source/blender/render/intern/raytrace/rayobject_rtbuild.h b/source/blender/render/intern/raytrace/rayobject_rtbuild.h
deleted file mode 100644 (file)
index fc42bc3..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * ***** 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) 2009 Blender Foundation.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): André Pinto.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/render/intern/raytrace/rayobject_rtbuild.h
- *  \ingroup render
- */
-
-#ifndef __RAYOBJECT_RTBUILD_H__
-#define __RAYOBJECT_RTBUILD_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "rayobject.h"
-
-
-/*
- * Ray Tree Builder
- *     this structs helps building any type of tree
- *     it contains several methods to organize/split nodes
- *     allowing to create a given tree on the fly.
- *
- * Idea is that other trees BVH, BIH can use this code to
- * generate with simple calls, and then convert to the theirs
- * specific structure on the fly.
- */
-#define RTBUILD_MAX_CHILDS     32
-#define RTBUILD_MAX_SAH_DEPTH  256
-
-
-typedef struct RTBuilder {
-       struct Object {
-               RayObject *obj;
-               float cost;
-               float bb[6];
-               int selected;
-       };
-
-       /* list to all primitives added in this tree */
-       struct {
-               Object *begin, *end;
-               int maxsize;
-       } primitives;
-
-       /* sorted list of rayobjects */
-       struct Object **sorted_begin[3], **sorted_end[3];
-
-       /* axis used (if any) on the split method */
-       int split_axis;
-
-       /* child partitions calculated during splitting */
-       int child_offset[RTBUILD_MAX_CHILDS + 1];
-
-//     int child_sorted_axis; /* -1 if not sorted */
-
-       float bb[6];
-
-       /* current depth */
-       int depth;
-} RTBuilder;
-
-/* used during creation */
-RTBuilder *rtbuild_create(int size);
-void rtbuild_free(RTBuilder *b);
-void rtbuild_add(RTBuilder *b, RayObject *o);
-void rtbuild_done(RTBuilder *b, RayObjectControl *c);
-void rtbuild_merge_bb(RTBuilder *b, float min[3], float max[3]);
-int rtbuild_size(RTBuilder *b);
-
-RayObject *rtbuild_get_primitive(RTBuilder *b, int offset);
-
-/* used during tree reorganization */
-RTBuilder *rtbuild_get_child(RTBuilder *b, int child, RTBuilder *tmp);
-
-/* Calculates child partitions and returns number of efectively needed partitions */
-int rtbuild_get_largest_axis(RTBuilder *b);
-
-//Object partition
-int rtbuild_mean_split(RTBuilder *b, int nchilds, int axis);
-int rtbuild_mean_split_largest_axis(RTBuilder *b, int nchilds);
-
-int rtbuild_heuristic_object_split(RTBuilder *b, int nchilds);
-
-//Space partition
-int rtbuild_median_split(RTBuilder *b, float *separators, int nchilds, int axis);
-int rtbuild_median_split_largest_axis(RTBuilder *b, int nchilds);
-
-
-/* bb utils */
-float bb_area(const float min[3], const float max[3]);
-float bb_volume(const float min[3], const float max[3]);
-int bb_largest_axis(const float min[3], const float max[3]);
-int bb_fits_inside(const float  outer_min[3], const float  outer_max[3],
-                   const float  inner_min[3], const float  inner_max[3]);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif  /* __RAYOBJECT_RTBUILD_H__ */
diff --git a/source/blender/render/intern/raytrace/rayobject_svbvh.cpp b/source/blender/render/intern/raytrace/rayobject_svbvh.cpp
deleted file mode 100644 (file)
index fcd692f..0000000
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * ***** 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) 2009 Blender Foundation.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): André Pinto.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/render/intern/raytrace/rayobject_svbvh.cpp
- *  \ingroup render
- */
-
-
-#include "MEM_guardedalloc.h"
-
-#include "BLI_utildefines.h"
-
-#include "vbvh.h"
-#include "svbvh.h"
-#include "reorganize.h"
-
-#ifdef __SSE__
-
-#define DFS_STACK_SIZE  256
-
-struct SVBVHTree {
-       RayObject rayobj;
-
-       SVBVHNode *root;
-       MemArena *node_arena;
-
-       float cost;
-       RTBuilder *builder;
-};
-
-/*
- * Cost to test N childs
- */
-struct PackCost {
-       float operator()(int n)
-       {
-               return (n / 4) + ((n % 4) > 2 ? 1 : n % 4);
-       }
-};
-
-
-template<>
-void bvh_done<SVBVHTree>(SVBVHTree *obj)
-{
-       rtbuild_done(obj->builder, &obj->rayobj.control);
-
-       //TODO find a away to exactly calculate the needed memory
-       MemArena *arena1 = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "svbvh arena");
-       BLI_memarena_use_malloc(arena1);
-
-       MemArena *arena2 = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "svbvh arena2");
-       BLI_memarena_use_malloc(arena2);
-       BLI_memarena_use_align(arena2, 16);
-
-       //Build and optimize the tree
-       if (0) {
-               VBVHNode *root = BuildBinaryVBVH<VBVHNode>(arena1, &obj->rayobj.control).transform(obj->builder);
-
-               if (RE_rayobjectcontrol_test_break(&obj->rayobj.control)) {
-                       BLI_memarena_free(arena1);
-                       BLI_memarena_free(arena2);
-                       return;
-               }
-
-               reorganize(root);
-               remove_useless(root, &root);
-               bvh_refit(root);
-
-               pushup(root);
-               pushdown(root);
-               pushup_simd<VBVHNode, 4>(root);
-
-               obj->root = Reorganize_SVBVH<VBVHNode>(arena2).transform(root);
-       }
-       else {
-               //Finds the optimal packing of this tree using a given cost model
-               //TODO this uses quite a lot of memory, find ways to reduce memory usage during building
-               OVBVHNode *root = BuildBinaryVBVH<OVBVHNode>(arena1, &obj->rayobj.control).transform(obj->builder);
-
-               if (RE_rayobjectcontrol_test_break(&obj->rayobj.control)) {
-                       BLI_memarena_free(arena1);
-                       BLI_memarena_free(arena2);
-                       return;
-               }
-
-               if (root) {
-                       VBVH_optimalPackSIMD<OVBVHNode, PackCost>(PackCost()).transform(root);
-                       obj->root = Reorganize_SVBVH<OVBVHNode>(arena2).transform(root);
-               }
-               else
-                       obj->root = NULL;
-       }
-
-       //Free data
-       BLI_memarena_free(arena1);
-
-       obj->node_arena = arena2;
-       obj->cost = 1.0;
-
-       rtbuild_free(obj->builder);
-       obj->builder = NULL;
-}
-
-template<int StackSize>
-static int intersect(SVBVHTree *obj, Isect *isec)
-{
-       //TODO renable hint support
-       if (RE_rayobject_isAligned(obj->root)) {
-               if (isec->mode == RE_RAY_SHADOW)
-                       return svbvh_node_stack_raycast<StackSize, true>(obj->root, isec);
-               else
-                       return svbvh_node_stack_raycast<StackSize, false>(obj->root, isec);
-       }
-       else
-               return RE_rayobject_intersect( (RayObject *) obj->root, isec);
-}
-
-template<class Tree>
-static void bvh_hint_bb(Tree *tree, LCTSHint *hint, float *UNUSED(min), float *UNUSED(max))
-{
-       //TODO renable hint support
-       {
-               hint->size = 0;
-               hint->stack[hint->size++] = (RayObject *)tree->root;
-       }
-}
-/* the cast to pointer function is needed to workarround gcc bug: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11407 */
-template<class Tree, int STACK_SIZE>
-static RayObjectAPI make_api()
-{
-       static RayObjectAPI api =
-       {
-               (RE_rayobject_raycast_callback) ((int   (*)(Tree *, Isect *)) & intersect<STACK_SIZE>),
-               (RE_rayobject_add_callback)     ((void  (*)(Tree *, RayObject *)) & bvh_add<Tree>),
-               (RE_rayobject_done_callback)    ((void  (*)(Tree *))       & bvh_done<Tree>),
-               (RE_rayobject_free_callback)    ((void  (*)(Tree *))       & bvh_free<Tree>),
-               (RE_rayobject_merge_bb_callback)((void  (*)(Tree *, float *, float *)) & bvh_bb<Tree>),
-               (RE_rayobject_cost_callback)    ((float (*)(Tree *))      & bvh_cost<Tree>),
-               (RE_rayobject_hint_bb_callback) ((void  (*)(Tree *, LCTSHint *, float *, float *)) & bvh_hint_bb<Tree>)
-       };
-
-       return api;
-}
-
-template<class Tree>
-static RayObjectAPI *bvh_get_api(int maxstacksize)
-{
-       static RayObjectAPI bvh_api256 = make_api<Tree, 1024>();
-
-       if (maxstacksize <= 1024) return &bvh_api256;
-       assert(maxstacksize <= 256);
-       return NULL;
-}
-
-RayObject *RE_rayobject_svbvh_create(int size)
-{
-       return bvh_create_tree<SVBVHTree, DFS_STACK_SIZE>(size);
-}
-
-#else
-
-RayObject *RE_rayobject_svbvh_create(int UNUSED(size))
-{
-       puts("WARNING: SSE disabled at compile time\n");
-       return NULL;
-}
-
-#endif
diff --git a/source/blender/render/intern/raytrace/rayobject_vbvh.cpp b/source/blender/render/intern/raytrace/rayobject_vbvh.cpp
deleted file mode 100644 (file)
index b63a110..0000000
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * ***** 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) 2009 Blender Foundation.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): André Pinto.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/render/intern/raytrace/rayobject_vbvh.cpp
- *  \ingroup render
- */
-
-
-int tot_pushup   = 0;
-int tot_pushdown = 0;
-int tot_hints    = 0;
-
-#include <assert.h>
-
-#include "MEM_guardedalloc.h"
-
-#include "BLI_math.h"
-#include "BLI_memarena.h"
-#include "BLI_utildefines.h"
-
-#include "BKE_global.h"
-
-#include "rayintersection.h"
-#include "rayobject.h"
-#include "rayobject_rtbuild.h"
-
-#include "reorganize.h"
-#include "bvh.h"
-#include "vbvh.h"
-
-#include <queue>
-#include <algorithm>
-
-#define DFS_STACK_SIZE  256
-
-struct VBVHTree {
-       RayObject rayobj;
-       VBVHNode *root;
-       MemArena *node_arena;
-       float cost;
-       RTBuilder *builder;
-};
-
-/*
- * Cost to test N childs
- */
-struct PackCost {
-       float operator()(int n)
-       {
-               return n;
-       }
-};
-
-template<>
-void bvh_done<VBVHTree>(VBVHTree *obj)
-{
-       rtbuild_done(obj->builder, &obj->rayobj.control);
-
-       //TODO find a away to exactly calculate the needed memory
-       MemArena *arena1 = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "vbvh arena");
-       BLI_memarena_use_malloc(arena1);
-
-       //Build and optimize the tree
-       if (1) {
-               VBVHNode *root = BuildBinaryVBVH<VBVHNode>(arena1, &obj->rayobj.control).transform(obj->builder);
-               if (RE_rayobjectcontrol_test_break(&obj->rayobj.control)) {
-                       BLI_memarena_free(arena1);
-                       return;
-               }
-
-               if (root) {
-                       reorganize(root);
-                       remove_useless(root, &root);
-                       bvh_refit(root);
-
-                       pushup(root);
-                       pushdown(root);
-                       obj->root = root;
-               }
-               else
-                       obj->root = NULL;
-       }
-       else {
-               /* TODO */
-#if 0
-               MemArena *arena2 = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "vbvh arena2");
-               BLI_memarena_use_malloc(arena2);
-
-               //Finds the optimal packing of this tree using a given cost model
-               //TODO this uses quite a lot of memory, find ways to reduce memory usage during building
-               OVBVHNode *root = BuildBinaryVBVH<OVBVHNode>(arena2).transform(obj->builder);
-               VBVH_optimalPackSIMD<OVBVHNode, PackCost>(PackCost()).transform(root);
-               obj->root = Reorganize_VBVH<OVBVHNode>(arena1).transform(root);
-
-               BLI_memarena_free(arena2);
-#endif
-       }
-
-       //Cleanup
-       rtbuild_free(obj->builder);
-       obj->builder = NULL;
-
-       obj->node_arena = arena1;
-       obj->cost = 1.0;
-}
-
-template<int StackSize>
-static int intersect(VBVHTree *obj, Isect *isec)
-{
-       //TODO renable hint support
-       if (RE_rayobject_isAligned(obj->root)) {
-               if (isec->mode == RE_RAY_SHADOW)
-                       return bvh_node_stack_raycast<VBVHNode, StackSize, false, true>(obj->root, isec);
-               else
-                       return bvh_node_stack_raycast<VBVHNode, StackSize, false, false>(obj->root, isec);
-       }
-       else
-               return RE_rayobject_intersect( (RayObject *) obj->root, isec);
-}
-
-template<class Tree>
-static void bvh_hint_bb(Tree *tree, LCTSHint *hint, float *UNUSED(min), float *UNUSED(max))
-{
-       //TODO renable hint support
-       {
-               hint->size = 0;
-               hint->stack[hint->size++] = (RayObject *)tree->root;
-       }
-}
-
-#if 0  /* UNUSED */
-static void bfree(VBVHTree *tree)
-{
-       if (tot_pushup + tot_pushdown + tot_hints + tot_moves) {
-               if (G.debug & G_DEBUG) {
-                       printf("tot pushups: %d\n", tot_pushup);
-                       printf("tot pushdowns: %d\n", tot_pushdown);
-                       printf("tot moves: %d\n", tot_moves);
-                       printf("tot hints created: %d\n", tot_hints);
-               }
-
-               tot_pushup = 0;
-               tot_pushdown = 0;
-               tot_hints = 0;
-               tot_moves = 0;
-       }
-       bvh_free(tree);
-}
-#endif
-
-/* the cast to pointer function is needed to workarround gcc bug: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11407 */
-template<class Tree, int STACK_SIZE>
-static RayObjectAPI make_api()
-{
-       static RayObjectAPI api =
-       {
-               (RE_rayobject_raycast_callback) ((int   (*)(Tree *, Isect *)) & intersect<STACK_SIZE>),
-               (RE_rayobject_add_callback)     ((void  (*)(Tree *, RayObject *)) & bvh_add<Tree>),
-               (RE_rayobject_done_callback)    ((void  (*)(Tree *))       & bvh_done<Tree>),
-               (RE_rayobject_free_callback)    ((void  (*)(Tree *))       & bvh_free<Tree>),
-               (RE_rayobject_merge_bb_callback)((void  (*)(Tree *, float *, float *)) & bvh_bb<Tree>),
-               (RE_rayobject_cost_callback)    ((float (*)(Tree *))      & bvh_cost<Tree>),
-               (RE_rayobject_hint_bb_callback) ((void  (*)(Tree *, LCTSHint *, float *, float *)) & bvh_hint_bb<Tree>)
-       };
-
-       return api;
-}
-
-template<class Tree>
-RayObjectAPI *bvh_get_api(int maxstacksize)
-{
-       static RayObjectAPI bvh_api256 = make_api<Tree, 1024>();
-
-       if (maxstacksize <= 1024) return &bvh_api256;
-       assert(maxstacksize <= 256);
-       return 0;
-}
-
-RayObject *RE_rayobject_vbvh_create(int size)
-{
-       return bvh_create_tree<VBVHTree, DFS_STACK_SIZE>(size);
-}
diff --git a/source/blender/render/intern/raytrace/reorganize.h b/source/blender/render/intern/raytrace/reorganize.h
deleted file mode 100644 (file)
index 3fdd336..0000000
+++ /dev/null
@@ -1,513 +0,0 @@
-/*
- * ***** 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) 2009 Blender Foundation.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): André Pinto.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/render/intern/raytrace/reorganize.h
- *  \ingroup render
- */
-
-
-#include <float.h>
-#include <math.h>
-#include <stdio.h>
-
-#include <algorithm>
-#include <queue>
-#include <vector>
-
-#include "BKE_global.h"
-
-#ifdef _WIN32
-#  ifdef INFINITY
-#    undef INFINITY
-#  endif
-#  define INFINITY FLT_MAX // in mingw math.h: (1.0F/0.0F). This generates compile error, though.
-#endif
-
-extern int tot_pushup;
-extern int tot_pushdown;
-
-#if !defined(INFINITY) && defined(HUGE_VAL)
-#define INFINITY HUGE_VAL
-#endif
-
-template<class Node>
-static bool node_fits_inside(Node *a, Node *b)
-{
-       return bb_fits_inside(b->bb, b->bb + 3, a->bb, a->bb + 3);
-}
-
-template<class Node>
-static void reorganize_find_fittest_parent(Node *tree, Node *node, std::pair<float, Node *> &cost)
-{
-       std::queue<Node *> q;
-       q.push(tree);
-
-       while (!q.empty()) {
-               Node *parent = q.front();
-               q.pop();
-
-               if (parent == node) continue;
-               if (node_fits_inside(node, parent) && RE_rayobject_isAligned(parent->child) ) {
-                       float pcost = bb_area(parent->bb, parent->bb + 3);
-                       cost = std::min(cost, std::make_pair(pcost, parent) );
-                       for (Node *child = parent->child; child; child = child->sibling)
-                               q.push(child);
-               }
-       }
-}
-
-template<class Node>
-static void reorganize(Node *root)
-{
-       std::queue<Node *> q;
-
-       q.push(root);
-       while (!q.empty()) {
-               Node *node = q.front();
-               q.pop();
-
-               if (RE_rayobject_isAligned(node->child)) {
-                       for (Node **prev = &node->child; *prev; ) {
-                               assert(RE_rayobject_isAligned(*prev));
-                               q.push(*prev);
-
-                               std::pair<float, Node *> best(FLT_MAX, root);
-                               reorganize_find_fittest_parent(root, *prev, best);
-
-                               if (best.second == node) {
-                                       //Already inside the fitnest BB
-                                       prev = &(*prev)->sibling;
-                               }
-                               else {
-                                       Node *tmp = *prev;
-                                       *prev = (*prev)->sibling;
-
-                                       tmp->sibling =  best.second->child;
-                                       best.second->child = tmp;
-                               }
-
-
-                       }
-               }
-               if (node != root) {
-               }
-       }
-}
-
-/*
- * Prunes useless nodes from trees:
- *  erases nodes with total amount of primitives = 0
- *  prunes nodes with only one child (except if that child is a primitive)
- */
-template<class Node>
-static void remove_useless(Node *node, Node **new_node)
-{
-       if (RE_rayobject_isAligned(node->child) ) {
-
-               for (Node **prev = &node->child; *prev; ) {
-                       Node *next = (*prev)->sibling;
-                       remove_useless(*prev, prev);
-                       if (*prev == NULL)
-                               *prev = next;
-                       else {
-                               (*prev)->sibling = next;
-                               prev = &((*prev)->sibling);
-                       }
-               }
-       }
-       if (node->child) {
-               if (RE_rayobject_isAligned(node->child) && node->child->sibling == 0)
-                       *new_node = node->child;
-       }
-       else if (node->child == NULL) {
-               *new_node = NULL;
-       }
-}
-
-/*
- * Minimizes expected number of BBtest by colapsing nodes
- * it uses surface area heuristic for determining whether a node should be colapsed
- */
-template<class Node>
-static void pushup(Node *parent)
-{
-       if (is_leaf(parent)) return;
-
-       float p_area = bb_area(parent->bb, parent->bb + 3);
-       Node **prev = &parent->child;
-       for (Node *child = parent->child; RE_rayobject_isAligned(child) && child; ) {
-               const float c_area = bb_area(child->bb, child->bb + 3);
-               const int nchilds = count_childs(child);
-               float original_cost = ((p_area != 0.0f) ? (c_area / p_area) * nchilds : 1.0f) + 1;
-               float flatten_cost = nchilds;
-               if (flatten_cost < original_cost && nchilds >= 2) {
-                       append_sibling(child, child->child);
-                       child = child->sibling;
-                       *prev = child;
-
-//                     *prev = child->child;
-//                     append_sibling( *prev, child->sibling );
-//                     child = *prev;
-                       tot_pushup++;
-               }
-               else {
-                       *prev = child;
-                       prev = &(*prev)->sibling;
-                       child = *prev;
-               }
-       }
-
-       for (Node *child = parent->child; RE_rayobject_isAligned(child) && child; child = child->sibling)
-               pushup(child);
-}
-
-/*
- * try to optimize number of childs to be a multiple of SSize
- */
-template<class Node, int SSize>
-static void pushup_simd(Node *parent)
-{
-       if (is_leaf(parent)) return;
-
-       int n = count_childs(parent);
-
-       Node **prev = &parent->child;
-       for (Node *child = parent->child; RE_rayobject_isAligned(child) && child; ) {
-               int cn = count_childs(child);
-               if (cn - 1 <= (SSize - (n % SSize) ) % SSize && RE_rayobject_isAligned(child->child) ) {
-                       n += (cn - 1);
-                       append_sibling(child, child->child);
-                       child = child->sibling;
-                       *prev = child;
-               }
-               else {
-                       *prev = child;
-                       prev = &(*prev)->sibling;
-                       child = *prev;
-               }
-       }
-
-       for (Node *child = parent->child; RE_rayobject_isAligned(child) && child; child = child->sibling)
-               pushup_simd<Node, SSize>(child);
-}
-
-
-/*
- * Pushdown
- *     makes sure no child fits inside any of its sibling
- */
-template<class Node>
-static void pushdown(Node *parent)
-{
-       Node **s_child = &parent->child;
-       Node *child = parent->child;
-
-       while (child && RE_rayobject_isAligned(child)) {
-               Node *next = child->sibling;
-               Node **next_s_child = &child->sibling;
-
-               //assert(bb_fits_inside(parent->bb, parent->bb+3, child->bb, child->bb+3));
-
-               for (Node *i = parent->child; RE_rayobject_isAligned(i) && i; i = i->sibling)
-                       if (child != i && bb_fits_inside(i->bb, i->bb + 3, child->bb, child->bb + 3) && RE_rayobject_isAligned(i->child)) {
-//                     todo optimize (should the one with the smallest area?)
-//                     float ia = bb_area(i->bb, i->bb+3)
-//                     if (child->i)
-                               *s_child = child->sibling;
-                               child->sibling = i->child;
-                               i->child = child;
-                               next_s_child = s_child;
-
-                               tot_pushdown++;
-                               break;
-                       }
-               child = next;
-               s_child = next_s_child;
-       }
-
-       for (Node *i = parent->child; RE_rayobject_isAligned(i) && i; i = i->sibling) {
-               pushdown(i);
-       }
-}
-
-
-/*
- * BVH refit
- * readjust nodes BB (useful if nodes childs where modified)
- */
-template<class Node>
-static float bvh_refit(Node *node)
-{
-       if (is_leaf(node)) return 0;
-       if (is_leaf(node->child)) return 0;
-
-       float total = 0;
-
-       for (Node *child = node->child; child; child = child->sibling)
-               total += bvh_refit(child);
-
-       float old_area = bb_area(node->bb, node->bb + 3);
-       INIT_MINMAX(node->bb, node->bb + 3);
-       for (Node *child = node->child; child; child = child->sibling) {
-               DO_MIN(child->bb, node->bb);
-               DO_MAX(child->bb + 3, node->bb + 3);
-       }
-       total += old_area - bb_area(node->bb, node->bb + 3);
-       return total;
-}
-
-
-/*
- * this finds the best way to packing a tree according to a given test cost function
- * with the purpose to reduce the expected cost (eg.: number of BB tests).
- */
-#include <vector>
-#define MAX_CUT_SIZE         4               /* svbvh assumes max 4 children! */
-#define MAX_OPTIMIZE_CHILDS  MAX_CUT_SIZE
-
-#define CUT_SIZE_IS_VALID(cut_size) ((cut_size) < MAX_CUT_SIZE && (cut_size) >= 0)
-#define CUT_SIZE_INVALID -1
-
-
-struct OVBVHNode {
-       float bb[6];
-
-       OVBVHNode *child;
-       OVBVHNode *sibling;
-
-       /*
-        * Returns min cost to represent the subtree starting at the given node,
-        * allowing it to have a given cutsize
-        */
-       float cut_cost[MAX_CUT_SIZE];
-       float get_cost(int cutsize)
-       {
-               assert(CUT_SIZE_IS_VALID(cutsize - 1));
-               return cut_cost[cutsize - 1];
-       }
-
-       /*
-        * This saves the cut size of this child, when parent is reaching
-        * its minimum cut with the given cut size
-        */
-       int cut_size[MAX_CUT_SIZE];
-       int get_cut_size(int parent_cut_size)
-       {
-               assert(CUT_SIZE_IS_VALID(parent_cut_size - 1));
-               return cut_size[parent_cut_size - 1];
-       }
-
-       /*
-        * Reorganize the node based on calculated cut costs
-        */
-       int best_cutsize;
-       void set_cut(int cutsize, OVBVHNode ***cut)
-       {
-               if (cutsize == 1) {
-                       **cut = this;
-                       *cut = &(**cut)->sibling;
-               }
-               else {
-                       if (cutsize > MAX_CUT_SIZE) {
-                               for (OVBVHNode *child = this->child; child && RE_rayobject_isAligned(child); child = child->sibling) {
-                                       child->set_cut(1, cut);
-                                       cutsize--;
-                               }
-                               assert(cutsize == 0);
-                       }
-                       else {
-                               for (OVBVHNode *child = this->child; child && RE_rayobject_isAligned(child); child = child->sibling) {
-                                       child->set_cut(child->get_cut_size(cutsize), cut);
-                               }
-                       }
-               }
-       }
-
-       void optimize()
-       {
-               if (RE_rayobject_isAligned(this->child)) {
-                       //Calc new childs
-                       if (this->best_cutsize != CUT_SIZE_INVALID) {
-                               OVBVHNode **cut = &(this->child);
-                               set_cut(this->best_cutsize, &cut);
-                               *cut = NULL;
-                       }
-
-                       //Optimize new childs
-                       for (OVBVHNode *child = this->child; child && RE_rayobject_isAligned(child); child = child->sibling)
-                               child->optimize();
-               }
-       }
-};
-
-/*
- * Calculates an optimal SIMD packing
- *
- */
-template<class Node, class TestCost>
-struct VBVH_optimalPackSIMD {
-       TestCost testcost;
-
-       VBVH_optimalPackSIMD(TestCost testcost)
-       {
-               this->testcost = testcost;
-       }
-
-       /*
-        * calc best cut on a node
-        */
-       struct calc_best {
-               Node *child[MAX_OPTIMIZE_CHILDS];
-               float child_hit_prob[MAX_OPTIMIZE_CHILDS];
-
-               calc_best(Node *node)
-               {
-                       int nchilds = 0;
-                       //Fetch childs and needed data
-                       {
-                               float parent_area = bb_area(node->bb, node->bb + 3);
-                               for (Node *child = node->child; child && RE_rayobject_isAligned(child); child = child->sibling) {
-                                       this->child[nchilds] = child;
-                                       this->child_hit_prob[nchilds] = (parent_area != 0.0f) ? bb_area(child->bb, child->bb + 3) / parent_area : 1.0f;
-                                       nchilds++;
-                               }
-
-                               assert(nchilds >= 2 && nchilds <= MAX_OPTIMIZE_CHILDS);
-                       }
-
-
-                       //Build DP table to find minimum cost to represent this node with a given cutsize
-                       int     bt[MAX_OPTIMIZE_CHILDS + 1][MAX_CUT_SIZE + 1];     //backtrace table
-                       float cost[MAX_OPTIMIZE_CHILDS + 1][MAX_CUT_SIZE + 1]; //cost table (can be reduced to float[2][MAX_CUT_COST])
-
-                       for (int i = 0; i <= nchilds; i++) {
-                               for (int j = 0; j <= MAX_CUT_SIZE; j++) {
-                                       cost[i][j] = INFINITY;
-                               }
-                       }
-
-                       cost[0][0] = 0;
-
-                       for (int i = 1; i <= nchilds; i++) {
-                               for (int size = i - 1; size /*+(nchilds-i)*/ <= MAX_CUT_SIZE; size++) {
-                                       for (int cut = 1; cut + size /*+(nchilds-i)*/ <= MAX_CUT_SIZE; cut++) {
-                                               float new_cost = cost[i - 1][size] + child_hit_prob[i - 1] * child[i - 1]->get_cost(cut);
-                                               if (new_cost < cost[i][size + cut]) {
-                                                       cost[i][size + cut] = new_cost;
-                                                       bt[i][size + cut] = cut;
-                                               }
-                                       }
-                               }
-                       }
-
-                       /* Save the ways to archive the minimum cost with a given cutsize */
-                       for (int i = nchilds; i <= MAX_CUT_SIZE; i++) {
-                               node->cut_cost[i - 1] = cost[nchilds][i];
-                               if (cost[nchilds][i] < INFINITY) {
-                                       int current_size = i;
-                                       for (int j = nchilds; j > 0; j--) {
-                                               child[j - 1]->cut_size[i - 1] = bt[j][current_size];
-                                               current_size -= bt[j][current_size];
-                                       }
-                               }
-                       }
-               }
-       };
-
-       void calc_costs(Node *node)
-       {
-
-               if (RE_rayobject_isAligned(node->child) ) {
-                       int nchilds = 0;
-                       for (Node *child = node->child; child && RE_rayobject_isAligned(child); child = child->sibling) {
-                               calc_costs(child);
-                               nchilds++;
-                       }
-
-                       for (int i = 0; i < MAX_CUT_SIZE; i++)
-                               node->cut_cost[i] = INFINITY;
-
-                       //We are not allowed to look on nodes with with so many childs
-                       if (nchilds > MAX_CUT_SIZE) {
-                               float cost = 0;
-
-                               float parent_area = bb_area(node->bb, node->bb + 3);
-                               for (Node *child = node->child; child && RE_rayobject_isAligned(child); child = child->sibling) {
-                                       cost += ((parent_area != 0.0f) ? (bb_area(child->bb, child->bb + 3) / parent_area) : 1.0f) * child->get_cost(1);
-                               }
-
-                               cost += testcost(nchilds);
-                               node->cut_cost[0] = cost;
-                               node->best_cutsize = nchilds;
-                       }
-                       else {
-                               calc_best calc(node);
-
-                               //calc expected cost if we optimaly pack this node
-                               for (int cutsize = nchilds; cutsize <= MAX_CUT_SIZE; cutsize++) {
-                                       float m = node->get_cost(cutsize) + testcost(cutsize);
-                                       if (m < node->cut_cost[0]) {
-                                               node->cut_cost[0] = m;
-                                               node->best_cutsize = cutsize;
-                                       }
-                               }
-                       }
-
-                       if (node->cut_cost[0] == INFINITY) {
-                               node->best_cutsize = CUT_SIZE_INVALID;
-                       }
-               }
-               else {
-                       node->cut_cost[0] = 1.0f;
-                       for (int i = 1; i < MAX_CUT_SIZE; i++)
-                               node->cut_cost[i] = INFINITY;
-
-                       /* node->best_cutsize can remain unset here */
-               }
-       }
-
-       Node *transform(Node *node)
-       {
-               if (RE_rayobject_isAligned(node->child)) {
-#ifdef DEBUG
-                       static int num = 0;
-                       bool first = false;
-                       if (num == 0) { num++; first = true; }
-#endif
-
-                       calc_costs(node);
-
-#ifdef DEBUG
-                       if (first && G.debug) {
-                               printf("expected cost = %f (%d)\n", node->cut_cost[0], node->best_cutsize);
-                       }
-#endif
-                       node->optimize();
-               }
-               return node;
-       }
-};
diff --git a/source/blender/render/intern/raytrace/svbvh.h b/source/blender/render/intern/raytrace/svbvh.h
deleted file mode 100644 (file)
index 0a5690d..0000000
+++ /dev/null
@@ -1,317 +0,0 @@
-/*
- * ***** 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) 2009 Blender Foundation.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): André Pinto.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/render/intern/raytrace/svbvh.h
- *  \ingroup render
- */
-
-#ifndef __SVBVH_H__
-#define __SVBVH_H__
-
-#ifdef __SSE__
-
-#include "bvh.h"
-#include "BLI_memarena.h"
-#include <algorithm>
-
-struct SVBVHNode {
-       float child_bb[24];
-       SVBVHNode *child[4];
-       int nchilds;
-};
-
-static int svbvh_bb_intersect_test_simd4(const Isect *isec, const __m128 *bb_group)
-{
-       const __m128 tmin0 = _mm_setzero_ps();
-       const __m128 tmax0 = _mm_set_ps1(isec->dist);
-
-       const __m128 start0 = _mm_set_ps1(isec->start[0]);
-       const __m128 start1 = _mm_set_ps1(isec->start[1]);
-       const __m128 start2 = _mm_set_ps1(isec->start[2]);
-       const __m128 sub0 = _mm_sub_ps(bb_group[isec->bv_index[0]], start0);
-       const __m128 sub1 = _mm_sub_ps(bb_group[isec->bv_index[1]], start0);
-       const __m128 sub2 = _mm_sub_ps(bb_group[isec->bv_index[2]], start1);
-       const __m128 sub3 = _mm_sub_ps(bb_group[isec->bv_index[3]], start1);
-       const __m128 sub4 = _mm_sub_ps(bb_group[isec->bv_index[4]], start2);
-       const __m128 sub5 = _mm_sub_ps(bb_group[isec->bv_index[5]], start2);
-       const __m128 idot_axis0 = _mm_set_ps1(isec->idot_axis[0]);
-       const __m128 idot_axis1 = _mm_set_ps1(isec->idot_axis[1]);
-       const __m128 idot_axis2 = _mm_set_ps1(isec->idot_axis[2]);
-       const __m128 mul0 = _mm_mul_ps(sub0, idot_axis0);
-       const __m128 mul1 = _mm_mul_ps(sub1, idot_axis0);
-       const __m128 mul2 = _mm_mul_ps(sub2, idot_axis1);
-       const __m128 mul3 = _mm_mul_ps(sub3, idot_axis1);
-       const __m128 mul4 = _mm_mul_ps(sub4, idot_axis2);
-       const __m128 mul5 = _mm_mul_ps(sub5, idot_axis2);
-       const __m128 tmin1 = _mm_max_ps(tmin0, mul0);
-       const __m128 tmax1 = _mm_min_ps(tmax0, mul1);
-       const __m128 tmin2 = _mm_max_ps(tmin1, mul2);
-       const __m128 tmax2 = _mm_min_ps(tmax1, mul3);
-       const __m128 tmin3 = _mm_max_ps(tmin2, mul4);
-       const __m128 tmax3 = _mm_min_ps(tmax2, mul5);
-
-       return _mm_movemask_ps(_mm_cmpge_ps(tmax3, tmin3));
-}
-
-static int svbvh_bb_intersect_test(const Isect *isec, const float *_bb)
-{
-       const float *bb = _bb;
-
-       float t1x = (bb[isec->bv_index[0]] - isec->start[0]) * isec->idot_axis[0];
-       float t2x = (bb[isec->bv_index[1]] - isec->start[0]) * isec->idot_axis[0];
-       float t1y = (bb[isec->bv_index[2]] - isec->start[1]) * isec->idot_axis[1];
-       float t2y = (bb[isec->bv_index[3]] - isec->start[1]) * isec->idot_axis[1];
-       float t1z = (bb[isec->bv_index[4]] - isec->start[2]) * isec->idot_axis[2];
-       float t2z = (bb[isec->bv_index[5]] - isec->start[2]) * isec->idot_axis[2];
-
-       RE_RC_COUNT(isec->raycounter->bb.test);
-
-       if (t1x > t2y || t2x < t1y || t1x > t2z || t2x < t1z || t1y > t2z || t2y < t1z) return 0;
-       if (t2x < 0.0f || t2y < 0.0f || t2z < 0.0f) return 0;
-       if (t1x > isec->dist || t1y > isec->dist || t1z > isec->dist) return 0;
-
-       RE_RC_COUNT(isec->raycounter->bb.hit);
-
-       return 1;
-}
-
-static bool svbvh_node_is_leaf(const SVBVHNode *node)
-{
-       return !RE_rayobject_isAligned(node);
-}
-
-template<int MAX_STACK_SIZE, bool SHADOW>
-static int svbvh_node_stack_raycast(SVBVHNode *root, Isect *isec)
-{
-       SVBVHNode *stack[MAX_STACK_SIZE], *node;
-       int hit = 0, stack_pos = 0;
-
-       stack[stack_pos++] = root;
-
-       while (stack_pos) {
-               node = stack[--stack_pos];
-
-               if (!svbvh_node_is_leaf(node)) {
-                       int nchilds = node->nchilds;
-
-                       if (nchilds == 4) {
-                               float *child_bb = node->child_bb;
-                               int res = svbvh_bb_intersect_test_simd4(isec, ((__m128 *) (child_bb)));
-                               SVBVHNode **child = node->child;
-
-                               RE_RC_COUNT(isec->raycounter->simd_bb.test);
-
-                               if (res & 1) { stack[stack_pos++] = child[0]; RE_RC_COUNT(isec->raycounter->simd_bb.hit); }
-                               if (res & 2) { stack[stack_pos++] = child[1]; RE_RC_COUNT(isec->raycounter->simd_bb.hit); }
-                               if (res & 4) { stack[stack_pos++] = child[2]; RE_RC_COUNT(isec->raycounter->simd_bb.hit); }
-                               if (res & 8) { stack[stack_pos++] = child[3]; RE_RC_COUNT(isec->raycounter->simd_bb.hit); }
-                       }
-                       else {
-                               float *child_bb = node->child_bb;
-                               SVBVHNode **child = node->child;
-                               int i;
-
-                               for (i = 0; i < nchilds; i++) {
-                                       if (svbvh_bb_intersect_test(isec, (float *)child_bb + 6 * i)) {
-                                               stack[stack_pos++] = child[i];
-                                       }
-                               }
-                       }
-               }
-               else {
-                       hit |= RE_rayobject_intersect((RayObject *)node, isec);
-                       if (SHADOW && hit) break;
-               }
-       }
-
-       return hit;
-}
-
-
-template<>
-inline void bvh_node_merge_bb<SVBVHNode>(SVBVHNode *node, float min[3], float max[3])
-{
-       if (is_leaf(node)) {
-               RE_rayobject_merge_bb((RayObject *)node, min, max);
-       }
-       else {
-               int i;
-               for (i = 0; i + 4 <= node->nchilds; i += 4) {
-                       float *res = node->child_bb + 6 * i;
-                       for (int j = 0; j < 3; j++) {
-                               min[j] = min_ff(min[j],
-                                               min_ffff(res[4 * j + 0],
-                                                        res[4 * j + 1],
-                                                        res[4 * j + 2],
-                                                        res[4 * j + 3]));
-                       }
-                       for (int j = 0; j < 3; j++) {
-                               max[j] = max_ff(max[j],
-                                               max_ffff(res[4 * (j + 3) + 0],
-                                                        res[4 * (j + 3) + 1],
-                                                        res[4 * (j + 3) + 2],
-                                                        res[4 * (j + 3) + 3]));
-                       }
-               }
-
-               for (; i < node->nchilds; i++) {
-                       DO_MIN(node->child_bb + 6 * i, min);
-                       DO_MAX(node->child_bb + 3 + 6 * i, max);
-               }
-       }
-}
-
-
-
-/*
- * Builds a SVBVH tree form a VBVHTree
- */
-template<class OldNode>
-struct Reorganize_SVBVH {
-       MemArena *arena;
-
-       float childs_per_node;
-       int nodes_with_childs[16];
-       int useless_bb;
-       int nodes;
-
-       Reorganize_SVBVH(MemArena *a)
-       {
-               arena = a;
-               nodes = 0;
-               childs_per_node = 0;
-               useless_bb = 0;
-
-               for (int i = 0; i < 16; i++) {
-                       nodes_with_childs[i] = 0;
-               }
-       }
-
-       ~Reorganize_SVBVH()
-       {
-#if 0
-               {
-                       printf("%f childs per node\n", childs_per_node / nodes);
-                       printf("%d childs BB are useless\n", useless_bb);
-                       for (int i = 0; i < 16; i++) {
-                               printf("%i childs per node: %d/%d = %f\n", i, nodes_with_childs[i], nodes,  nodes_with_childs[i] / float(nodes));
-                       }
-               }
-#endif
-       }
-
-       SVBVHNode *create_node(int nchilds)
-       {
-               SVBVHNode *node = (SVBVHNode *)BLI_memarena_alloc(arena, sizeof(SVBVHNode));
-               node->nchilds = nchilds;
-
-               return node;
-       }
-
-       void copy_bb(float bb[6], const float old_bb[6])
-       {
-               std::copy(old_bb, old_bb + 6, bb);
-       }
-
-       void prepare_for_simd(SVBVHNode *node)
-       {
-               int i = 0;
-               while (i + 4 <= node->nchilds) {
-                       float vec_tmp[4 * 6];
-                       float *res = node->child_bb + 6 * i;
-                       std::copy(res, res + 6 * 4, vec_tmp);
-
-                       for (int j = 0; j < 6; j++) {
-                               res[4 * j + 0] = vec_tmp[6 * 0 + j];
-                               res[4 * j + 1] = vec_tmp[6 * 1 + j];
-                               res[4 * j + 2] = vec_tmp[6 * 2 + j];
-                               res[4 * j + 3] = vec_tmp[6 * 3 + j];
-                       }
-
-                       i += 4;
-               }
-       }
-
-       /* amt must be power of two */
-       inline int padup(int num, int amt)
-       {
-               return ((num + (amt - 1)) & ~(amt - 1));
-       }
-
-       SVBVHNode *transform(OldNode *old)
-       {
-               if (is_leaf(old))
-                       return (SVBVHNode *)old;
-               if (is_leaf(old->child))
-                       return (SVBVHNode *)old->child;
-
-               int nchilds = count_childs(old);
-               int alloc_childs = nchilds;
-               if (nchilds % 4 > 2)
-                       alloc_childs = padup(nchilds, 4);
-
-               SVBVHNode *node = create_node(alloc_childs);
-
-               childs_per_node += nchilds;
-               nodes++;
-               if (nchilds < 16)
-                       nodes_with_childs[nchilds]++;
-
-               useless_bb += alloc_childs - nchilds;
-               while (alloc_childs > nchilds) {
-                       const static float def_bb[6] = {FLT_MAX,  FLT_MAX,  FLT_MAX, -FLT_MAX, -FLT_MAX, -FLT_MAX};
-                       alloc_childs--;
-                       node->child[alloc_childs] = NULL;
-                       copy_bb(node->child_bb + alloc_childs * 6, def_bb);
-               }
-
-               int i = nchilds;
-               for (OldNode *o_child = old->child; o_child; o_child = o_child->sibling) {
-                       i--;
-                       node->child[i] = transform(o_child);
-                       if (is_leaf(o_child)) {
-                               float bb[6];
-                               INIT_MINMAX(bb, bb + 3);
-                               RE_rayobject_merge_bb((RayObject *)o_child, bb, bb + 3);
-                               copy_bb(node->child_bb + i * 6, bb);
-                               break;
-                       }
-                       else {
-                               copy_bb(node->child_bb + i * 6, o_child->bb);
-                       }
-               }
-               assert(i == 0);
-
-               prepare_for_simd(node);
-
-               return node;
-       }
-};
-
-#endif  /* __SSE__ */
-
-#endif  /* __SVBVH_H__ */
diff --git a/source/blender/render/intern/raytrace/vbvh.h b/source/blender/render/intern/raytrace/vbvh.h
deleted file mode 100644 (file)
index 0b0bbd1..0000000
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * ***** 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) 2009 Blender Foundation.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): André Pinto.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/render/intern/raytrace/vbvh.h
- *  \ingroup render
- */
-
-
-#include <assert.h>
-#include <algorithm>
-
-#include "BLI_memarena.h"
-
-#include "rayobject_rtbuild.h"
-
-/*
- * VBVHNode represents a BVHNode with support for a variable number of childrens
- */
-struct VBVHNode {
-       float bb[6];
-
-       VBVHNode *child;
-       VBVHNode *sibling;
-};
-
-
-/*
- * Push nodes (used on dfs)
- */
-template<class Node>
-inline static void bvh_node_push_childs(Node *node, Isect *UNUSED(isec), Node **stack, int &stack_pos)
-{
-       Node *child = node->child;
-
-       if (is_leaf(child)) {
-               stack[stack_pos++] = child;
-       }
-       else {
-               while (child) {
-                       /* Skips BB tests on primitives */
-#if 0
-                       if (is_leaf(child->child)) {
-                               stack[stack_pos++] = child->child;
-                       }
-                       else
-#endif
-                       {
-                               stack[stack_pos++] = child;
-                       }
-
-                       child = child->sibling;
-               }
-       }
-}
-
-
-template<class Node>
-static int count_childs(Node *parent)
-{
-       int n = 0;
-       for (Node *i = parent->child; i; i = i->sibling) {
-               n++;
-               if (is_leaf(i))
-                       break;
-       }
-
-       return n;
-}
-
-
-template<class Node>
-static void append_sibling(Node *node, Node *sibling)
-{
-       while (node->sibling)
-               node = node->sibling;
-
-       node->sibling = sibling;
-}
-
-
-/*
- * Builds a binary VBVH from a rtbuild
- */
-template<class Node>
-struct BuildBinaryVBVH {
-       MemArena *arena;
-       RayObjectControl *control;
-
-       void test_break()
-       {
-               if (RE_rayobjectcontrol_test_break(control))
-                       throw "Stop";
-       }
-
-       BuildBinaryVBVH(MemArena *a, RayObjectControl *c)
-       {
-               arena = a;
-               control = c;
-       }
-
-       Node *create_node()
-       {
-               Node *node = (Node *)BLI_memarena_alloc(arena, sizeof(Node) );
-               assert(RE_rayobject_isAligned(node));
-
-               node->sibling = NULL;
-               node->child   = NULL;
-
-               return node;
-       }
-
-       int rtbuild_split(RTBuilder *builder)
-       {
-               return ::rtbuild_heuristic_object_split(builder, 2);
-       }
-
-       Node *transform(RTBuilder *builder)
-       {
-               try
-               {
-                       return _transform(builder);
-
-               } catch (...)
-               {
-               }
-               return NULL;
-       }
-
-       Node *_transform(RTBuilder *builder)
-       {
-               int size = rtbuild_size(builder);
-
-               if (size == 0) {
-                       return NULL;
-               }
-               else if (size == 1) {
-                       Node *node = create_node();
-                       INIT_MINMAX(node->bb, node->bb + 3);
-                       rtbuild_merge_bb(builder, node->bb, node->bb + 3);
-                       node->child = (Node *) rtbuild_get_primitive(builder, 0);
-                       return node;
-               }
-               else {
-                       test_break();
-
-                       Node *node = create_node();
-
-                       Node **child = &node->child;
-
-                       int nc = rtbuild_split(builder);
-                       INIT_MINMAX(node->bb, node->bb + 3);
-
-                       assert(nc == 2);
-                       for (int i = 0; i < nc; i++) {
-                               RTBuilder tmp;
-                               rtbuild_get_child(builder, i, &tmp);
-
-                               *child = _transform(&tmp);
-                               DO_MIN((*child)->bb, node->bb);
-                               DO_MAX((*child)->bb + 3, node->bb + 3);
-                               child = &((*child)->sibling);
-                       }
-
-                       *child = NULL;
-                       return node;
-               }
-       }
-};
-
-#if 0
-template<class Tree, class OldNode>
-struct Reorganize_VBVH {
-       Tree *tree;
-
-       Reorganize_VBVH(Tree *t)
-       {
-               tree = t;
-       }
-
-       VBVHNode *create_node()
-       {
-               VBVHNode *node = (VBVHNode *)BLI_memarena_alloc(tree->node_arena, sizeof(VBVHNode));
-               return node;
-       }
-
-       void copy_bb(VBVHNode *node, OldNode *old)
-       {
-               std::copy(old->bb, old->bb + 6, node->bb);
-       }
-
-       VBVHNode *transform(OldNode *old)
-       {
-               if (is_leaf(old))
-                       return (VBVHNode *)old;
-
-               VBVHNode *node = create_node();
-               VBVHNode **child_ptr = &node->child;
-               node->sibling = 0;
-
-               copy_bb(node, old);
-
-               for (OldNode *o_child = old->child; o_child; o_child = o_child->sibling)
-               {
-                       VBVHNode *n_child = transform(o_child);
-                       *child_ptr = n_child;
-                       if (is_leaf(n_child)) return node;
-                       child_ptr = &n_child->sibling;
-               }
-               *child_ptr = 0;
-
-               return node;
-       }
-};
-#endif
diff --git a/source/blender/render/intern/source/bake.c b/source/blender/render/intern/source/bake.c
deleted file mode 100644 (file)
index 4a7962b..0000000
+++ /dev/null
@@ -1,1342 +0,0 @@
-/*
- * ***** 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.
- *
- * Contributors: 2004/2005/2006 Blender Foundation, full recode
- * Contributors: Vertex color baking, Copyright 2011 AutoCRC
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/render/intern/source/bake.c
- *  \ingroup render
- */
-
-
-/* system includes */
-#include <stdio.h>
-#include <string.h>
-
-/* External modules: */
-#include "MEM_guardedalloc.h"
-
-#include "BLI_math.h"
-#include "BLI_rand.h"
-#include "BLI_threads.h"
-#include "BLI_utildefines.h"
-
-#include "DNA_image_types.h"
-#include "DNA_material_types.h"
-#include "DNA_mesh_types.h"
-#include "DNA_meshdata_types.h"
-
-#include "BKE_customdata.h"
-#include "BKE_global.h"
-#include "BKE_image.h"
-#include "BKE_main.h"
-#include "BKE_node.h"
-#include "BKE_scene.h"
-#include "BKE_library.h"
-
-#include "IMB_imbuf_types.h"
-#include "IMB_imbuf.h"
-#include "IMB_colormanagement.h"
-
-/* local include */
-#include "rayintersection.h"
-#include "rayobject.h"
-#include "render_types.h"
-#include "renderdatabase.h"
-#include "shading.h"
-#include "zbuf.h"
-
-#include "PIL_time.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;
-/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
-
-
-/* ************************* bake ************************ */
-
-
-typedef struct BakeShade {
-       int thread;
-
-       ShadeSample ssamp;
-       ObjectInstanceRen *obi;
-       VlakRen *vlr;
-
-       ZSpan *zspan;
-       Image *ima;
-       ImBuf *ibuf;
-
-       int rectx, recty, quad, type, vdone;
-       bool ready;
-
-       float dir[3];
-       Object *actob;
-
-       /* Output: vertex color or image data. If vcol is not NULL, rect and
-        * rect_float should be NULL. */
-       MPoly *mpoly;
-       MLoop *mloop;
-       MLoopCol *vcol;
-
-       unsigned int *rect;
-       float *rect_float;
-
-       /* displacement buffer used for normalization with unknown maximal distance */
-       bool use_displacement_buffer;
-       float *displacement_buffer;
-       float displacement_min, displacement_max;
-
-       bool use_mask;
-       char *rect_mask; /* bake pixel mask */
-
-       float dxco[3], dyco[3];
-
-       short *do_update;
-
-       struct ColorSpace *rect_colorspace;
-} BakeShade;
-
-static void bake_set_shade_input(ObjectInstanceRen *obi, VlakRen *vlr, ShadeInput *shi, int quad, int UNUSED(isect), int x, int y, float u, float v)
-{
-       if (quad)
-               shade_input_set_triangle_i(shi, obi, vlr, 0, 2, 3);
-       else
-               shade_input_set_triangle_i(shi, obi, vlr, 0, 1, 2);
-
-       /* cache for shadow */
-       shi->samplenr = R.shadowsamplenr[shi->thread]++;
-
-       shi->mask = 0xFFFF; /* all samples */
-
-       shi->u = -u;
-       shi->v = -v;
-       shi->xs = x;
-       shi->ys = y;
-
-       shade_input_set_uv(shi);
-       shade_input_set_normals(shi);
-
-       /* no normal flip */
-       if (shi->flippednor)
-               shade_input_flip_normals(shi);
-
-       /* set up view vector to look right at the surface (note that the normal
-        * is negated in the renderer so it does not need to be done here) */
-       shi->view[0] = shi->vn[0];
-       shi->view[1] = shi->vn[1];
-       shi->view[2] = shi->vn[2];
-}
-
-static void bake_shade(void *handle, Object *ob, ShadeInput *shi, int UNUSED(quad), int x, int y, float UNUSED(u), float UNUSED(v), float *tvn, float *ttang)
-{
-       BakeShade *bs = handle;
-       ShadeSample *ssamp = &bs->ssamp;
-       ShadeResult shr;
-       VlakRen *vlr = shi->vlr;
-
-       shade_input_init_material(shi);
-
-       if (bs->type == RE_BAKE_AO) {
-               ambient_occlusion(shi);
-
-               if (R.r.bake_flag & R_BAKE_NORMALIZE) {
-                       copy_v3_v3(shr.combined, shi->ao);
-               }
-               else {
-                       zero_v3(shr.combined);
-                       environment_lighting_apply(shi, &shr);
-               }
-       }
-       else {
-               if (bs->type == RE_BAKE_SHADOW) /* Why do shadows set the color anyhow?, ignore material color for baking */
-                       shi->r = shi->g = shi->b = 1.0f;
-
-               shade_input_set_shade_texco(shi);
-
-               /* only do AO for a full bake (and obviously AO bakes)
-                * AO for light bakes is a leftover and might not be needed */
-               if (ELEM(bs->type, RE_BAKE_ALL, RE_BAKE_AO, RE_BAKE_LIGHT))
-                       shade_samples_do_AO(ssamp);
-
-               if (shi->mat->nodetree && shi->mat->use_nodes) {
-                       ntreeShaderExecTree(shi->mat->nodetree, shi, &shr);
-                       shi->mat = vlr->mat;  /* shi->mat is being set in nodetree */
-               }
-               else
-                       shade_material_loop(shi, &shr);
-
-               if (bs->type == RE_BAKE_NORMALS) {
-                       float nor[3];
-
-                       copy_v3_v3(nor, shi->vn);
-
-                       if (R.r.bake_normal_space == R_BAKE_SPACE_CAMERA) {
-                               /* pass */
-                       }
-                       else if (R.r.bake_normal_space == R_BAKE_SPACE_TANGENT) {
-                               float mat[3][3], imat[3][3];
-
-                               /* bitangent */
-                               if (tvn && ttang) {
-                                       copy_v3_v3(mat[0], ttang);
-                                       cross_v3_v3v3(mat[1], tvn, ttang);
-                                       mul_v3_fl(mat[1], ttang[3]);
-                                       copy_v3_v3(mat[2], tvn);
-                               }
-                               else {
-                                       copy_v3_v3(mat[0], shi->nmaptang);
-                                       cross_v3_v3v3(mat[1], shi->nmapnorm, shi->nmaptang);
-                                       mul_v3_fl(mat[1], shi->nmaptang[3]);
-                                       copy_v3_v3(mat[2], shi->nmapnorm);
-                               }
-
-                               invert_m3_m3(imat, mat);
-                               mul_m3_v3(imat, nor);
-                       }
-                       else if (R.r.bake_normal_space == R_BAKE_SPACE_OBJECT)
-                               mul_mat3_m4_v3(ob->imat_ren, nor);  /* ob->imat_ren includes viewinv! */
-                       else if (R.r.bake_normal_space == R_BAKE_SPACE_WORLD)
-                               mul_mat3_m4_v3(R.viewinv, nor);
-
-                       normalize_v3(nor); /* in case object has scaling */
-
-                       /* The invert of the red channel is to make
-                        * the normal map compliant with the outside world.
-                        * It needs to be done because in Blender
-                        * the normal used in the renderer points inward. It is generated
-                        * this way in calc_vertexnormals(). Should this ever change
-                        * this negate must be removed.
-                        *
-                        * there is also a small 1e-5f bias for precision issues. otherwise
-                        * we randomly get 127 or 128 for neutral colors. we choose 128
-                        * because it is the convention flat color. * */
-                       shr.combined[0] = (-nor[0]) / 2.0f + 0.5f + 1e-5f;
-                       shr.combined[1] = nor[1]    / 2.0f + 0.5f + 1e-5f;
-                       shr.combined[2] = nor[2]    / 2.0f + 0.5f + 1e-5f;
-               }
-               else if (bs->type == RE_BAKE_TEXTURE) {
-                       copy_v3_v3(shr.combined, &shi->r);
-                       shr.alpha = shi->alpha;
-               }
-               else if (bs->type == RE_BAKE_SHADOW) {
-                       copy_v3_v3(shr.combined, shr.shad);
-                       shr.alpha = shi->alpha;
-               }
-               else if (bs->type == RE_BAKE_SPEC_COLOR) {
-                       copy_v3_v3(shr.combined, &shi->specr);
-                       shr.alpha = 1.0f;
-               }
-               else if (bs->type == RE_BAKE_SPEC_INTENSITY) {
-                       copy_v3_fl(shr.combined, shi->spec);
-                       shr.alpha = 1.0f;
-               }
-               else if (bs->type == RE_BAKE_MIRROR_COLOR) {
-                       copy_v3_v3(shr.combined, &shi->mirr);
-                       shr.alpha = 1.0f;
-               }
-               else if (bs->type == RE_BAKE_MIRROR_INTENSITY) {
-                       copy_v3_fl(shr.combined, shi->ray_mirror);
-                       shr.alpha = 1.0f;
-               }
-               else if (bs->type == RE_BAKE_ALPHA) {
-                       copy_v3_fl(shr.combined, shi->alpha);
-                       shr.alpha = 1.0f;
-               }
-               else if (bs->type == RE_BAKE_EMIT) {
-                       copy_v3_fl(shr.combined, shi->emit);
-                       shr.alpha = 1.0f;
-               }
-               else if (bs->type == RE_BAKE_VERTEX_COLORS) {
-                       copy_v3_v3(shr.combined, shi->vcol);
-                       shr.alpha = shi->vcol[3];
-               }
-       }
-
-       if (bs->rect_float && !bs->vcol) {
-               float *col = bs->rect_float + 4 * (bs->rectx * y + x);
-               copy_v3_v3(col, shr.combined);
-               if (bs->type == RE_BAKE_ALL || bs->type == RE_BAKE_TEXTURE || bs->type == RE_BAKE_VERTEX_COLORS) {
-                       col[3] = shr.alpha;
-               }
-               else {
-                       col[3] = 1.0;
-               }
-       }
-       else {
-               /* Target is char (LDR). */
-               unsigned char col[4];
-
-               if (ELEM(bs->type, RE_BAKE_ALL, RE_BAKE_TEXTURE)) {
-                       float rgb[3];
-
-                       copy_v3_v3(rgb, shr.combined);
-                       if (R.scene_color_manage) {
-                               /* Vertex colors have no way to specify color space, so they
-                                * default to sRGB. */
-                               if (!bs->vcol)
-                                       IMB_colormanagement_scene_linear_to_colorspace_v3(rgb, bs->rect_colorspace);
-                               else
-                                       linearrgb_to_srgb_v3_v3(rgb, rgb);
-                       }
-                       rgb_float_to_uchar(col, rgb);
-               }
-               else {
-                       rgb_float_to_uchar(col, shr.combined);
-               }
-
-               if (ELEM(bs->type, RE_BAKE_ALL, RE_BAKE_TEXTURE, RE_BAKE_VERTEX_COLORS)) {
-                       col[3] = unit_float_to_uchar_clamp(shr.alpha);
-               }
-               else {
-                       col[3] = 255;
-               }
-
-               if (bs->vcol) {
-                       /* Vertex color baking. Vcol has no useful alpha channel (it exists
-                        * but is used only for vertex painting). */
-                       bs->vcol->r = col[0];
-                       bs->vcol->g = col[1];
-                       bs->vcol->b = col[2];
-               }
-               else {
-                       unsigned char *imcol = (unsigned char *)(bs->rect + bs->rectx * y + x);
-                       copy_v4_v4_uchar(imcol, col);
-               }
-
-       }
-
-       if (bs->rect_mask) {
-               bs->rect_mask[bs->rectx * y + x] = FILTER_MASK_USED;
-       }
-
-       if (bs->do_update) {
-               *bs->do_update = true;
-       }
-}
-
-static void bake_displacement(void *handle, ShadeInput *UNUSED(shi), float dist, int x, int y)
-{
-       BakeShade *bs = handle;
-       float disp;
-
-       if (R.r.bake_flag & R_BAKE_NORMALIZE) {
-               if (R.r.bake_maxdist)
-                       disp = (dist + R.r.bake_maxdist) / (R.r.bake_maxdist * 2);  /* alter the range from [-bake_maxdist, bake_maxdist] to [0, 1]*/
-               else
-                       disp = dist;
-       }
-       else {
-               disp = 0.5f + dist; /* alter the range from [-0.5,0.5] to [0,1]*/
-       }
-
-       if (bs->displacement_buffer) {
-               float *displacement = bs->displacement_buffer + (bs->rectx * y + x);
-               *displacement = disp;
-               bs->displacement_min = min_ff(bs->displacement_min, disp);
-               bs->displacement_max = max_ff(bs->displacement_max, disp);
-       }
-
-       if (bs->rect_float && !bs->vcol) {
-               float *col = bs->rect_float + 4 * (bs->rectx * y + x);
-               col[0] = col[1] = col[2] = disp;
-               col[3] = 1.0f;
-       }
-       else {
-               /* Target is char (LDR). */
-               unsigned char col[4];
-               col[0] = col[1] = col[2] = unit_float_to_uchar_clamp(disp);
-               col[3] = 255;
-
-               if (bs->vcol) {
-                       /* Vertex color baking. Vcol has no useful alpha channel (it exists
-                        * but is used only for vertex painting). */
-                       bs->vcol->r = col[0];
-                       bs->vcol->g = col[1];
-                       bs->vcol->b = col[2];
-               }
-               else {
-                       unsigned char *imcol = (unsigned char *)(bs->rect + bs->rectx * y + x);
-                       copy_v4_v4_uchar(imcol, col);
-               }
-       }
-       if (bs->rect_mask) {
-               bs->rect_mask[bs->rectx * y + x] = FILTER_MASK_USED;
-       }
-}
-
-static int bake_intersect_tree(RayObject *raytree, Isect *isect, float *start, float *dir, float sign, float *hitco, float *dist)
-{
-       float maxdist;
-       int hit;
-
-       /* might be useful to make a user setting for maxsize*/
-       if (R.r.bake_maxdist > 0.0f)
-               maxdist = R.r.bake_maxdist;
-       else
-               maxdist = RE_RAYTRACE_MAXDIST + R.r.bake_biasdist;
-
-       /* 'dir' is always normalized */
-       madd_v3_v3v3fl(isect->start, start, dir, -R.r.bake_biasdist);
-
-       mul_v3_v3fl(isect->dir, dir, sign);
-
-       isect->dist = maxdist;
-
-       hit = RE_rayobject_raycast(raytree, isect);
-       if (hit) {
-               madd_v3_v3v3fl(hitco, isect->start, isect->dir, isect->dist);
-
-               *dist = isect->dist;
-       }
-
-       return hit;
-}
-
-static void bake_set_vlr_dxyco(BakeShade *bs, float *uv1, float *uv2, float *uv3)
-{
-       VlakRen *vlr = bs->vlr;
-       float A, d1, d2, d3, *v1, *v2, *v3;
-
-       if (bs->quad) {
-               v1 = vlr->v1->co;
-               v2 = vlr->v3->co;
-               v3 = vlr->v4->co;
-       }
-       else {
-               v1 = vlr->v1->co;
-               v2 = vlr->v2->co;
-               v3 = vlr->v3->co;
-       }
-
-       /* formula derived from barycentric coordinates:
-        * (uvArea1*v1 + uvArea2*v2 + uvArea3*v3)/uvArea
-        * then taking u and v partial derivatives to get dxco and dyco */
-       A = (uv2[0] - uv1[0]) * (uv3[1] - uv1[1]) - (uv3[0] - uv1[0]) * (uv2[1] - uv1[1]);
-
-       if (fabsf(A) > FLT_EPSILON) {
-               A = 0.5f / A;
-
-               d1 = uv2[1] - uv3[1];
-               d2 = uv3[1] - uv1[1];
-               d3 = uv1[1] - uv2[1];
-               bs->dxco[0] = (v1[0] * d1 + v2[0] * d2 + v3[0] * d3) * A;
-               bs->dxco[1] = (v1[1] * d1 + v2[1] * d2 + v3[1] * d3) * A;
-               bs->dxco[2] = (v1[2] * d1 + v2[2] * d2 + v3[2] * d3) * A;
-
-               d1 = uv3[0] - uv2[0];
-               d2 = uv1[0] - uv3[0];
-               d3 = uv2[0] - uv1[0];
-               bs->dyco[0] = (v1[0] * d1 + v2[0] * d2 + v3[0] * d3) * A;
-               bs->dyco[1] = (v1[1] * d1 + v2[1] * d2 + v3[1] * d3) * A;
-               bs->dyco[2] = (v1[2] * d1 + v2[2] * d2 + v3[2] * d3) * A;
-       }
-       else {
-               bs->dxco[0] = bs->dxco[1] = bs->dxco[2] = 0.0f;
-               bs->dyco[0] = bs->dyco[1] = bs->dyco[2] = 0.0f;
-       }
-
-       if (bs->obi->flag & R_TRANSFORMED) {
-               mul_m3_v3(bs->obi->nmat, bs->dxco);
-               mul_m3_v3(bs->obi->nmat, bs->dyco);
-       }
-}
-
-static void do_bake_shade(void *handle, int x, int y, float u, float v)
-{
-       BakeShade *bs = handle;
-       VlakRen *vlr = bs->vlr;
-       ObjectInstanceRen *obi = bs->obi;
-       Object *ob = obi->obr->ob;
-       float l, *v1, *v2, *v3, tvn[3], ttang[4];
-       int quad;
-       ShadeSample *ssamp = &bs->ssamp;
-       ShadeInput *shi = ssamp->shi;
-
-       /* fast threadsafe break test */
-       if (R.test_break(R.tbh))
-               return;
-
-       /* setup render coordinates */
-       if (bs->quad) {
-               v1 = vlr->v1->co;
-               v2 = vlr->v3->co;
-               v3 = vlr->v4->co;
-       }
-       else {
-               v1 = vlr->v1->co;
-               v2 = vlr->v2->co;
-               v3 = vlr->v3->co;
-       }
-
-       l = 1.0f - u - v;
-
-       /* shrink barycentric coordinates inwards slightly to avoid some issues
-        * where baking selected to active might just miss the other face at the
-        * near the edge of a face */
-       if (bs->actob) {
-               const float eps = 1.0f - 1e-4f;
-               float invsum;
-
-               u = (u - 0.5f) * eps + 0.5f;
-               v = (v - 0.5f) * eps + 0.5f;
-               l = (l - 0.5f) * eps + 0.5f;
-
-               invsum = 1.0f / (u + v + l);
-
-               u *= invsum;
-               v *= invsum;
-               l *= invsum;
-       }
-
-       /* renderco */
-       shi->co[0] = l * v3[0] + u * v1[0] + v * v2[0];
-       shi->co[1] = l * v3[1] + u * v1[1] + v * v2[1];
-       shi->co[2] = l * v3[2] + u * v1[2] + v * v2[2];
-
-       /* avoid self shadow with vertex bake from adjacent faces [#33729] */
-       if ((bs->vcol != NULL) && (bs->actob == NULL)) {
-               madd_v3_v3fl(shi->co, vlr->n, 0.0001f);
-       }
-
-       if (obi->flag & R_TRANSFORMED)
-               mul_m4_v3(obi->mat, shi->co);
-
-       copy_v3_v3(shi->dxco, bs->dxco);
-       copy_v3_v3(shi->dyco, bs->dyco);
-
-       quad = bs->quad;
-       bake_set_shade_input(obi, vlr, shi, quad, 0, x, y, u, v);
-
-       if (bs->type == RE_BAKE_NORMALS && R.r.bake_normal_space == R_BAKE_SPACE_TANGENT) {
-               shade_input_set_shade_texco(shi);
-               copy_v3_v3(tvn, shi->nmapnorm);
-               copy_v4_v4(ttang, shi->nmaptang);
-       }
-
-       /* if we are doing selected to active baking, find point on other face */
-       if (bs->actob) {
-               Isect isec, minisec;
-               float co[3], minco[3], dist, mindist = 0.0f;
-               int hit, sign, dir = 1;
-
-               /* intersect with ray going forward and backward*/
-               hit = 0;
-               memset(&minisec, 0, sizeof(minisec));
-               minco[0] = minco[1] = minco[2] = 0.0f;
-
-               copy_v3_v3(bs->dir, shi->vn);
-
-               for (sign = -1; sign <= 1; sign += 2) {
-                       memset(&isec, 0, sizeof(isec));
-                       isec.mode = RE_RAY_MIRROR;
-
-                       isec.orig.ob   = obi;
-                       isec.orig.face = vlr;
-                       isec.userdata = bs->actob;
-                       isec.check = RE_CHECK_VLR_BAKE;
-                       isec.skip = RE_SKIP_VLR_NEIGHBOUR;
-
-                       if (bake_intersect_tree(R.raytree, &isec, shi->co, shi->vn, sign, co, &dist)) {
-                               if (!hit || len_squared_v3v3(shi->co, co) < len_squared_v3v3(shi->co, minco)) {
-                                       minisec = isec;
-                                       mindist = dist;
-                                       copy_v3_v3(minco, co);
-                                       hit = 1;
-                                       dir = sign;
-                               }
-                       }
-               }
-
-               if (ELEM(bs->type, RE_BAKE_DISPLACEMENT, RE_BAKE_DERIVATIVE)) {
-                       if (hit)
-                               bake_displacement(handle, shi, (dir == -1) ? mindist : -mindist, x, y);
-                       else
-                               bake_displacement(handle, shi, 0.0f, x, y);
-                       return;
-               }
-
-               /* if hit, we shade from the new point, otherwise from point one starting face */
-               if (hit) {
-                       obi = (ObjectInstanceRen *)minisec.hit.ob;
-                       vlr = (VlakRen *)minisec.hit.face;
-                       quad = (minisec.isect == 2);
-                       copy_v3_v3(shi->co, minco);
-
-                       u = -minisec.u;
-                       v = -minisec.v;
-                       bake_set_shade_input(obi, vlr, shi, quad, 1, x, y, u, v);
-               }
-       }
-
-       if (bs->type == RE_BAKE_NORMALS && R.r.bake_normal_space == R_BAKE_SPACE_TANGENT)
-               bake_shade(handle, ob, shi, quad, x, y, u, v, tvn, ttang);
-       else
-               bake_shade(handle, ob, shi, quad, x, y, u, v, NULL, NULL);
-}
-
-static int get_next_bake_face(BakeShade *bs)
-{
-       ObjectRen *obr;
-       VlakRen *vlr;
-       MTFace *tface;
-       static int v = 0, vdone = false;
-       static ObjectInstanceRen *obi = NULL;
-
-       if (bs == NULL) {
-               vlr = NULL;
-               v = vdone = false;
-               obi = R.instancetable.first;
-               return 0;
-       }
-
-       BLI_thread_lock(LOCK_CUSTOM1);
-
-       for (; obi; obi = obi->next, v = 0) {
-               obr = obi->obr;
-
-               /* only allow non instances here */
-               if (obr->flag & R_INSTANCEABLE)
-                       continue;
-
-               for (; v < obr->totvlak; v++) {
-                       vlr = RE_findOrAddVlak(obr, v);
-
-                       if ((bs->actob && bs->actob == obr->ob) || (!bs->actob && (obr->ob->flag & SELECT))) {
-                               if (R.r.bake_flag & R_BAKE_VCOL) {
-                                       /* Gather face data for vertex color bake */
-                                       Mesh *me;
-                                       int *origindex, vcollayer;
-                                       CustomDataLayer *cdl;
-
-                                       if (obr->ob->type != OB_MESH)
-                                               continue;
-                                       me = obr->ob->data;
-
-                                       origindex = RE_vlakren_get_origindex(obr, vlr, 0);
-                                       if (origindex == NULL)
-                                               continue;
-                                       if (*origindex >= me->totpoly) {
-                                               /* Small hack for Array modifier, which gives false
-                                                * original indices - z0r */
-                                               continue;
-                                       }
-#if 0
-                                       /* Only shade selected faces. */
-                                       if ((me->mface[*origindex].flag & ME_FACE_SEL) == 0)
-                                               continue;
-#endif
-
-                                       vcollayer = CustomData_get_render_layer_index(&me->ldata, CD_MLOOPCOL);
-                                       if (vcollayer == -1)
-                                               continue;
-
-                                       cdl = &me->ldata.layers[vcollayer];
-                                       bs->mpoly = me->mpoly + *origindex;
-                                       bs->vcol = ((MLoopCol *)cdl->data) + bs->mpoly->loopstart;
-                                       bs->mloop = me->mloop + bs->mpoly->loopstart;
-
-                                       /* Tag mesh for reevaluation. */
-                                       me->id.tag |= LIB_TAG_DOIT;
-                               }
-                               else {
-                                       Image *ima = NULL;
-                                       ImBuf *ibuf = NULL;
-                                       const float vec_alpha[4] = {0.0f, 0.0f, 0.0f, 0.0f};
-                                       const float vec_solid[4] = {0.0f, 0.0f, 0.0f, 1.0f};
-                                       const float nor_alpha[4] = {0.5f, 0.5f, 1.0f, 0.0f};
-                                       const float nor_solid[4] = {0.5f, 0.5f, 1.0f, 1.0f};
-                                       const float disp_alpha[4] = {0.5f, 0.5f, 0.5f, 0.0f};
-                                       const float disp_solid[4] = {0.5f, 0.5f, 0.5f, 1.0f};
-
-                                       tface = RE_vlakren_get_tface(obr, vlr, obr->bakemtface, NULL, 0);
-
-                                       if (!tface || !tface->tpage)
-                                               continue;
-
-                                       ima = tface->tpage;
-                                       ibuf = BKE_image_acquire_ibuf(ima, NULL, NULL);
-
-                                       if (ibuf == NULL)
-                                               continue;
-
-                                       if (ibuf->rect == NULL && ibuf->rect_float == NULL) {
-                                               BKE_image_release_ibuf(ima, ibuf, NULL);
-                                               continue;
-                                       }
-
-                                       if (ibuf->rect_float && !(ibuf->channels == 0 || ibuf->channels == 4)) {
-                                               BKE_image_release_ibuf(ima, ibuf, NULL);
-                                               continue;
-                                       }
-
-                                       if (ima->flag & IMA_USED_FOR_RENDER) {
-                                               ima->id.tag &= ~LIB_TAG_DOIT;
-                                               BKE_image_release_ibuf(ima, ibuf, NULL);
-                                               continue;
-                                       }
-
-                                       /* find the image for the first time? */
-                                       if (ima->id.tag & LIB_TAG_DOIT) {
-                                               ima->id.tag &= ~LIB_TAG_DOIT;
-
-                                               /* we either fill in float or char, this ensures things go fine */
-                                               if (ibuf->rect_float)
-                                                       imb_freerectImBuf(ibuf);
-                                               /* clear image */
-                                               if (R.r.bake_flag & R_BAKE_CLEAR) {
-                                                       if (R.r.bake_mode == RE_BAKE_NORMALS && R.r.bake_normal_space == R_BAKE_SPACE_TANGENT)
-                                                               IMB_rectfill(ibuf, (ibuf->planes == R_IMF_PLANES_RGBA) ? nor_alpha : nor_solid);
-                                                       else if (ELEM(R.r.bake_mode, RE_BAKE_DISPLACEMENT, RE_BAKE_DERIVATIVE))
-                                                               IMB_rectfill(ibuf, (ibuf->planes == R_IMF_PLANES_RGBA) ? disp_alpha : disp_solid);
-                                                       else
-                                                               IMB_rectfill(ibuf, (ibuf->planes == R_IMF_PLANES_RGBA) ? vec_alpha : vec_solid);
-                                               }
-                                               /* might be read by UI to set active image for display */
-                                               R.bakebuf = ima;
-                                       }
-
-                                       /* Tag image for redraw. */
-                                       ibuf->userflags |= IB_DISPLAY_BUFFER_INVALID;
-                                       BKE_image_release_ibuf(ima, ibuf, NULL);
-                               }
-
-                               bs->obi = obi;
-                               bs->vlr = vlr;
-                               bs->vdone++;  /* only for error message if nothing was rendered */
-                               v++;
-                               BLI_thread_unlock(LOCK_CUSTOM1);
-                               return 1;
-                       }
-               }
-       }
-
-       BLI_thread_unlock(LOCK_CUSTOM1);
-       return 0;
-}
-
-static void bake_single_vertex(BakeShade *bs, VertRen *vert, float u, float v)
-{
-       int *origindex, i;
-       MLoopCol *basevcol;
-       MLoop *mloop;
-
-       /* per vertex fixed seed */
-       BLI_thread_srandom(bs->thread, vert->index);
-
-       origindex = RE_vertren_get_origindex(bs->obi->obr, vert, 0);
-       if (!origindex || *origindex == ORIGINDEX_NONE)
-               return;
-
-       /* Search for matching vertex index and apply shading. */
-       for (i = 0; i < bs->mpoly->totloop; i++) {
-               mloop = bs->mloop + i;
-               if (mloop->v != *origindex)
-                       continue;
-               basevcol = bs->vcol;
-               bs->vcol = basevcol + i;
-               do_bake_shade(bs, 0, 0, u, v);
-               bs->vcol = basevcol;
-               break;
-       }
-}
-
-/* Bake all vertices of a face. Actually, this still works on a face-by-face
- * basis, and each vertex on each face is shaded. Vertex colors are a property
- * of loops, not vertices. */
-static void shade_verts(BakeShade *bs)
-{
-       VlakRen *vlr = bs->vlr;
-
-       /* Disable baking to image; write to vcol instead. vcol pointer is set in
-        * bake_single_vertex. */
-       bs->ima = NULL;
-       bs->rect = NULL;
-       bs->rect_float = NULL;
-       bs->displacement_buffer = NULL;
-       bs->displacement_min = FLT_MAX;
-       bs->displacement_max = -FLT_MAX;
-
-       bs->quad = 0;
-
-       /* No anti-aliasing for vertices. */
-       zero_v3(bs->dxco);
-       zero_v3(bs->dyco);
-
-       /* Shade each vertex of the face. u and v are barycentric coordinates; since
-        * we're only interested in vertices, these will be 0 or 1. */
-       if ((vlr->flag & R_FACE_SPLIT) == 0) {
-               /* Processing triangle face, whole quad, or first half of split quad. */
-
-               bake_single_vertex(bs, bs->vlr->v1, 1.0f, 0.0f);
-               bake_single_vertex(bs, bs->vlr->v2, 0.0f, 1.0f);
-               bake_single_vertex(bs, bs->vlr->v3, 0.0f, 0.0f);
-
-               if (vlr->v4) {
-                       bs->quad = 1;
-                       bake_single_vertex(bs, bs->vlr->v4, 0.0f, 0.0f);
-               }
-       }
-       else {
-               /* Processing second half of split quad. Only one vertex to go. */
-               if (vlr->flag & R_DIVIDE_24) {
-                       bake_single_vertex(bs, bs->vlr->v2, 0.0f, 1.0f);
-               }
-               else {
-                       bake_single_vertex(bs, bs->vlr->v3, 0.0f, 0.0f);
-               }
-       }
-}
-
-/* already have tested for tface and ima and zspan */
-static void shade_tface(BakeShade *bs)
-{
-       VlakRen *vlr = bs->vlr;
-       ObjectInstanceRen *obi = bs->obi;
-       ObjectRen *obr = obi->obr;
-       MTFace *tface = RE_vlakren_get_tface(obr, vlr, obr->bakemtface, NULL, 0);
-       Image *ima = tface->tpage;
-       float vec[4][2];
-       int a, i1, i2, i3;
-
-       /* per face fixed seed */
-       BLI_thread_srandom(bs->thread, vlr->index);
-
-       /* check valid zspan */
-       if (ima != bs->ima) {
-               BKE_image_release_ibuf(bs->ima, bs->ibuf, NULL);
-
-               bs->ima = ima;
-               bs->ibuf = BKE_image_acquire_ibuf(ima, NULL, NULL);
-               /* note, these calls only free/fill contents of zspan struct, not zspan itself */
-               zbuf_free_span(bs->zspan);
-               zbuf_alloc_span(bs->zspan, bs->ibuf->x, bs->ibuf->y, R.clipcrop);
-       }
-
-       bs->rectx = bs->ibuf->x;
-       bs->recty = bs->ibuf->y;
-       bs->rect = bs->ibuf->rect;
-       bs->rect_colorspace = bs->ibuf->rect_colorspace;
-       bs->rect_float = bs->ibuf->rect_float;
-       bs->vcol = NULL;
-       bs->quad = 0;
-       bs->rect_mask = NULL;
-       bs->displacement_buffer = NULL;
-
-       if (bs->use_mask || bs->use_displacement_buffer) {
-               BakeImBufuserData *userdata = bs->ibuf->userdata;
-               if (userdata == NULL) {
-                       BLI_thread_lock(LOCK_CUSTOM1);
-                       userdata = bs->ibuf->userdata;
-                       if (userdata == NULL) /* since the thread was locked, its possible another thread alloced the value */
-                               userdata = MEM_callocN(sizeof(BakeImBufuserData), "BakeImBufuserData");
-
-                       if (bs->use_mask) {
-                               if (userdata->mask_buffer == NULL) {
-                                       userdata->mask_buffer = MEM_callocN(sizeof(char) * bs->rectx * bs->recty, "BakeMask");
-                               }
-                       }
-
-                       if (bs->use_displacement_buffer) {
-                               if (userdata->displacement_buffer == NULL) {
-                                       userdata->displacement_buffer = MEM_callocN(sizeof(float) * bs->rectx * bs->recty, "BakeDisp");
-                               }
-                       }
-
-                       bs->ibuf->userdata = userdata;
-
-                       BLI_thread_unlock(LOCK_CUSTOM1);
-               }
-
-               bs->rect_mask = userdata->mask_buffer;
-               bs->displacement_buffer = userdata->displacement_buffer;
-       }
-
-       /* get pixel level vertex coordinates */
-       for (a = 0; a < 4; a++) {
-               /* Note, workaround for pixel aligned UVs which are common and can screw up our intersection tests
-                * where a pixel gets in between 2 faces or the middle of a quad,
-                * camera aligned quads also have this problem but they are less common.
-                * Add a small offset to the UVs, fixes bug #18685 - Campbell */
-               vec[a][0] = tface->uv[a][0] * (float)bs->rectx - (0.5f + 0.001f);
-               vec[a][1] = tface->uv[a][1] * (float)bs->recty - (0.5f + 0.002f);
-       }
-
-       /* UV indices have to be corrected for possible quad->tria splits */
-       i1 = 0; i2 = 1; i3 = 2;
-       vlr_set_uv_indices(vlr, &i1, &i2, &i3);
-       bake_set_vlr_dxyco(bs, vec[i1], vec[i2], vec[i3]);
-       zspan_scanconvert(bs->zspan, bs, vec[i1], vec[i2], vec[i3], do_bake_shade);
-
-       if (vlr->v4) {
-               bs->quad = 1;
-               bake_set_vlr_dxyco(bs, vec[0], vec[2], vec[3]);
-               zspan_scanconvert(bs->zspan, bs, vec[0], vec[2], vec[3], do_bake_shade);
-       }
-}
-
-static void *do_bake_thread(void *bs_v)
-{
-       BakeShade *bs = bs_v;
-
-       while (get_next_bake_face(bs)) {
-               if (R.r.bake_flag & R_BAKE_VCOL) {
-                       shade_verts(bs);
-               }
-               else {
-                       shade_tface(bs);
-               }
-
-               /* fast threadsafe break test */
-               if (R.test_break(R.tbh))
-                       break;
-
-               /* access is not threadsafe but since its just true/false probably ok
-                * only used for interactive baking */
-               if (bs->do_update) {
-                       *bs->do_update = true;
-               }
-       }
-       bs->ready = true;
-
-       BKE_image_release_ibuf(bs->ima, bs->ibuf, NULL);
-
-       return NULL;
-}
-
-void RE_bake_ibuf_filter(ImBuf *ibuf, char *mask, const int filter)
-{
-       /* must check before filtering */
-       const bool is_new_alpha = (ibuf->planes != R_IMF_PLANES_RGBA) && BKE_imbuf_alpha_test(ibuf);
-
-       /* Margin */
-       if (filter) {
-               IMB_filter_extend(ibuf, mask, filter);
-       }
-
-       /* if the bake results in new alpha then change the image setting */
-       if (is_new_alpha) {
-               ibuf->planes = R_IMF_PLANES_RGBA;
-       }
-       else {
-               if (filter && ibuf->planes != R_IMF_PLANES_RGBA) {
-                       /* clear alpha added by filtering */
-                       IMB_rectfill_alpha(ibuf, 1.0f);
-               }
-       }
-}
-
-void RE_bake_ibuf_normalize_displacement(ImBuf *ibuf, float *displacement, char *mask, float displacement_min, float displacement_max)
-{
-       int i;
-       const float *current_displacement = displacement;
-       const char *current_mask = mask;
-       float max_distance;
-
-       max_distance = max_ff(fabsf(displacement_min), fabsf(displacement_max));
-
-       for (i = 0; i < ibuf->x * ibuf->y; i++) {
-               if (*current_mask == FILTER_MASK_USED) {
-                       float normalized_displacement;
-
-                       if (max_distance > 1e-5f)
-                               normalized_displacement = (*current_displacement + max_distance) / (max_distance * 2);
-                       else
-                               normalized_displacement = 0.5f;
-
-                       if (ibuf->rect_float) {
-                               /* currently baking happens to RGBA only */
-                               float *fp = ibuf->rect_float + i * 4;
-                               fp[0] = fp[1] = fp[2] = normalized_displacement;
-                               fp[3] = 1.0f;
-                       }
-
-                       if (ibuf->rect) {
-                               unsigned char *cp = (unsigned char *) (ibuf->rect + i);
-                               cp[0] = cp[1] = cp[2] = unit_float_to_uchar_clamp(normalized_displacement);
-                               cp[3] = 255;
-                       }
-               }
-
-               current_displacement++;
-               current_mask++;
-       }
-}
-
-/* using object selection tags, the faces with UV maps get baked */
-/* render should have been setup */
-/* returns 0 if nothing was handled */
-int RE_bake_shade_all_selected(Render *re, int type, Object *actob, short *do_update, float *progress)
-{
-       BakeShade *handles;
-       ListBase threads;
-       Image *ima;
-       int a, vdone = false, result = BAKE_RESULT_OK;
-       bool use_mask = false;
-       bool use_displacement_buffer = false;
-       bool do_manage = false;
-
-       if (ELEM(type, RE_BAKE_ALL, RE_BAKE_TEXTURE)) {
-               do_manage = BKE_scene_check_color_management_enabled(re->scene);
-       }
-
-       re->scene_color_manage = BKE_scene_check_color_management_enabled(re->scene);
-
-       /* initialize render global */
-       R = *re;
-       R.bakebuf = NULL;
-
-       /* initialize static vars */
-       get_next_bake_face(NULL);
-
-       /* do we need a mask? */
-       if (re->r.bake_filter)
-               use_mask = true;
-
-       /* do we need buffer to store displacements  */
-       if (ELEM(type, RE_BAKE_DISPLACEMENT, RE_BAKE_DERIVATIVE)) {
-               if (((R.r.bake_flag & R_BAKE_NORMALIZE) && R.r.bake_maxdist == 0.0f) ||
-                   (type == RE_BAKE_DERIVATIVE))
-               {
-                       use_displacement_buffer = true;
-                       use_mask = true;
-               }
-       }
-
-       /* baker uses this flag to detect if image was initialized */
-       if ((R.r.bake_flag & R_BAKE_VCOL) == 0) {
-               for (ima = G.main->image.first; ima; ima = ima->id.next) {
-                       ImBuf *ibuf = BKE_image_acquire_ibuf(ima, NULL, NULL);
-                       ima->id.tag |= LIB_TAG_DOIT;
-                       ima->flag &= ~IMA_USED_FOR_RENDER;
-                       if (ibuf) {
-                               ibuf->userdata = NULL; /* use for masking if needed */
-                       }
-                       BKE_image_release_ibuf(ima, ibuf, NULL);
-               }
-       }
-
-       if (R.r.bake_flag & R_BAKE_VCOL) {
-               /* untag all meshes */
-               BKE_main_id_tag_listbase(&G.main->mesh, LIB_TAG_DOIT, false);
-       }
-
-       BLI_threadpool_init(&threads, do_bake_thread, re->r.threads);
-
-       handles = MEM_callocN(sizeof(BakeShade) * re->r.threads, "BakeShade");
-
-       /* get the threads running */
-       for (a = 0; a < re->r.threads; a++) {
-               handles[a].thread = a;
-
-               /* set defaults in handles */
-               handles[a].ssamp.shi[0].lay = re->lay;
-
-               if (type == RE_BAKE_SHADOW) {
-                       handles[a].ssamp.shi[0].passflag = SCE_PASS_SHADOW;
-               }
-               else {
-                       handles[a].ssamp.shi[0].passflag = SCE_PASS_COMBINED;
-               }
-               handles[a].ssamp.shi[0].combinedflag = ~(SCE_PASS_SPEC);
-               handles[a].ssamp.shi[0].thread = a;
-               handles[a].ssamp.shi[0].do_manage = do_manage;
-               handles[a].ssamp.tot = 1;
-
-               handles[a].type = type;
-               handles[a].actob = actob;
-               if (R.r.bake_flag & R_BAKE_VCOL)
-                       handles[a].zspan = NULL;
-               else
-                       handles[a].zspan = MEM_callocN(sizeof(ZSpan), "zspan for bake");
-
-               handles[a].use_mask = use_mask;
-               handles[a].use_displacement_buffer = use_displacement_buffer;
-
-               handles[a].do_update = do_update; /* use to tell the view to update */
-
-               handles[a].displacement_min = FLT_MAX;
-               handles[a].displacement_max = -FLT_MAX;
-
-               BLI_threadpool_insert(&threads, &handles[a]);
-       }
-
-       /* wait for everything to be done */
-       a = 0;
-       while (a != re->r.threads) {
-               PIL_sleep_ms(50);
-
-               /* calculate progress */
-               for (vdone = false, a = 0; a < re->r.threads; a++)
-                       vdone += handles[a].vdone;
-               if (progress)
-                       *progress = (float)(vdone / (float)re->totvlak);
-
-               for (a = 0; a < re->r.threads; a++) {
-                       if (handles[a].ready == false) {
-                               break;
-                       }
-               }
-       }
-
-       /* filter and refresh images */
-       if ((R.r.bake_flag & R_BAKE_VCOL) == 0) {
-               float displacement_min = FLT_MAX, displacement_max = -FLT_MAX;
-
-               if (use_displacement_buffer) {
-                       for (a = 0; a < re->r.threads; a++) {
-                               displacement_min = min_ff(displacement_min, handles[a].displacement_min);
-                               displacement_max = max_ff(displacement_max, handles[a].displacement_max);
-                       }
-               }
-
-               for (ima = G.main->image.first; ima; ima = ima->id.next) {
-                       if ((ima->id.tag & LIB_TAG_DOIT) == 0) {
-                               ImBuf *ibuf = BKE_image_acquire_ibuf(ima, NULL, NULL);
-                               BakeImBufuserData *userdata;
-
-                               if (ima->flag & IMA_USED_FOR_RENDER)
-                                       result = BAKE_RESULT_FEEDBACK_LOOP;
-
-                               if (!ibuf)
-                                       continue;
-
-                               userdata = (BakeImBufuserData *)ibuf->userdata;
-                               if (userdata) {
-                                       if (use_displacement_buffer) {
-                                               if (type == RE_BAKE_DERIVATIVE) {
-                                                       float user_scale = (R.r.bake_flag & R_BAKE_USERSCALE) ? R.r.bake_user_scale : -1.0f;
-                                                       RE_bake_make_derivative(ibuf, userdata->displacement_buffer, userdata->mask_buffer,
-                                                                               displacement_min, displacement_max, user_scale);
-                                               }
-                                               else {
-                                                       RE_bake_ibuf_normalize_displacement(ibuf, userdata->displacement_buffer, userdata->mask_buffer,
-                                                                                           displacement_min, displacement_max);
-                                               }
-                                       }
-
-                                       RE_bake_ibuf_filter(ibuf, userdata->mask_buffer, re->r.bake_filter);
-                               }
-
-                               ibuf->userflags |= IB_BITMAPDIRTY;
-                               BKE_image_release_ibuf(ima, ibuf, NULL);
-                       }
-               }
-
-               /* calculate return value */
-               for (a = 0; a < re->r.threads; a++) {
-                       zbuf_free_span(handles[a].zspan);
-                       MEM_freeN(handles[a].zspan);
-               }
-       }
-
-       MEM_freeN(handles);
-
-       BLI_threadpool_end(&threads);
-
-       if (vdone == 0) {
-               result = BAKE_RESULT_NO_OBJECTS;
-       }
-
-       return result;
-}
-
-struct Image *RE_bake_shade_get_image(void)
-{
-       return R.bakebuf;
-}
-
-/* **************** Derivative Maps Baker **************** */
-
-static void add_single_heights_margin(const ImBuf *ibuf, const char *mask, float *heights_buffer)
-{
-       int x, y;
-
-       for (y = 0; y < ibuf->y; y++) {
-               for (x = 0; x < ibuf->x; x++) {
-                       int index = ibuf->x * y + x;
-
-                       /* If unassigned pixel, look for neighbors. */
-                       if (mask[index] != FILTER_MASK_USED) {
-                               float height_acc = 0;
-                               int denom = 0;
-                               int i, j;
-
-                               for (j = -1; j <= 1; j++)
-                                       for (i = -1; i <= 1; i++) {
-                                               int w = (i == 0 ? 1 : 0) + (j == 0 ? 1 : 0) + 1;
-
-                                               if (i != 0 || j != 0) {
-                                                       int index2 = 0;
-                                                       int x0 = x + i;
-                                                       int y0 = y + j;
-
-                                                       CLAMP(x0, 0, ibuf->x - 1);
-                                                       CLAMP(y0, 0, ibuf->y - 1);
-
-                                                       index2 = ibuf->x * y0 + x0;
-
-                                                       if (mask[index2] == FILTER_MASK_USED) {
-                                                               height_acc += w * heights_buffer[index2];
-                                                               denom += w;
-                                                       }
-                                          &n