diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2016-10-10 13:41:32 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2016-10-10 13:41:32 +0300 |
commit | 6371f8ff8add8e64213496a0de153715ca794d39 (patch) | |
tree | d3bdf9bc8b5a96b23f7dc4c6a8283fda06d7c461 /source/blender | |
parent | ecbad54df91e4eacb6fb5404bc6338ee4c052e0a (diff) | |
parent | 109192b3601ddfa8ec44ab2fd276298ac690a9a2 (diff) |
Merge branch 'master' into blender2.8
Conflicts:
source/blender/blenloader/intern/readfile.c
source/blender/editors/space_view3d/view3d_draw.c
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/intern/collision.c | 9 | ||||
-rw-r--r-- | source/blender/blenlib/intern/task.c | 8 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 1 | ||||
-rw-r--r-- | source/blender/editors/render/render_opengl.c | 39 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_draw.c | 2 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_modifier_types.h | 3 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_collision.c | 17 | ||||
-rw-r--r-- | source/blender/render/intern/raytrace/rayobject_rtbuild.cpp | 12 | ||||
-rw-r--r-- | source/blender/render/intern/source/pointdensity.c | 11 | ||||
-rw-r--r-- | source/blender/render/intern/source/render_result.c | 2 |
10 files changed, 89 insertions, 15 deletions
diff --git a/source/blender/blenkernel/intern/collision.c b/source/blender/blenkernel/intern/collision.c index 35a7aafdbde..18ca1407ba0 100644 --- a/source/blender/blenkernel/intern/collision.c +++ b/source/blender/blenkernel/intern/collision.c @@ -71,6 +71,15 @@ void collision_move_object(CollisionModifierData *collmd, float step, float prev float tv[3] = {0, 0, 0}; unsigned int i = 0; + /* the collider doesn't move this frame */ + if (collmd->is_static) { + for (i = 0; i < collmd->mvert_num; i++) { + zero_v3(collmd->current_v[i].co); + } + + return; + } + for (i = 0; i < collmd->mvert_num; i++) { sub_v3_v3v3(tv, collmd->xnew[i].co, collmd->x[i].co); VECADDS(collmd->current_x[i].co, collmd->x[i].co, tv, prevstep); diff --git a/source/blender/blenlib/intern/task.c b/source/blender/blenlib/intern/task.c index 9d4d40e1eae..436cd2b8fde 100644 --- a/source/blender/blenlib/intern/task.c +++ b/source/blender/blenlib/intern/task.c @@ -292,15 +292,17 @@ static bool task_scheduler_thread_wait_pop(TaskScheduler *scheduler, Task **task continue; } - if (pool->num_threads == 0 || - pool->currently_running_tasks < pool->num_threads) + if (atomic_add_z(&pool->currently_running_tasks, 1) <= pool->num_threads || + pool->num_threads == 0) { *task = current_task; found_task = true; - atomic_add_z(&pool->currently_running_tasks, 1); BLI_remlink(&scheduler->queue, *task); break; } + else { + atomic_sub_z(&pool->currently_running_tasks, 1); + } } if (!found_task) BLI_condition_wait(&scheduler->queue_cond, &scheduler->queue_mutex); diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 03fcf336700..7048e6d7e9b 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -4824,6 +4824,7 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb) collmd->time_x = collmd->time_xnew = -1000; collmd->mvert_num = 0; collmd->tri_num = 0; + collmd->is_static = false; collmd->bvhtree = NULL; collmd->tri = NULL; diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c index db0ffb90344..f5bc079e06b 100644 --- a/source/blender/editors/render/render_opengl.c +++ b/source/blender/editors/render/render_opengl.c @@ -84,6 +84,10 @@ # include "PIL_time.h" #endif +// TODO(sergey): Find better approximation of the scheduled frames. +// For really highres renders it might fail still. +#define MAX_SCHEDULED_FRAMES 8 + typedef struct OGLRender { Main *bmain; Render *re; @@ -131,10 +135,14 @@ typedef struct OGLRender { wmTimer *timer; /* use to check if running modal or not (invoke'd or exec'd)*/ void **movie_ctx_arr; + TaskScheduler *task_scheduler; TaskPool *task_pool; bool pool_ok; bool is_animation; SpinLock reports_lock; + unsigned int num_scheduled_frames; + ThreadMutex task_mutex; + ThreadCondition task_condition; #ifdef DEBUG_TIME double time_start; @@ -693,11 +701,14 @@ static bool screen_opengl_render_init(bContext *C, wmOperator *op) if (is_animation) { TaskScheduler *task_scheduler = BLI_task_scheduler_get(); if (BKE_imtype_is_movie(scene->r.im_format.imtype)) { + task_scheduler = BLI_task_scheduler_create(1); + oglrender->task_scheduler = task_scheduler; oglrender->task_pool = BLI_task_pool_create_background(task_scheduler, oglrender); BLI_pool_set_num_threads(oglrender->task_pool, 1); } else { + oglrender->task_scheduler = NULL; oglrender->task_pool = BLI_task_pool_create(task_scheduler, oglrender); } @@ -705,8 +716,12 @@ static bool screen_opengl_render_init(bContext *C, wmOperator *op) BLI_spin_init(&oglrender->reports_lock); } else { + oglrender->task_scheduler = NULL; oglrender->task_pool = NULL; } + oglrender->num_scheduled_frames = 0; + BLI_mutex_init(&oglrender->task_mutex); + BLI_condition_init(&oglrender->task_condition); #ifdef DEBUG_TIME oglrender->time_start = PIL_check_seconds_timer(); @@ -724,8 +739,11 @@ static void screen_opengl_render_end(bContext *C, OGLRender *oglrender) if (oglrender->is_animation) { BLI_task_pool_work_and_wait(oglrender->task_pool); BLI_task_pool_free(oglrender->task_pool); + BLI_task_scheduler_free(oglrender->task_scheduler); BLI_spin_end(&oglrender->reports_lock); } + BLI_mutex_end(&oglrender->task_mutex); + BLI_condition_end(&oglrender->task_condition); #ifdef DEBUG_TIME printf("Total render time: %f\n", PIL_check_seconds_timer() - oglrender->time_start); @@ -841,6 +859,15 @@ static void write_result_func(TaskPool * __restrict pool, const bool is_movie = BKE_imtype_is_movie(scene->r.im_format.imtype); const int cfra = task_data->cfra; bool ok; + /* Don't attempt to write if we've got an error. */ + if (!oglrender->pool_ok || G.is_break) { + RE_FreeRenderResult(rr); + BLI_mutex_lock(&oglrender->task_mutex); + oglrender->num_scheduled_frames--; + BLI_condition_notify_all(&oglrender->task_condition); + BLI_mutex_unlock(&oglrender->task_mutex); + return; + } /* Construct local thread0safe copy of reports structure which we can * safely pass to the underlying functions. */ @@ -902,17 +929,29 @@ static void write_result_func(TaskPool * __restrict pool, oglrender->pool_ok = false; } RE_FreeRenderResult(rr); + BLI_mutex_lock(&oglrender->task_mutex); + oglrender->num_scheduled_frames--; + BLI_condition_notify_all(&oglrender->task_condition); + BLI_mutex_unlock(&oglrender->task_mutex); } static bool schedule_write_result(OGLRender *oglrender, RenderResult *rr) { if (!oglrender->pool_ok) { + RE_FreeRenderResult(rr); return false; } Scene *scene = oglrender->scene; WriteTaskData *task_data = MEM_mallocN(sizeof(WriteTaskData), "write task data"); task_data->rr = rr; task_data->cfra = scene->r.cfra; + BLI_mutex_lock(&oglrender->task_mutex); + oglrender->num_scheduled_frames++; + if (oglrender->num_scheduled_frames > MAX_SCHEDULED_FRAMES) { + BLI_condition_wait(&oglrender->task_condition, + &oglrender->task_mutex); + } + BLI_mutex_unlock(&oglrender->task_mutex); BLI_task_pool_push(oglrender->task_pool, write_result_func, task_data, diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index 5f3a07546ca..cf04c25047f 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -1121,4 +1121,4 @@ void VP_legacy_view3d_stereo3d_setup(Scene *scene, View3D *v3d, ARegion *ar) bool VP_legacy_use_depth(Scene *scene, View3D *v3d) { return use_depth_doit(scene, v3d); -}
\ No newline at end of file +} diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index a02948ddc92..87321e9fd93 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -619,6 +619,9 @@ typedef struct CollisionModifierData { unsigned int mvert_num; unsigned int tri_num; float time_x, time_xnew; /* cfra time of modifier */ + char is_static; /* collider doesn't move this frame, i.e. x[].co==xnew[].co */ + char pad[7]; + struct BVHTree *bvhtree; /* bounding volume hierarchy for this cloth object */ } CollisionModifierData; diff --git a/source/blender/modifiers/intern/MOD_collision.c b/source/blender/modifiers/intern/MOD_collision.c index ef6b6e3de61..8790d8083a6 100644 --- a/source/blender/modifiers/intern/MOD_collision.c +++ b/source/blender/modifiers/intern/MOD_collision.c @@ -60,6 +60,7 @@ static void initData(ModifierData *md) collmd->time_x = collmd->time_xnew = -1000; collmd->mvert_num = 0; collmd->tri_num = 0; + collmd->is_static = false; collmd->bvhtree = NULL; } @@ -87,6 +88,7 @@ static void freeData(ModifierData *md) collmd->time_x = collmd->time_xnew = -1000; collmd->mvert_num = 0; collmd->tri_num = 0; + collmd->is_static = false; } } @@ -169,6 +171,7 @@ static void deformVerts(ModifierData *md, Object *ob, ob->pd->pdef_sboft); collmd->time_x = collmd->time_xnew = current_time; + collmd->is_static = true; } else if (mvert_num == collmd->mvert_num) { /* put positions to old positions */ @@ -179,14 +182,19 @@ static void deformVerts(ModifierData *md, Object *ob, memcpy(collmd->xnew, dm->getVertArray(dm), mvert_num * sizeof(MVert)); + bool is_static = true; + for (i = 0; i < mvert_num; i++) { /* we save global positions */ mul_m4_v3(ob->obmat, collmd->xnew[i].co); + + /* detect motion */ + is_static = is_static && equals_v3v3(collmd->x[i].co, collmd->xnew[i].co); } - + memcpy(collmd->current_xnew, collmd->x, mvert_num * sizeof(MVert)); memcpy(collmd->current_x, collmd->x, mvert_num * sizeof(MVert)); - + /* check if GUI setting has changed for bvh */ if (collmd->bvhtree) { if (ob->pd->pdef_sboft != BLI_bvhtree_get_epsilon(collmd->bvhtree)) { @@ -206,7 +214,7 @@ static void deformVerts(ModifierData *md, Object *ob, collmd->tri, collmd->tri_num, ob->pd->pdef_sboft); } - else { + else if (!collmd->is_static || !is_static) { /* recalc static bounding boxes */ bvhtree_update_from_mvert( collmd->bvhtree, @@ -214,7 +222,8 @@ static void deformVerts(ModifierData *md, Object *ob, collmd->tri, collmd->tri_num, true); } - + + collmd->is_static = is_static; collmd->time_xnew = current_time; } else if (mvert_num != collmd->mvert_num) { diff --git a/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp b/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp index 724a809077e..81e41a20f2e 100644 --- a/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp +++ b/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp @@ -31,10 +31,16 @@ #include <assert.h> -#include <math.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" @@ -42,10 +48,6 @@ #include "BLI_math.h" #include "BLI_utildefines.h" -#if __cplusplus >= 201103L -using std::isfinite; -#endif - static bool selected_node(RTBuilder::Object *node) { return node->selected; diff --git a/source/blender/render/intern/source/pointdensity.c b/source/blender/render/intern/source/pointdensity.c index 80c1d4e00a1..ffb44cf6826 100644 --- a/source/blender/render/intern/source/pointdensity.c +++ b/source/blender/render/intern/source/pointdensity.c @@ -188,7 +188,16 @@ static void pointdensity_cache_vertex_color(PointDensity *pd, Object *UNUSED(ob) for (i = 0; i < totloop; i++) { int v = mloop[i].v; - rgb_uchar_to_float(&data_color[v*3], &mcol[i].r); + + if (mcorners[v] == 0) { + rgb_uchar_to_float(&data_color[v * 3], &mcol[i].r); + } + else { + float col[3]; + rgb_uchar_to_float(col, &mcol[i].r); + add_v3_v3(&data_color[v * 3], col); + } + ++mcorners[v]; } diff --git a/source/blender/render/intern/source/render_result.c b/source/blender/render/intern/source/render_result.c index e3fc8174bd6..2be6238eeec 100644 --- a/source/blender/render/intern/source/render_result.c +++ b/source/blender/render/intern/source/render_result.c @@ -1721,7 +1721,7 @@ static RenderView *duplicate_render_view(RenderView *rview) RenderResult *RE_DuplicateRenderResult(RenderResult *rr) { - RenderResult *new_rr = MEM_mallocN(sizeof(RenderResult), "new render result"); + RenderResult *new_rr = MEM_mallocN(sizeof(RenderResult), "new duplicated render result"); *new_rr = *rr; new_rr->next = new_rr->prev = NULL; new_rr->layers.first = new_rr->layers.last = NULL; |