Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Montagne <montagne29@wanadoo.fr>2016-10-10 13:41:32 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2016-10-10 13:41:32 +0300
commit6371f8ff8add8e64213496a0de153715ca794d39 (patch)
treed3bdf9bc8b5a96b23f7dc4c6a8283fda06d7c461 /source/blender
parentecbad54df91e4eacb6fb5404bc6338ee4c052e0a (diff)
parent109192b3601ddfa8ec44ab2fd276298ac690a9a2 (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.c9
-rw-r--r--source/blender/blenlib/intern/task.c8
-rw-r--r--source/blender/blenloader/intern/readfile.c1
-rw-r--r--source/blender/editors/render/render_opengl.c39
-rw-r--r--source/blender/editors/space_view3d/view3d_draw.c2
-rw-r--r--source/blender/makesdna/DNA_modifier_types.h3
-rw-r--r--source/blender/modifiers/intern/MOD_collision.c17
-rw-r--r--source/blender/render/intern/raytrace/rayobject_rtbuild.cpp12
-rw-r--r--source/blender/render/intern/source/pointdensity.c11
-rw-r--r--source/blender/render/intern/source/render_result.c2
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;