[Bf-blender-cvs] [cb47cc14cda] temp-lanpr-review: LANPR: Removed camera references in RenderBuffer. Safe for thread ops.

YimingWu noreply at git.blender.org
Thu Nov 28 06:28:00 CET 2019


Commit: cb47cc14cda8c36a275432c4ecdf8d872baa2ffe
Author: YimingWu
Date:   Thu Nov 28 13:27:13 2019 +0800
Branches: temp-lanpr-review
https://developer.blender.org/rBcb47cc14cda8c36a275432c4ecdf8d872baa2ffe

LANPR: Removed camera references in RenderBuffer. Safe for thread ops.

===================================================================

M	source/blender/draw/engines/lanpr/lanpr_all.h
M	source/blender/draw/engines/lanpr/lanpr_cpu.c
M	source/blender/draw/engines/lanpr/lanpr_dpix.c
M	source/blender/draw/engines/lanpr/lanpr_engine.c
M	source/blender/editors/include/ED_lanpr.h
M	source/blender/editors/lanpr/lanpr_chain.c
M	source/blender/editors/lanpr/lanpr_cpu.c

===================================================================

diff --git a/source/blender/draw/engines/lanpr/lanpr_all.h b/source/blender/draw/engines/lanpr/lanpr_all.h
index 1c70c02335e..dee6b1853dc 100644
--- a/source/blender/draw/engines/lanpr/lanpr_all.h
+++ b/source/blender/draw/engines/lanpr/lanpr_all.h
@@ -227,7 +227,7 @@ int lanpr_feed_atlas_data_intersection_cache(void *vedata,
                                              float *AtlasEdgeMask,
                                              const int begin_index);
 
-int lanpr_feed_atlas_trigger_preview_obj(void *vedata, const Object *ob, const int begin_index);
+int lanpr_feed_atlas_trigger_preview_obj(void *vedata, Object *ob, const int begin_index);
 void lanpr_create_atlas_intersection_preview(void *vedata, const int begin_index);
 
 void lanpr_dpix_draw_scene(LANPR_TextureList *txl,
diff --git a/source/blender/draw/engines/lanpr/lanpr_cpu.c b/source/blender/draw/engines/lanpr/lanpr_cpu.c
index 6436cc2fcb3..a084e1f1351 100644
--- a/source/blender/draw/engines/lanpr/lanpr_cpu.c
+++ b/source/blender/draw/engines/lanpr/lanpr_cpu.c
@@ -151,8 +151,9 @@ static void lanpr_rebuild_render_draw_command(LANPR_RenderBuffer *rb, LANPR_Line
 
   ll->batch = GPU_batch_create_ex(GPU_PRIM_LINES, vbo, 0, GPU_USAGE_DYNAMIC | GPU_BATCH_OWNS_VBO);
 }
-void ED_lanpr_rebuild_all_command(SceneLANPR *lanpr)
+void ED_lanpr_rebuild_all_command(Scene *s)
 {
+  SceneLANPR *lanpr = &s->lanpr;
   LANPR_LineLayer *ll;
   if (!lanpr || !lanpr_share.render_buffer_shared) {
     return;
@@ -170,7 +171,7 @@ void ED_lanpr_rebuild_all_command(SceneLANPR *lanpr)
     }
   }
 
-  DEG_id_tag_update(&lanpr_share.render_buffer_shared->scene->id, ID_RECALC_COPY_ON_WRITE);
+  DEG_id_tag_update(&s->id, ID_RECALC_COPY_ON_WRITE);
 }
 
 void ED_lanpr_calculate_normal_object_vector(LANPR_LineLayer *ll, float *normal_object_direction)
@@ -227,7 +228,7 @@ void lanpr_software_draw_scene(void *vedata, GPUFrameBuffer *dfb, const int is_r
   static float camdx, camdy, camzoom;
 
   if (is_render) {
-    ED_lanpr_rebuild_all_command(lanpr);
+    ED_lanpr_rebuild_all_command(scene);
   }
 
   float clear_depth = 1.0f;
diff --git a/source/blender/draw/engines/lanpr/lanpr_dpix.c b/source/blender/draw/engines/lanpr/lanpr_dpix.c
index 3f6f36263af..e3a0c800a6c 100644
--- a/source/blender/draw/engines/lanpr/lanpr_dpix.c
+++ b/source/blender/draw/engines/lanpr/lanpr_dpix.c
@@ -360,9 +360,7 @@ static void lanpr_dpix_index_to_coord_absolute(int index, float *x, float *y)
   (*y) = (float)(index / texture_size) + 0.5;
 }
 
