diff options
Diffstat (limited to 'source/blender/render')
22 files changed, 295 insertions, 158 deletions
diff --git a/source/blender/render/CMakeLists.txt b/source/blender/render/CMakeLists.txt index 4b54ddf7225..9e40ab02ee4 100644 --- a/source/blender/render/CMakeLists.txt +++ b/source/blender/render/CMakeLists.txt @@ -27,9 +27,9 @@ set(INC extern/include intern/include - ../blenfont ../blenkernel ../blenlib + ../blentranslation ../imbuf ../depsgraph ../makesdna diff --git a/source/blender/render/SConscript b/source/blender/render/SConscript index 4a9f32bc1ac..16d9b4a832d 100644 --- a/source/blender/render/SConscript +++ b/source/blender/render/SConscript @@ -34,9 +34,9 @@ incs = [ 'extern/include', 'intern/include', '#/intern/guardedalloc', - '../blenfont', '../blenkernel', '../blenlib', + '../blentranslation', '../imbuf', '../depsgraph', '../makesdna', diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h index 2a679f0f0d0..fd56c47c309 100644 --- a/source/blender/render/extern/include/RE_pipeline.h +++ b/source/blender/render/extern/include/RE_pipeline.h @@ -207,6 +207,10 @@ void RE_InitRenderCB(struct Render *re); void RE_FreeRender(struct Render *re); /* only called on exit */ void RE_FreeAllRender(void); +/* Free memory used by persistent data. + * Invoked when loading new file. + */ +void RE_FreeAllPersistentData(void); /* only call on file load */ void RE_FreeAllRenderResults(void); /* for external render engines that can keep persistent data */ diff --git a/source/blender/render/extern/include/RE_render_ext.h b/source/blender/render/extern/include/RE_render_ext.h index 6e1f128b7a5..85a9dc9fccd 100644 --- a/source/blender/render/extern/include/RE_render_ext.h +++ b/source/blender/render/extern/include/RE_render_ext.h @@ -63,7 +63,11 @@ void RE_sample_material_color( struct PointDensity; -void RE_sample_point_density(struct Scene *scene, struct PointDensity *pd, int resolution, float *values); +void RE_sample_point_density(struct Scene *scene, + struct PointDensity *pd, + const int resolution, + const bool use_render_params, + float *values); void RE_init_texture_rng(void); void RE_exit_texture_rng(void); diff --git a/source/blender/render/intern/include/renderdatabase.h b/source/blender/render/intern/include/renderdatabase.h index da45a2bfead..224974454e8 100644 --- a/source/blender/render/intern/include/renderdatabase.h +++ b/source/blender/render/intern/include/renderdatabase.h @@ -115,7 +115,9 @@ struct HaloRen *RE_inithalo_particle(struct Render *re, struct ObjectRen *obr, s struct StrandBuffer *RE_addStrandBuffer(struct ObjectRen *obr, int totvert); struct ObjectRen *RE_addRenderObject(struct Render *re, struct Object *ob, struct Object *par, int index, int psysindex, int lay); -struct ObjectInstanceRen *RE_addRenderInstance(struct Render *re, struct ObjectRen *obr, struct Object *ob, struct Object *par, int index, int psysindex, float mat[4][4], int lay); +struct ObjectInstanceRen *RE_addRenderInstance( + struct Render *re, struct ObjectRen *obr, struct Object *ob, struct Object *par, + int index, int psysindex, float mat[4][4], int lay, const struct DupliObject *dob); void RE_makeRenderInstances(struct Render *re); void RE_instance_rotate_ray_start(struct ObjectInstanceRen *obi, struct Isect *is); diff --git a/source/blender/render/intern/raytrace/rayobject_octree.cpp b/source/blender/render/intern/raytrace/rayobject_octree.cpp index 6cbb0761358..b21197e728d 100644 --- a/source/blender/render/intern/raytrace/rayobject_octree.cpp +++ b/source/blender/render/intern/raytrace/rayobject_octree.cpp @@ -119,7 +119,8 @@ static RayObjectAPI octree_api = /* 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)) +#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) { diff --git a/source/blender/render/intern/source/bake.c b/source/blender/render/intern/source/bake.c index 0210bec5ab4..30036c27b5d 100644 --- a/source/blender/render/intern/source/bake.c +++ b/source/blender/render/intern/source/bake.c @@ -320,7 +320,7 @@ static void bake_shade(void *handle, Object *ob, ShadeInput *shi, int UNUSED(qua } else { unsigned char *imcol = (unsigned char *)(bs->rect + bs->rectx * y + x); - copy_v4_v4_char((char *)imcol, (char *)col); + copy_v4_v4_uchar(imcol, col); } } @@ -375,8 +375,8 @@ static void bake_displacement(void *handle, ShadeInput *UNUSED(shi), float dist, bs->vcol->b = col[2]; } else { - char *imcol = (char *)(bs->rect + bs->rectx * y + x); - copy_v4_v4_char(imcol, (char *)col); + unsigned char *imcol = (unsigned char *)(bs->rect + bs->rectx * y + x); + copy_v4_v4_uchar(imcol, col); } } if (bs->rect_mask) { diff --git a/source/blender/render/intern/source/bake_api.c b/source/blender/render/intern/source/bake_api.c index 508ea8c7c15..77f6ab9cfc2 100644 --- a/source/blender/render/intern/source/bake_api.c +++ b/source/blender/render/intern/source/bake_api.c @@ -64,6 +64,8 @@ * For a complete implementation example look at the Cycles Bake commit. */ +#include <limits.h> + #include "MEM_guardedalloc.h" #include "BLI_math.h" @@ -354,23 +356,30 @@ static bool cast_ray_highpoly( * This function populates an array of verts for the triangles of a mesh * Tangent and Normals are also stored */ -static void mesh_calc_tri_tessface( - TriTessFace *triangles, Mesh *me, bool tangent, DerivedMesh *dm) +static TriTessFace *mesh_calc_tri_tessface( + Mesh *me, bool tangent, DerivedMesh *dm) { int i; MVert *mvert; TSpace *tspace; float *precomputed_normals = NULL; bool calculate_normal; + const int tottri = poly_to_tri_count(me->totpoly, me->totloop); MLoopTri *looptri; + TriTessFace *triangles; + + /* calculate normal for each polygon only once */ + unsigned int mpoly_prev = UINT_MAX; + float no[3]; mvert = CustomData_get_layer(&me->vdata, CD_MVERT); looptri = MEM_mallocN(sizeof(*looptri) * tottri, __func__); + triangles = MEM_mallocN(sizeof(TriTessFace) * tottri, __func__); if (tangent) { DM_ensure_normals(dm); - DM_add_tangent_layer(dm); + DM_calc_loop_tangents(dm); precomputed_normals = dm->getPolyDataArray(dm, CD_NORMAL); calculate_normal = precomputed_normals ? false : true; @@ -389,9 +398,9 @@ static void mesh_calc_tri_tessface( MLoopTri *lt = &looptri[i]; MPoly *mp = &me->mpoly[lt->poly]; - triangles[i].mverts[0] = &mvert[lt->tri[0]]; - triangles[i].mverts[1] = &mvert[lt->tri[1]]; - triangles[i].mverts[2] = &mvert[lt->tri[2]]; + triangles[i].mverts[0] = &mvert[me->mloop[lt->tri[0]].v]; + triangles[i].mverts[1] = &mvert[me->mloop[lt->tri[1]].v]; + triangles[i].mverts[2] = &mvert[me->mloop[lt->tri[2]].v]; triangles[i].is_smooth = (mp->flag & ME_SMOOTH) != 0; if (tangent) { @@ -400,10 +409,12 @@ static void mesh_calc_tri_tessface( triangles[i].tspace[2] = &tspace[lt->tri[2]]; if (calculate_normal) { - normal_tri_v3(triangles[i].normal, - triangles[i].mverts[0]->co, - triangles[i].mverts[1]->co, - triangles[i].mverts[2]->co); + if (lt->poly != mpoly_prev) { + const MPoly *mp = &me->mpoly[lt->poly]; + BKE_mesh_calc_poly_normal(mp, &me->mloop[mp->loopstart], me->mvert, no); + mpoly_prev = lt->poly; + } + copy_v3_v3(triangles[i].normal, no); } else { copy_v3_v3(triangles[i].normal, &precomputed_normals[lt->poly]); @@ -412,6 +423,8 @@ static void mesh_calc_tri_tessface( } MEM_freeN(looptri); + + return triangles; } bool RE_bake_pixels_populate_from_objects( @@ -444,28 +457,23 @@ bool RE_bake_pixels_populate_from_objects( if (!is_cage) { dm_low = CDDM_from_mesh(me_low); - tris_low = MEM_mallocN(sizeof(TriTessFace) * (me_low->totface * 2), "MVerts Lowpoly Mesh"); - mesh_calc_tri_tessface(tris_low, me_low, true, dm_low); + tris_low = mesh_calc_tri_tessface(me_low, true, dm_low); } else if (is_custom_cage) { - tris_low = MEM_mallocN(sizeof(TriTessFace) * (me_low->totface * 2), "MVerts Lowpoly Mesh"); - mesh_calc_tri_tessface(tris_low, me_low, false, NULL); - - tris_cage = MEM_mallocN(sizeof(TriTessFace) * (me_low->totface * 2), "MVerts Cage Mesh"); - mesh_calc_tri_tessface(tris_cage, me_cage, false, NULL); + tris_low = mesh_calc_tri_tessface(me_low, false, NULL); + tris_cage = mesh_calc_tri_tessface(me_cage, false, NULL); } else { - tris_cage = MEM_mallocN(sizeof(TriTessFace) * (me_low->totface * 2), "MVerts Cage Mesh"); - mesh_calc_tri_tessface(tris_cage, me_cage, false, NULL); + tris_cage = mesh_calc_tri_tessface(me_cage, false, NULL); } invert_m4_m4(imat_low, mat_low); for (i = 0; i < tot_highpoly; i++) { - tris_high[i] = MEM_mallocN(sizeof(TriTessFace) * highpoly[i].me->totface, "MVerts Highpoly Mesh"); - mesh_calc_tri_tessface(tris_high[i], highpoly[i].me, false, NULL); + tris_high[i] = mesh_calc_tri_tessface(highpoly[i].me, false, NULL); dm_highpoly[i] = CDDM_from_mesh(highpoly[i].me); + DM_ensure_tessface(dm_highpoly[i]); if (dm_highpoly[i]->getNumTessFaces(dm_highpoly[i]) != 0) { /* Create a bvh-tree for each highpoly object */ @@ -575,13 +583,26 @@ void RE_bake_pixels_populate( size_t i; int a, p_id; - MTFace *mtface; - MFace *mface; + const MLoopUV *mloopuv; + const int tottri = poly_to_tri_count(me->totpoly, me->totloop); + MLoopTri *looptri; /* we can't bake in edit mode */ if (me->edit_btmesh) return; + if ((uv_layer == NULL) || (uv_layer[0] == '\0')) { + mloopuv = CustomData_get_layer(&me->ldata, CD_MLOOPUV); + } + else { + int uv_id = CustomData_get_named_layer(&me->ldata, CD_MLOOPUV, uv_layer); + mloopuv = CustomData_get_layer_n(&me->ldata, CD_MTFACE, uv_id); + } + + if (mloopuv == NULL) + return; + + bd.pixel_array = pixel_array; bd.zspan = MEM_callocN(sizeof(ZSpan) * bake_images->size, "bake zspan"); @@ -594,54 +615,45 @@ void RE_bake_pixels_populate( zbuf_alloc_span(&bd.zspan[i], bake_images->data[i].width, bake_images->data[i].height, R.clipcrop); } - if ((uv_layer == NULL) || (uv_layer[0] == '\0')) { - mtface = CustomData_get_layer(&me->fdata, CD_MTFACE); - } - else { - int uv_id = CustomData_get_named_layer(&me->fdata, CD_MTFACE, uv_layer); - mtface = CustomData_get_layer_n(&me->fdata, CD_MTFACE, uv_id); - } - - mface = CustomData_get_layer(&me->fdata, CD_MFACE); + looptri = MEM_mallocN(sizeof(*looptri) * tottri, __func__); - if (mtface == NULL) - return; + BKE_mesh_recalc_looptri( + me->mloop, me->mpoly, + me->mvert, + me->totloop, me->totpoly, + looptri); p_id = -1; - for (i = 0; i < me->totface; i++) { - float vec[4][2]; - MTFace *mtf = &mtface[i]; - MFace *mf = &mface[i]; - int mat_nr = mf->mat_nr; + for (i = 0; i < tottri; i++) { + const MLoopTri *lt = &looptri[i]; + const MPoly *mp = &me->mpoly[lt->poly]; + float vec[3][2]; + int mat_nr = mp->mat_nr; int image_id = bake_images->lookup[mat_nr]; bd.bk_image = &bake_images->data[image_id]; bd.primitive_id = ++p_id; - for (a = 0; a < 4; a++) { + for (a = 0; a < 3; a++) { + const float *uv = mloopuv[lt->tri[a]].uv; + /* 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] = mtf->uv[a][0] * (float)bd.bk_image->width - (0.5f + 0.001f); - vec[a][1] = mtf->uv[a][1] * (float)bd.bk_image->height - (0.5f + 0.002f); + vec[a][0] = uv[0] * (float)bd.bk_image->width - (0.5f + 0.001f); + vec[a][1] = uv[1] * (float)bd.bk_image->height - (0.5f + 0.002f); } bake_differentials(&bd, vec[0], vec[1], vec[2]); zspan_scanconvert(&bd.zspan[image_id], (void *)&bd, vec[0], vec[1], vec[2], store_bake_pixel); - - /* 4 vertices in the face */ - if (mf->v4 != 0) { - bd.primitive_id = ++p_id; - - bake_differentials(&bd, vec[0], vec[2], vec[3]); - zspan_scanconvert(&bd.zspan[image_id], (void *)&bd, vec[0], vec[2], vec[3], store_bake_pixel); - } } for (i = 0; i < bake_images->size; i++) { zbuf_free_span(&bd.zspan[i]); } + + MEM_freeN(looptri); MEM_freeN(bd.zspan); } @@ -710,8 +722,7 @@ void RE_bake_normal_world_to_tangent( DerivedMesh *dm = CDDM_from_mesh(me); - triangles = MEM_mallocN(sizeof(TriTessFace) * (me->totface * 2), "MVerts Mesh"); - mesh_calc_tri_tessface(triangles, me, true, dm); + triangles = mesh_calc_tri_tessface(me, true, dm); BLI_assert(num_pixels >= 3); diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index 49f7658280e..0adcc16514e 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -44,7 +44,7 @@ # include "BLI_edgehash.h" #endif -#include "BLF_translation.h" +#include "BLT_translation.h" #include "DNA_material_types.h" #include "DNA_curve_types.h" @@ -3275,7 +3275,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset) if (need_nmap_tangent!=0 && CustomData_get_layer_index(&dm->faceData, CD_TANGENT) == -1) { bool generate_data = false; if (CustomData_get_layer_index(&dm->loopData, CD_TANGENT) == -1) { - DM_add_tangent_layer(dm); + dm->calcLoopTangents(dm); generate_data = true; } DM_generate_tangent_tessface_data(dm, generate_data); @@ -4658,7 +4658,7 @@ static void add_render_object(Render *re, Object *ob, Object *par, DupliObject * /* only add instance for objects that have not been used for dupli */ if (!(ob->transflag & OB_RENDER_DUPLI)) { - obi= RE_addRenderInstance(re, obr, ob, par, index, 0, NULL, ob->lay); + obi = RE_addRenderInstance(re, obr, ob, par, index, 0, NULL, ob->lay, dob); if (dob) set_dupli_tex_mat(re, obi, dob, omat); } else @@ -4692,7 +4692,7 @@ static void add_render_object(Render *re, Object *ob, Object *par, DupliObject * /* only add instance for objects that have not been used for dupli */ if (!(ob->transflag & OB_RENDER_DUPLI)) { - obi= RE_addRenderInstance(re, obr, ob, par, index, psysindex, NULL, ob->lay); + obi = RE_addRenderInstance(re, obr, ob, par, index, psysindex, NULL, ob->lay, dob); if (dob) set_dupli_tex_mat(re, obi, dob, omat); } else @@ -5053,7 +5053,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp if (dob->type != OB_DUPLIGROUP || (obr=find_dupligroup_dupli(re, obd, 0))) { mul_m4_m4m4(mat, re->viewmat, dob->mat); /* ob = particle system, use that layer */ - obi= RE_addRenderInstance(re, NULL, obd, ob, dob->persistent_id[0], 0, mat, ob->lay); + obi = RE_addRenderInstance(re, NULL, obd, ob, dob->persistent_id[0], 0, mat, ob->lay, dob); /* fill in instance variables for texturing */ set_dupli_tex_mat(re, obi, dob, dob_extra->obmat); @@ -5080,7 +5080,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp if (dob->type != OB_DUPLIGROUP || (obr=find_dupligroup_dupli(re, obd, psysindex))) { if (obi == NULL) mul_m4_m4m4(mat, re->viewmat, dob->mat); - obi= RE_addRenderInstance(re, NULL, obd, ob, dob->persistent_id[0], psysindex++, mat, obd->lay); + obi = RE_addRenderInstance(re, NULL, obd, ob, dob->persistent_id[0], psysindex++, mat, obd->lay, dob); set_dupli_tex_mat(re, obi, dob, dob_extra->obmat); if (dob->type != OB_DUPLIGROUP) { @@ -5210,7 +5210,7 @@ void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int l /* still bad... doing all */ init_render_textures(re); copy_v3_v3(amb, &re->wrld.ambr); - init_render_materials(re->main, re->r.mode, amb); + init_render_materials(re->main, re->r.mode, amb, (re->r.scemode & R_BUTS_PREVIEW) == 0); set_node_shader_lamp_loop(shade_material_loop); /* MAKE RENDER DATA */ @@ -5941,7 +5941,7 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay, init_render_textures(re); copy_v3_v3(amb, &re->wrld.ambr); - init_render_materials(re->main, re->r.mode, amb); + init_render_materials(re->main, re->r.mode, amb, true); set_node_shader_lamp_loop(shade_material_loop); diff --git a/source/blender/render/intern/source/envmap.c b/source/blender/render/intern/source/envmap.c index 23d021db848..d70cc4b1ee0 100644 --- a/source/blender/render/intern/source/envmap.c +++ b/source/blender/render/intern/source/envmap.c @@ -37,7 +37,7 @@ #include "BLI_threads.h" #include "BLI_utildefines.h" -#include "BLF_translation.h" +#include "BLT_translation.h" #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" /* for rectcpy */ @@ -262,7 +262,6 @@ static void env_set_imats(Render *re) void env_rotate_scene(Render *re, float mat[4][4], int do_rotate) { - GroupObject *go; ObjectRen *obr; ObjectInstanceRen *obi; LampRen *lar = NULL; @@ -321,19 +320,18 @@ void env_rotate_scene(Render *re, float mat[4][4], int do_rotate) invert_m4(obr->ob->imat_ren); } - for (go = re->lights.first; go; go = go->next) { - lar = go->lampren; - + for (lar = re->lampren.first; lar; lar = lar->next) { + float lamp_imat[4][4]; + /* copy from add_render_lamp */ if (do_rotate == 1) mul_m4_m4m4(tmpmat, re->viewmat, lar->lampmat); else mul_m4_m4m4(tmpmat, re->viewmat_orig, lar->lampmat); - invert_m4_m4(go->ob->imat, tmpmat); - + + invert_m4_m4(lamp_imat, tmpmat); copy_m3_m4(lar->mat, tmpmat); - - copy_m3_m4(lar->imat, go->ob->imat); + copy_m3_m4(lar->imat, lamp_imat); lar->vec[0]= -tmpmat[2][0]; lar->vec[1]= -tmpmat[2][1]; @@ -498,7 +496,8 @@ static void render_envmap(Render *re, EnvMap *env) float *alpha; float *rect; - rect = RE_RenderLayerGetPass(rl, SCE_PASS_COMBINED, re->viewname); + /* envmap is rendered independently of multiview */ + rect = RE_RenderLayerGetPass(rl, SCE_PASS_COMBINED, ""); ibuf = IMB_allocImBuf(envre->rectx, envre->recty, 24, IB_rect | IB_rectfloat); memcpy(ibuf->rect_float, rect, ibuf->channels * ibuf->x * ibuf->y * sizeof(float)); diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c index 63d1b609621..8adac7c7770 100644 --- a/source/blender/render/intern/source/external_engine.c +++ b/source/blender/render/intern/source/external_engine.c @@ -36,7 +36,7 @@ #include "MEM_guardedalloc.h" -#include "BLF_translation.h" +#include "BLT_translation.h" #include "BLI_listbase.h" #include "BLI_string.h" @@ -361,10 +361,12 @@ void RE_engine_set_error_message(RenderEngine *engine, const char *msg) Render *re = engine->re; if (re != NULL) { RenderResult *rr = RE_AcquireResultRead(re); - if (rr->error != NULL) { - MEM_freeN(rr->error); + if (rr) { + if (rr->error != NULL) { + MEM_freeN(rr->error); + } + rr->error = BLI_strdup(msg); } - rr->error = BLI_strdup(msg); RE_ReleaseResult(re); } } diff --git a/source/blender/render/intern/source/multires_bake.c b/source/blender/render/intern/source/multires_bake.c index d46e241f8f5..dcc33b99742 100644 --- a/source/blender/render/intern/source/multires_bake.c +++ b/source/blender/render/intern/source/multires_bake.c @@ -456,7 +456,7 @@ static void do_multires_bake(MultiresBakeRender *bkr, Image *ima, bool require_t if (require_tangent) { if (CustomData_get_layer_index(&dm->loopData, CD_TANGENT) == -1) - DM_add_tangent_layer(dm); + DM_calc_loop_tangents(dm); pvtangent = DM_get_loop_data_layer(dm, CD_TANGENT); } @@ -612,7 +612,7 @@ static void get_ccgdm_data(DerivedMesh *lodm, DerivedMesh *hidm, int col = cell_index % polys_per_grid_side; /* S is the vertex whose grid we are examining */ - S = loc_cage_poly_offs / (polys_per_grid_side * polys_per_grid_side); + S = poly_index / (1 << (2 * (lvl - 1))) - grid_offset[cage_face_index]; /* get offset of grid data for original cage face */ g_index = grid_offset[cage_face_index]; @@ -1179,20 +1179,20 @@ static void apply_ao_callback(DerivedMesh *lores_dm, DerivedMesh *hires_dm, void static void count_images(MultiresBakeRender *bkr) { - int a, totface; + int a, totpoly; DerivedMesh *dm = bkr->lores_dm; - MTFace *mtface = CustomData_get_layer(&dm->faceData, CD_MTFACE); + MTexPoly *mtexpoly = CustomData_get_layer(&dm->polyData, CD_MTEXPOLY); BLI_listbase_clear(&bkr->image); bkr->tot_image = 0; - totface = dm->getNumTessFaces(dm); + totpoly = dm->getNumPolys(dm); - for (a = 0; a < totface; a++) - mtface[a].tpage->id.flag &= ~LIB_DOIT; + for (a = 0; a < totpoly; a++) + mtexpoly[a].tpage->id.flag &= ~LIB_DOIT; - for (a = 0; a < totface; a++) { - Image *ima = mtface[a].tpage; + for (a = 0; a < totpoly; a++) { + Image *ima = mtexpoly[a].tpage; if ((ima->id.flag & LIB_DOIT) == 0) { LinkData *data = BLI_genericNodeN(ima); BLI_addtail(&bkr->image, data); @@ -1201,8 +1201,8 @@ static void count_images(MultiresBakeRender *bkr) } } - for (a = 0; a < totface; a++) - mtface[a].tpage->id.flag &= ~LIB_DOIT; + for (a = 0; a < totpoly; a++) + mtexpoly[a].tpage->id.flag &= ~LIB_DOIT; } static void bake_images(MultiresBakeRender *bkr, MultiresBakeResult *result) diff --git a/source/blender/render/intern/source/occlusion.c b/source/blender/render/intern/source/occlusion.c index d5a45bd1126..c5c3b6bbf94 100644 --- a/source/blender/render/intern/source/occlusion.c +++ b/source/blender/render/intern/source/occlusion.c @@ -43,7 +43,7 @@ #include "BLI_threads.h" #include "BLI_utildefines.h" -#include "BLF_translation.h" +#include "BLT_translation.h" #include "BKE_node.h" #include "BKE_scene.h" diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 796dfd1094b..d6ba97533b5 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -55,7 +55,7 @@ #include "BLI_rand.h" #include "BLI_callbacks.h" -#include "BLF_translation.h" +#include "BLT_translation.h" #include "BKE_animsys.h" /* <------ should this be here?, needed for sequencer update */ #include "BKE_camera.h" @@ -533,6 +533,17 @@ void RE_FreeAllRender(void) #endif } +void RE_FreeAllPersistentData(void) +{ + Render *re; + for (re = RenderGlobal.renderlist.first; re != NULL; re = re->next) { + if ((re->r.mode & R_PERSISTENT_DATA) != 0 && re->engine != NULL) { + RE_engine_free(re->engine); + re->engine = NULL; + } + } +} + /* on file load, free all re */ void RE_FreeAllRenderResults(void) { @@ -1270,8 +1281,11 @@ static void main_render_result_new(Render *re) BLI_rw_mutex_unlock(&re->resultmutex); - if (re->result->do_exr_tile) - render_result_exr_file_begin(re); + if (re->result) { + if (re->result->do_exr_tile) { + render_result_exr_file_begin(re); + } + } } static void threaded_tile_processor(Render *re) @@ -3154,11 +3168,17 @@ void RE_RenderFreestyleStrokes(Render *re, Main *bmain, Scene *scene, int render void RE_RenderFreestyleExternal(Render *re) { if (!re->test_break(re->tbh)) { - RE_Database_FromScene(re, re->main, re->scene, re->lay, 1); - RE_Database_Preprocess(re); + RenderView *rv; + init_freestyle(re); - add_freestyle(re, 1); - RE_Database_Free(re); + + for (rv = re->result->views.first; rv; rv = rv->next) { + RE_SetActiveRenderView(re, rv->name); + RE_Database_FromScene(re, re->main, re->scene, re->lay, 1); + RE_Database_Preprocess(re); + add_freestyle(re, 1); + RE_Database_Free(re); + } } } #endif @@ -3503,6 +3523,11 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri get_videos_dimensions(re, &rd, &width, &height); mh = BKE_movie_handle_get(scene->r.im_format.imtype); + if (mh == NULL) { + BKE_report(re->reports, RPT_ERROR, "Movie format unsupported"); + return; + } + re->movie_ctx_arr = MEM_mallocN(sizeof(void *) * totvideos, "Movies' Context"); for (i = 0; i < totvideos; i++) { diff --git a/source/blender/render/intern/source/pointdensity.c b/source/blender/render/intern/source/pointdensity.c index 165a1bbb687..9b58bde730a 100644 --- a/source/blender/render/intern/source/pointdensity.c +++ b/source/blender/render/intern/source/pointdensity.c @@ -40,7 +40,7 @@ #include "BLI_kdopbvh.h" #include "BLI_utildefines.h" -#include "BLF_translation.h" +#include "BLT_translation.h" #include "BKE_DerivedMesh.h" #include "BKE_lattice.h" @@ -121,7 +121,8 @@ static void pointdensity_cache_psys(Scene *scene, ParticleSystem *psys, float viewmat[4][4], float winmat[4][4], - int winx, int winy) + int winx, int winy, + const bool use_render_params) { DerivedMesh *dm; ParticleKey state; @@ -140,9 +141,20 @@ static void pointdensity_cache_psys(Scene *scene, } /* Just to create a valid rendering context for particles */ - psys_render_set(ob, psys, viewmat, winmat, winx, winy, 0); + if (use_render_params) { + psys_render_set(ob, psys, viewmat, winmat, winx, winy, 0); + } - dm = mesh_create_derived_render(scene, ob, CD_MASK_BAREMESH | CD_MASK_MTFACE | CD_MASK_MCOL); + if (use_render_params) { + dm = mesh_create_derived_render(scene, + ob, + CD_MASK_BAREMESH | CD_MASK_MTFACE | CD_MASK_MCOL); + } + else { + dm = mesh_get_derived_final(scene, + ob, + CD_MASK_BAREMESH | CD_MASK_MTFACE | CD_MASK_MCOL); + } if ( !psys_check_enabled(ob, psys)) { psys_render_restore(ob, psys); @@ -240,17 +252,32 @@ static void pointdensity_cache_psys(Scene *scene, psys->lattice_deform_data = NULL; } - psys_render_restore(ob, psys); + if (use_render_params) { + psys_render_restore(ob, psys); + } } -static void pointdensity_cache_object(Scene *scene, PointDensity *pd, Object *ob) +static void pointdensity_cache_object(Scene *scene, + PointDensity *pd, + Object *ob, + const bool use_render_params) { int i; DerivedMesh *dm; MVert *mvert = NULL; - dm = mesh_create_derived_render(scene, ob, CD_MASK_BAREMESH | CD_MASK_MTFACE | CD_MASK_MCOL); + if (use_render_params) { + dm = mesh_create_derived_render(scene, + ob, + CD_MASK_BAREMESH | CD_MASK_MTFACE | CD_MASK_MCOL); + } + else { + dm = mesh_get_derived_final(scene, + ob, + CD_MASK_BAREMESH | CD_MASK_MTFACE | CD_MASK_MCOL); + + } mvert = dm->getVertArray(dm); /* local object space */ pd->totpoints = dm->getNumVerts(dm); @@ -290,7 +317,8 @@ static void cache_pointdensity_ex(Scene *scene, PointDensity *pd, float viewmat[4][4], float winmat[4][4], - int winx, int winy) + int winx, int winy, + const bool use_render_params) { if (pd == NULL) { return; @@ -314,18 +342,28 @@ static void cache_pointdensity_ex(Scene *scene, return; } - pointdensity_cache_psys(scene, pd, ob, psys, viewmat, winmat, winx, winy); + pointdensity_cache_psys(scene, + pd, + ob, + psys, + viewmat, winmat, + winx, winy, + use_render_params); } else if (pd->source == TEX_PD_OBJECT) { Object *ob = pd->object; if (ob && ob->type == OB_MESH) - pointdensity_cache_object(scene, pd, ob); + pointdensity_cache_object(scene, pd, ob, use_render_params); } } void cache_pointdensity(Render *re, PointDensity *pd) { - cache_pointdensity_ex(re->scene, pd, re->viewmat, re->winmat, re->winx, re->winy); + cache_pointdensity_ex(re->scene, + pd, + re->viewmat, re->winmat, + re->winx, re->winy, + true); } void free_pointdensity(PointDensity *pd) @@ -597,6 +635,9 @@ int pointdensitytex(Tex *tex, const float texvec[3], TexResult *texres) BRICONT; + if (pd->color_source == TEX_PD_COLOR_CONSTANT) + return retval; + retval |= pointdensity_color(pd, texres, age, vec); BRICONTRGB; @@ -614,33 +655,71 @@ static void sample_dummy_point_density(int resolution, float *values) memset(values, 0, sizeof(float) * 4 * resolution * resolution * resolution); } -static void particle_system_minmax(Object *object, +static void particle_system_minmax(Scene *scene, + Object *object, ParticleSystem *psys, float radius, + const bool use_render_params, float min[3], float max[3]) { + const float size[3] = {radius, radius, radius}; + const float cfra = BKE_scene_frame_get(scene); ParticleSettings *part = psys->part; - float imat[4][4]; - float size[3] = {radius, radius, radius}; - PARTICLE_P; + ParticleSimulationData sim = {NULL}; + ParticleData *pa = NULL; + int i; + int total_particles; + float mat[4][4], imat[4][4]; + INIT_MINMAX(min, max); if (part->type == PART_HAIR) { /* TOOD(sergey): Not supported currently. */ return; } + + unit_m4(mat); + if (use_render_params) { + psys_render_set(object, psys, mat, mat, 1, 1, 0); + } + + sim.scene = scene; + sim.ob = object; + sim.psys = psys; + sim.psmd = psys_get_modifier(object, psys); + invert_m4_m4(imat, object->obmat); - LOOP_PARTICLES { + total_particles = psys->totpart + psys->totchild; + psys->lattice_deform_data = psys_create_lattice_deform_data(&sim); + + for (i = 0, pa = psys->particles; i < total_particles; i++, pa++) { float co_object[3], co_min[3], co_max[3]; - mul_v3_m4v3(co_object, imat, pa->state.co); + ParticleKey state; + state.time = cfra; + if (!psys_get_particle_state(&sim, i, &state, 0)) { + continue; + } + mul_v3_m4v3(co_object, imat, state.co); sub_v3_v3v3(co_min, co_object, size); add_v3_v3v3(co_max, co_object, size); minmax_v3v3_v3(min, max, co_min); minmax_v3v3_v3(min, max, co_max); } + + if (psys->lattice_deform_data) { + end_latt_deform(psys->lattice_deform_data); + psys->lattice_deform_data = NULL; + } + + if (use_render_params) { + psys_render_restore(object, psys); + } } -void RE_sample_point_density(Scene *scene, PointDensity *pd, - int resolution, float *values) +void RE_sample_point_density(Scene *scene, + PointDensity *pd, + const int resolution, + const bool use_render_params, + float *values) { const size_t resolution2 = resolution * resolution; Object *object = pd->object; @@ -663,7 +742,12 @@ void RE_sample_point_density(Scene *scene, PointDensity *pd, sample_dummy_point_density(resolution, values); return; } - particle_system_minmax(object, psys, pd->radius, min, max); + particle_system_minmax(scene, + object, + psys, + pd->radius, + use_render_params, + min, max); } else { float radius[3] = {pd->radius, pd->radius, pd->radius}; @@ -686,7 +770,7 @@ void RE_sample_point_density(Scene *scene, PointDensity *pd, unit_m4(mat); BLI_mutex_lock(&sample_mutex); - cache_pointdensity_ex(scene, pd, mat, mat, 1, 1); + cache_pointdensity_ex(scene, pd, mat, mat, 1, 1, use_render_params); for (z = 0; z < resolution; ++z) { for (y = 0; y < resolution; ++y) { for (x = 0; x < resolution; ++x) { diff --git a/source/blender/render/intern/source/rayshade.c b/source/blender/render/intern/source/rayshade.c index 2b1d5b8c1e5..900312ee984 100644 --- a/source/blender/render/intern/source/rayshade.c +++ b/source/blender/render/intern/source/rayshade.c @@ -45,7 +45,7 @@ #include "BLI_rand.h" #include "BLI_utildefines.h" -#include "BLF_translation.h" +#include "BLT_translation.h" #include "BKE_node.h" @@ -736,6 +736,7 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, con //shi.sample= 0; // memset above, so don't need this shi.xs= origshi->xs; shi.ys= origshi->ys; + shi.do_manage= origshi->do_manage; shi.lay= origshi->lay; shi.passflag= SCE_PASS_COMBINED; /* result of tracing needs no pass info */ shi.combinedflag= 0xFFFFFF; /* ray trace does all options */ @@ -1622,6 +1623,7 @@ static void ray_trace_shadow_tra(Isect *is, ShadeInput *origshi, int depth, int shi.xs= origshi->xs; shi.ys= origshi->ys; + shi.do_manage= origshi->do_manage; shi.lay= origshi->lay; shi.nodes= origshi->nodes; diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c index 894ade42a1f..910ea16607e 100644 --- a/source/blender/render/intern/source/rendercore.c +++ b/source/blender/render/intern/source/rendercore.c @@ -1971,9 +1971,9 @@ void add_halo_flare(Render *re) rect = RE_RenderLayerGetPass(rl, SCE_PASS_COMBINED, re->viewname); - if (rl==NULL || rect) - return; - + if (rect==NULL) + continue; + mode= R.r.mode; R.r.mode &= ~R_PANORAMA; diff --git a/source/blender/render/intern/source/renderdatabase.c b/source/blender/render/intern/source/renderdatabase.c index d271592af5f..5f78c8a52db 100644 --- a/source/blender/render/intern/source/renderdatabase.c +++ b/source/blender/render/intern/source/renderdatabase.c @@ -1363,7 +1363,9 @@ void project_renderdata(Render *re, /* ------------------------------------------------------------------------- */ -ObjectInstanceRen *RE_addRenderInstance(Render *re, ObjectRen *obr, Object *ob, Object *par, int index, int psysindex, float mat[4][4], int lay) +ObjectInstanceRen *RE_addRenderInstance( + Render *re, ObjectRen *obr, Object *ob, Object *par, + int index, int psysindex, float mat[4][4], int lay, const DupliObject *dob) { ObjectInstanceRen *obi; float mat3[3][3]; @@ -1377,33 +1379,30 @@ ObjectInstanceRen *RE_addRenderInstance(Render *re, ObjectRen *obr, Object *ob, obi->lay= lay; /* Fill particle info */ - if (obi->psysindex >= 0) { - int psysindex = 0; - int index; - ParticleSystem *psys; - if (obi->par) { - for (psys = obi->par->particlesystem.first; psys; psys = psys->next) { - if (psysindex == obi->psysindex) - break; - ++psysindex; + if (par && dob) { + const ParticleSystem *psys = dob->particle_system; + if (psys) { + int index; + if (obi->index < psys->totpart) { + index = obi->index; } - if (psys) { - if (obi->index < psys->totpart) - index = obi->index; - else { - index = psys->child[obi->index - psys->totpart].parent; - } - if (index >= 0) { - ParticleData* p = &psys->particles[index]; - obi->part_index = index; - obi->part_size = p->size; - obi->part_age = RE_GetStats(re)->cfra - p->time; - obi->part_lifetime = p->lifetime; - - copy_v3_v3(obi->part_co, p->state.co); - copy_v3_v3(obi->part_vel, p->state.vel); - copy_v3_v3(obi->part_avel, p->state.ave); - } + else if (psys->child) { + index = psys->child[obi->index - psys->totpart].parent; + } + else { + index = -1; + } + + if (index >= 0) { + const ParticleData *p = &psys->particles[index]; + obi->part_index = index; + obi->part_size = p->size; + obi->part_age = RE_GetStats(re)->cfra - p->time; + obi->part_lifetime = p->lifetime; + + copy_v3_v3(obi->part_co, p->state.co); + copy_v3_v3(obi->part_vel, p->state.vel); + copy_v3_v3(obi->part_avel, p->state.ave); } } } diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c index 39dfa48d3f1..91f9723897c 100644 --- a/source/blender/render/intern/source/shadeoutput.c +++ b/source/blender/render/intern/source/shadeoutput.c @@ -1815,7 +1815,7 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr) shr->combined[1]= shi->g; shr->combined[2]= shi->b; shr->alpha= shi->alpha; - return; + goto finally_shadeless; } if ( (ma->mode & (MA_VERTEXCOL|MA_VERTEXCOLP))== MA_VERTEXCOL ) { /* vertexcolor light */ @@ -2006,7 +2006,11 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr) add_v3_v3(shr->combined, shr->emit); if (shi->combinedflag & SCE_PASS_SPEC) add_v3_v3(shr->combined, shr->spec); - + + + /* Last section of this function applies to shadeless colors too */ +finally_shadeless: + /* modulate by the object color */ if ((ma->shade_flag & MA_OBCOLOR) && shi->obr->ob) { if (!(ma->sss_flag & MA_DIFF_SSS) || !sss_pass_done(&R, ma)) { diff --git a/source/blender/render/intern/source/sss.c b/source/blender/render/intern/source/sss.c index 890b0445ecc..553710b4367 100644 --- a/source/blender/render/intern/source/sss.c +++ b/source/blender/render/intern/source/sss.c @@ -55,7 +55,7 @@ #include "BLI_ghash.h" #include "BLI_memarena.h" -#include "BLF_translation.h" +#include "BLT_translation.h" #include "DNA_material_types.h" diff --git a/source/blender/render/intern/source/volume_precache.c b/source/blender/render/intern/source/volume_precache.c index 6135a8761bb..78ede01d6c1 100644 --- a/source/blender/render/intern/source/volume_precache.c +++ b/source/blender/render/intern/source/volume_precache.c @@ -44,7 +44,7 @@ #include "BLI_voxel.h" #include "BLI_utildefines.h" -#include "BLF_translation.h" +#include "BLT_translation.h" #include "PIL_time.h" diff --git a/source/blender/render/intern/source/voxeldata.c b/source/blender/render/intern/source/voxeldata.c index 8bc5c7a1c8f..bb92a8f7e8a 100644 --- a/source/blender/render/intern/source/voxeldata.c +++ b/source/blender/render/intern/source/voxeldata.c @@ -46,7 +46,7 @@ #include "BLI_voxel.h" #include "BLI_utildefines.h" -#include "BLF_translation.h" +#include "BLT_translation.h" #include "IMB_imbuf.h" #include "IMB_imbuf_types.h" |