[Bf-blender-cvs] [4530bb4f4d6] soc-2019-npr: LANPR: use minimum occlusion level needed to speed up CPU mode.
YimingWu
noreply at git.blender.org
Thu Jul 4 08:32:21 CEST 2019
Commit: 4530bb4f4d6fb1f0eeb51eafa9a6942d35f5483b
Author: YimingWu
Date: Thu Jul 4 14:31:23 2019 +0800
Branches: soc-2019-npr
https://developer.blender.org/rB4530bb4f4d6fb1f0eeb51eafa9a6942d35f5483b
LANPR: use minimum occlusion level needed to speed up CPU mode.
===================================================================
M source/blender/draw/engines/lanpr/lanpr_ops.c
===================================================================
diff --git a/source/blender/draw/engines/lanpr/lanpr_ops.c b/source/blender/draw/engines/lanpr/lanpr_ops.c
index dc5725f2083..a48e25c1760 100644
--- a/source/blender/draw/engines/lanpr/lanpr_ops.c
+++ b/source/blender/draw/engines/lanpr/lanpr_ops.c
@@ -999,6 +999,12 @@ void lanpr_cut_render_line(LANPR_RenderBuffer *rb, LANPR_RenderLine *rl, real Be
for (rls = ns; rls && rls != ns2; rls = rls->next) {
rls->occlusion++;
}
+
+ char min_occ = 127;
+ for (rls = rl->segments.first; rls; rls = rls->next) {
+ min_occ = MIN2(min_occ, rls->occlusion);
+ }
+ rl->min_occ = min_occ;
}
int lanpr_make_next_occlusion_task_info(LANPR_RenderBuffer *rb, LANPR_RenderTaskInfo *rti)
@@ -1135,6 +1141,9 @@ void lanpr_calculate_single_line_occlusion(LANPR_RenderBuffer *rb,
&l,
&r)) {
lanpr_cut_render_line(rb, rl, l, r);
+ if (rl->min_occ > rb->max_occlusion_level) {
+ return; /* No need to caluclate any longer. */
+ }
}
}
@@ -3570,6 +3579,80 @@ LANPR_RenderBuffer *lanpr_create_render_buffer()
return rb;
}
+int lanpr_max_occlusion_in_line_layers(SceneLANPR *lanpr);
+
+int lanpr_max_occlusion_in_collections(Collection *c)
+{
+ CollectionChild *cc;
+ int max_occ = 0;
+ int max;
+ if (c->lanpr.use_multiple_levels) {
+ max = MAX2(c->lanpr.level_begin, c->lanpr.level_end);
+ }
+ else {
+ max = c->lanpr.level_begin;
+ }
+ max_occ = MAX2(max, max_occ);
+
+ for (cc = c->children.first; cc; cc = cc->next) {
+ max = lanpr_max_occlusion_in_collections(cc->collection);
+ max_occ = MAX2(max, max_occ);
+ }
+
+ return max_occ;
+}
+
+int lanpr_max_occlusion_in_targets(Scene *s)
+{
+ DRWContextState *cs = DRW_context_state_get();
+ Depsgraph *depsgraph = cs->depsgraph;
+ int max_occ = 0;
+ int max;
+
+ /* Objects */
+ DEG_OBJECT_ITER_BEGIN (depsgraph,
+ o,
+ DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY | DEG_ITER_OBJECT_FLAG_VISIBLE |
+ DEG_ITER_OBJECT_FLAG_DUPLI | DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET) {
+ ModifierData *md;
+ for (md = o->modifiers.first; md; md = md->next) {
+ if (md->type == eModifierType_FeatureLine) {
+ FeatureLineModifierData *flmd = (FeatureLineModifierData *)md;
+ if (flmd->target) {
+ if (flmd->use_multiple_levels) {
+ max = MAX2(flmd->level_begin, flmd->level_end);
+ }
+ else {
+ max = flmd->level_begin;
+ }
+ max_occ = MAX2(max, max_occ);
+ }
+ }
+ }
+ }
+ DEG_OBJECT_ITER_END;
+
+ /* Collections */
+ max = lanpr_max_occlusion_in_collections(s->master_collection);
+
+ max_occ = MAX2(max, max_occ);
+
+ return max_occ;
+}
+
+int lanpr_get_max_occlusion_level(Scene *s)
+{
+ SceneLANPR *lanpr = &s->lanpr;
+ if (!strcmp(s->r.engine, RE_engine_id_BLENDER_LANPR)) {
+ /* Use the line layers in scene LANPR settings */
+ return lanpr_max_occlusion_in_line_layers(lanpr);
+ }
+ else {
+ /* Other engines, use GPencil configurations */
+ return lanpr_max_occlusion_in_targets(s);
+ }
+}
+
void lanpr_rebuild_render_draw_command(LANPR_RenderBuffer *rb, LANPR_LineLayer *ll);
int lanpr_get_render_triangle_size(LANPR_RenderBuffer *rb)
@@ -4199,6 +4282,8 @@ int lanpr_compute_feature_lines_internal(Depsgraph *depsgraph, int intersectons_
rb->triangle_size = lanpr_get_render_triangle_size(rb);
+ rb->max_occlusion_level = lanpr_get_max_occlusion_level(s);
+
lanpr_make_render_geometry_buffers(depsgraph, rb->scene, rb->scene->camera, rb);
lanpr_compute_view_Vector(rb);
@@ -4292,9 +4377,8 @@ void SCENE_OT_lanpr_calculate_feature_lines(struct wmOperatorType *ot)
ot->exec = lanpr_compute_feature_lines_exec;
}
-LANPR_LineLayer *lanpr_new_line_layer(SceneLANPR *lanpr)
+int lanpr_max_occlusion_in_line_layers(SceneLANPR *lanpr)
{
- LANPR_LineLayer *ll = MEM_callocN(sizeof(LANPR_LineLayer), "Line Layer");
LANPR_LineLayer *lli;
int max_occ = 0, max;
for (lli = lanpr->line_layers.first; lli; lli = lli->next) {
@@ -4306,6 +4390,14 @@ LANPR_LineLayer *lanpr_new_line_layer(SceneLANPR *lanpr)
}
max_occ = MAX2(max, max_occ);
}
+ return max_occ;
+}
+
+LANPR_LineLayer *lanpr_new_line_layer(SceneLANPR *lanpr)
+{
+ LANPR_LineLayer *ll = MEM_callocN(sizeof(LANPR_LineLayer), "Line Layer");
+
+ int max_occ = lanpr_max_occlusion_in_line_layers(lanpr);
ll->qi_begin = ll->qi_end = max_occ + 1;
ll->use_same_style = 1;
More information about the Bf-blender-cvs
mailing list