-int lanpr_feed_atlas_trigger_preview_obj(void *UNUSED(vedata),
-                                         const Object *ob,
-                                         const int begin_index)
+int lanpr_feed_atlas_trigger_preview_obj(void *UNUSED(vedata), Object *ob, const int begin_index)
 {
   Mesh *me = ob->data;
   if (ob->type != OB_MESH) {
diff --git a/source/blender/draw/engines/lanpr/lanpr_engine.c b/source/blender/draw/engines/lanpr/lanpr_engine.c
index 261c63250ce..3d3f0b28290 100644
--- a/source/blender/draw/engines/lanpr/lanpr_engine.c
+++ b/source/blender/draw/engines/lanpr/lanpr_engine.c
@@ -144,9 +144,6 @@ void DRW_scene_lanpr_freecache(Scene *sce)
       ll->batch = NULL;
     }
   }
-  if (lanpr_share.render_buffer_shared && lanpr_share.render_buffer_shared->scene == sce) {
-    ED_lanpr_destroy_render_data(lanpr_share.render_buffer_shared);
-  }
 }
 
 static void lanpr_dpix_batch_free(void)
@@ -479,7 +476,7 @@ static void lanpr_cache_init(void *vedata)
 
   if (ED_lanpr_calculation_flag_check(LANPR_RENDER_FINISHED) ||
       ED_lanpr_calculation_flag_check(LANPR_RENDER_IDLE)) {
-    ED_lanpr_rebuild_all_command(&draw_ctx->scene->lanpr);
+    ED_lanpr_rebuild_all_command(draw_ctx->scene);
     ED_lanpr_calculation_set_flag(LANPR_RENDER_IDLE);
   }
   else if (!is_render) {
diff --git a/source/blender/editors/include/ED_lanpr.h b/source/blender/editors/include/ED_lanpr.h
index 0611d208abc..b891dc5ddde 100644
--- a/source/blender/editors/include/ED_lanpr.h
+++ b/source/blender/editors/include/ED_lanpr.h
@@ -256,16 +256,17 @@ typedef struct LANPR_RenderBuffer {
   int show_material;
   int override_display;
 
-  struct Scene *scene;
-  struct Object *camera;
-
   int use_intersections;
   int _pad;
 
-  int viewport_override;
-  char viewport_is_persp;
+  /** Keep an copy of these data so the scene can be freed when lanpr is runnning. */
+  char cam_is_persp;
+  float cam_obmat[4][4];
   double camera_pos[3];
   double near_clip, far_clip;
+  double shift_x, shift_y;
+  double chaining_image_threshold;
+  double chaining_geometry_threshold;
 } LANPR_RenderBuffer;
 
 typedef enum LANPR_RenderStatus {
@@ -569,7 +570,9 @@ int ED_lanpr_compute_feature_lines_internal(struct Depsgraph *depsgraph,
 
 void ED_lanpr_compute_feature_lines_background(struct Depsgraph *dg, const int intersection_only);
 
-LANPR_RenderBuffer *ED_lanpr_create_render_buffer(void);
+struct Scene;
+
+LANPR_RenderBuffer *ED_lanpr_create_render_buffer(struct Scene *s);
 void ED_lanpr_destroy_render_data(struct LANPR_RenderBuffer *rb);
 
 bool ED_lanpr_dpix_shader_error(void);
@@ -588,7 +591,7 @@ void ED_lanpr_post_frame_update_external(struct Scene *s, struct Depsgraph *dg);
 
 struct SceneLANPR;
 
-void ED_lanpr_rebuild_all_command(struct SceneLANPR *lanpr);
+void ED_lanpr_rebuild_all_command(struct Scene *s);
 
 void ED_lanpr_update_render_progress(const char *text);
 
diff --git a/source/blender/editors/lanpr/lanpr_chain.c b/source/blender/editors/lanpr/lanpr_chain.c
index 16e2743922a..91e957fd354 100644
--- a/source/blender/editors/lanpr/lanpr_chain.c
+++ b/source/blender/editors/lanpr/lanpr_chain.c
@@ -593,8 +593,8 @@ void ED_lanpr_connect_chains(LANPR_RenderBuffer *rb, const int do_geometry_space
   int occlusion;
   ListBase swap = {0};
 
-  if ((!do_geometry_space && rb->scene->lanpr.chaining_image_threshold < 0.0001) ||
-      (do_geometry_space && rb->scene->lanpr.chaining_geometry_threshold < 0.0001)) {
+  if ((!do_geometry_space && rb->chaining_image_threshold < 0.0001) ||
+      (do_geometry_space && rb->chaining_geometry_threshold < 0.0001)) {
     return;
   }
 
@@ -616,8 +616,7 @@ void ED_lanpr_connect_chains(LANPR_RenderBuffer *rb, const int do_geometry_space
 
     rlci = rlc->chain.last;
     while ((ba = lanpr_get_end_point_bounding_area(rb, rlci)) != NULL) {
-      dist = do_geometry_space ? rb->scene->lanpr.chaining_geometry_threshold :
-                                 rb->scene->lanpr.chaining_image_threshold;
+      dist = do_geometry_space ? rb->chaining_geometry_threshold : rb->chaining_image_threshold;
       closest_cre = NULL;
       if (ba->linked_chains.first == NULL) {
         break;
@@ -663,8 +662,7 @@ void ED_lanpr_connect_chains(LANPR_RenderBuffer *rb, const int do_geometry_space
 
     rlci = rlc->chain.first;
     while ((ba = lanpr_get_end_point_bounding_area(rb, rlci)) != NULL) {
-      dist = do_geometry_space ? rb->scene->lanpr.chaining_geometry_threshold :
-                                 rb->scene->lanpr.chaining_image_threshold;
+      dist = do_geometry_space ? rb->chaining_geometry_threshold : rb->chaining_image_threshold;
       closest_cre = NULL;
       if (ba->linked_chains.first == NULL) {
         break;
diff --git a/source/blender/editors/lanpr/lanpr_cpu.c b/source/blender/editors/lanpr/lanpr_cpu.c
index 5d263381db2..602e8ba6eef 100644
--- a/source/blender/editors/lanpr/lanpr_cpu.c
+++ b/source/blender/editors/lanpr/lanpr_cpu.c
@@ -92,11 +92,12 @@ static LANPR_BoundingArea *lanpr_get_next_bounding_area(LANPR_BoundingArea *This
 static int lanpr_triangle_line_imagespace_intersection_v2(SpinLock *spl,
                                                           const LANPR_RenderTriangle *rt,
                                                           const LANPR_RenderLine *rl,
-                                                          const Object *cam,
                                                           const double *override_camera_loc,
                                                           const char override_cam_is_persp,
                                                           const double vp[4][4],
                                                           const double *camera_dir,
+                                                          const double cam_shift_x,
+                                                          const double cam_shift_y,
                                                           double *from,
                                                           double *to);
 static int lanpr_get_line_bounding_areas(LANPR_RenderBuffer *rb,
@@ -235,9 +236,8 @@ static int lanpr_move_line_layer_exec(bContext *C, wmOperator *op)
 static int ED_lanpr_rebuild_all_commands_exec(bContext *C, wmOperator *UNUSED(op))
 {
   Scene *scene = CTX_data_scene(C);
-  SceneLANPR *lanpr = &scene->lanpr;
 
-  ED_lanpr_rebuild_all_command(lanpr);
+  ED_lanpr_rebuild_all_command(scene);
 
   DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE);
 
@@ -299,7 +299,7 @@ static int lanpr_auto_create_line_layer_exec(bContext *C, wmOperator *op)
 
   lanpr_enable_all_line_types_exec(C, op);
 
-  ED_lanpr_rebuild_all_command(lanpr);
+  ED_lanpr_rebuild_all_command(scene);
 
   return OPERATOR_FINISHED;
 }
@@ -592,7 +592,6 @@ static void lanpr_calculate_single_line_occlusion(LANPR_RenderBuffer *rb,
   LANPR_BoundingArea *nba = ba;
   LANPR_RenderTriangleThread *rt;
   LinkData *lip;
-  Object *c = rb->scene->camera;
   double l, r;
   double k = (rl->r->fbcoord[1] - rl->l->fbcoord[1]) /
              (rl->r->fbcoord[0] - rl->l->fbcoord[0] + 1e-30);
@@ -615,12 +614,12 @@ static void lanpr_calculate_single_line_occlusion(LANPR_RenderBuffer *rb,
       if (lanpr_triangle_line_imagespace_intersection_v2(&rb->lock_task,
                                                          (void *)rt,
                                                          rl,
-                                                         c,
-                                                         rb->viewport_override ? rb->camera_pos :
-                                                                                 NULL,
-                                                         rb->viewport_i

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list