[Bf-blender-cvs] [cc401d81b9b] temp-lanpr-cleanup2: LANPR: Fixed redering code for no-camera situations.

YimingWu noreply at git.blender.org
Thu Nov 7 07:55:58 CET 2019


Commit: cc401d81b9b20937cb4095822116346e113acecd
Author: YimingWu
Date:   Thu Nov 7 14:55:23 2019 +0800
Branches: temp-lanpr-cleanup2
https://developer.blender.org/rBcc401d81b9b20937cb4095822116346e113acecd

LANPR: Fixed redering code for no-camera situations.

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

M	source/blender/editors/include/ED_lanpr.h
M	source/blender/editors/lanpr/lanpr_cpu.c

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

diff --git a/source/blender/editors/include/ED_lanpr.h b/source/blender/editors/include/ED_lanpr.h
index b6163a91f89..1ce18304dfd 100644
--- a/source/blender/editors/include/ED_lanpr.h
+++ b/source/blender/editors/include/ED_lanpr.h
@@ -296,7 +296,7 @@ typedef struct LANPR_RenderBuffer {
 
   int viewport_override;
   double camera_pos[3];
-
+  double near_clip, far_clip;
 } LANPR_RenderBuffer;
 
 typedef enum LANPR_RenderStatus {
diff --git a/source/blender/editors/lanpr/lanpr_cpu.c b/source/blender/editors/lanpr/lanpr_cpu.c
index bd35f6ab1f9..43cc63f195b 100644
--- a/source/blender/editors/lanpr/lanpr_cpu.c
+++ b/source/blender/editors/lanpr/lanpr_cpu.c
@@ -1023,17 +1023,27 @@ static void lanpr_cull_triangles(LANPR_RenderBuffer *rb)
   int v_count = 0, t_count = 0;
   Object *o;
 
-  real cam_pos[3];
-  Object *cam = ((Object *)rb->scene->camera);
-  cam_pos[0] = cam->obmat[3][0];
-  cam_pos[1] = cam->obmat[3][1];
-  cam_pos[2] = cam->obmat[3][2];
 
-  real view_dir[3], clip_advance[3];
+  double view_dir[3], clip_advance[3];
   copy_v3_v3_db(view_dir, rb->view_vector);
   copy_v3_v3_db(clip_advance, rb->view_vector);
-  mul_v3db_db(clip_advance, -((Camera *)cam->data)->clip_start);
-  add_v3_v3_db(cam_pos, clip_advance);
+
+  double cam_pos[3];
+  double clip_start, clip_end;
+  if(rb->viewport_override){
+    copy_v3_v3_db(cam_pos, rb->camera_pos);
+    clip_start = rb->near_clip;
+    clip_end = rb->far_clip;
+  }else{
+    Object *cam = ((Object *)rb->scene->camera);
+    cam_pos[0] = cam->obmat[3][0];
+    cam_pos[1] = cam->obmat[3][1];
+    cam_pos[2] = cam->obmat[3][2];
+    mul_v3db_db(clip_advance, -((Camera *)cam->data)->clip_start);
+    add_v3_v3_db(cam_pos, clip_advance);
+  }
+
+  
 
   veln = lanpr_new_cull_point_space64(rb);
   teln = lanpr_new_cull_triangle_space64(rb);
@@ -1048,13 +1058,13 @@ static void lanpr_cull_triangles(LANPR_RenderBuffer *rb)
     for (i = 0; i < reln->element_count; i++) {
       int In1 = 0, In2 = 0, In3 = 0;
       rt = (void *)(((unsigned char *)reln->pointer) + rb->triangle_size * i);
-      if (rt->v[0]->fbcoord[3] < ((Camera *)cam->data)->clip_start) {
+      if (rt->v[0]->fbcoord[3] < clip_start) {
         In1 = 1;
       }
-      if (rt->v[1]->fbcoord[3] < ((Camera *)cam->data)->clip_start) {
+      if (rt->v[1]->fbcoord[3] < clip_start) {
         In2 = 1;
       }
-      if (rt->v[2]->fbcoord[3] < ((Camera *)cam->data)->clip_start) {
+      if (rt->v[2]->fbcoord[3] < clip_start) {
         In3 = 1;
       }
 
@@ -1556,23 +1566,21 @@ static void lanpr_perspective_division(LANPR_RenderBuffer *rb)
 {
   LANPR_RenderVert *rv;
   LANPR_RenderElementLinkNode *reln;
-  Camera *cam = rb->scene->camera->data;
+  Camera *cam = rb->scene->camera? rb->scene->camera->data : NULL;
   int i;
 
-  if (cam->type != CAM_PERSP) {
+  if (cam && cam->type != CAM_PERSP) {
     return;
   }
 
   for (reln = rb->vertex_buffer_pointers.first; reln; reln = reln->next) {
     rv = reln->pointer;
     for (i = 0; i < reln->element_count; i++) {
-      /*  if (rv->fbcoord[2] < -DBL_EPSILON) continue; */
       mul_v3db_db(rv[i].fbcoord, 1 / rv[i].fbcoord[3]);
-      /*  rv[i].fbcoord[2] = cam->clipsta * cam->clipend / (cam->clipend - */
-      /*  fabs(rv[i].fbcoord[2]) * (cam->clipend - cam->clipsta)); */
-
-      rv[i].fbcoord[0] -= cam->shiftx * 2;
-      rv[i].fbcoord[1] -= cam->shifty * 2;
+      if(cam){
+        rv[i].fbcoord[0] -= cam->shiftx * 2;
+        rv[i].fbcoord[1] -= cam->shifty * 2;
+      }
     }
   }
 }
@@ -1813,7 +1821,6 @@ static void lanpr_make_render_geometry_buffers(Depsgraph *depsgraph,
 {
   double proj[4][4], view[4][4], result[4][4];
   float inv[4][4];
-  Camera *cam = c->data;
   int cam_override;
 
   /* lock becore accessing shared status data */
@@ -1828,6 +1835,7 @@ static void lanpr_make_render_geometry_buffers(Depsgraph *depsgraph,
     copy_m4_m4_db(rb->view_projection, proj);
   }
   else {
+    Camera *cam = c->data;
     float sensor = BKE_camera_sensor_size(cam->sensor_fit, cam->sensor_x, cam->sensor_y);
     real fov = focallength_to_fov(cam->lens, sensor);
 
@@ -1975,7 +1983,7 @@ static int lanpr_triangle_line_imagespace_intersection_v2(SpinLock *UNUSED(spl),
   else {
     copy_v4db_v4fl(vd4, cam->obmat[3]);
   }
-  if (((Camera *)cam->data)->type == CAM_PERSP) {
+  if (override_cam_loc || (((Camera *)cam->data)->type == CAM_PERSP)) {
     sub_v3_v3v3_db(Cv, vd4, rt->v[0]->gloc);
   }
 
@@ -2025,23 +2033,21 @@ static int lanpr_triangle_line_imagespace_intersection_v2(SpinLock *UNUSED(spl),
     Cut = DotRA > DotLA ? 1 - Cut : Cut;
   }
 
-  if (((Camera *)cam->data)->type == CAM_PERSP) {
+  if (override_cam_loc || (((Camera *)cam->data)->type == CAM_PERSP)) {
     interp_v3_v3v3_db(gloc, rl->l->gloc, rl->r->gloc, Cut);
     mul_v4_m4v3_db(Trans, vp, gloc);
     mul_v3db_db(Trans, (1 / Trans[3]) /**HeightMultiply/2*/);
-    Camera *camera = cam->data;
-    Trans[0] -= camera->shiftx * 2;
-    Trans[1] -= camera->shifty * 2;
+    if(cam){
+      Camera *camera = cam->data;
+      Trans[0] -= camera->shiftx * 2;
+      Trans[1] -= camera->shifty * 2;
+    }
   }
   else {
     interp_v3_v3v3_db(Trans, rl->l->fbcoord, rl->r->fbcoord, Cut);
     /*  mul_v4_m4v3_db(Trans, vp, gloc); */
   }
 
-  /*  Trans[2] = tmat_dist_3dv(gloc, cam->Base.gloc); */
-  /*  Trans[2] = cam->clipsta*cam->clipend / (cam->clipend - fabs(Trans[2]) * (cam->clipend - */
-  /*  cam->clipsta)); */
-
   /*  prevent vertical problem ? */
   if (rl->l->fbcoord[0] != rl->r->fbcoord[0]) {
     Cut = tMatGetLinearRatio(rl->l->fbcoord[0], rl->r->fbcoord[0], Trans[0]);
@@ -2116,23 +2122,6 @@ static int lanpr_triangle_line_imagespace_intersection_v2(SpinLock *UNUSED(spl),
   }
 
   real LF = DotL * DotF, RF = DotR * DotF;
-  /*  int CrossCount = a + b + c; */
-  /*  if (CrossCount == 2) { */
-  /* 	INTERSECT_JUST_GREATER(is, order, 0, LCross); */
-  /* 	if (!TNS_ABC(LCross)) INTERSECT_JUST_GREATER(is, order, is[LCross], LCross); */
-  /* 	INTERSECT_JUST_GREATER(is, order, is[LCross], RCross); */
-  /* }else if(CrossCount == 1 || StL+StR==1) { */
-  /* 	if (StL) { */
-  /* 		INTERSECT_JUST_GREATER(is, order, DBL_TRIANGLE_LIM, RCross); */
-  /* 		INTERSECT_JUST_SMALLER(is, order, is[RCross], LCross); */
-  /* 	}else if(StR) { */
-  /* 		INTERSECT_JUST_SMALLER(is, order, 1 - DBL_TRIANGLE_LIM, LCross); */
-  /* 		INTERSECT_JUST_GREATER(is, order, is[LCross], RCross); */
-  /* 	} */
-  /* }else if(CrossCount == 0) { */
-  /* 	INTERSECT_JUST_SMALLER(is, order, 0, LCross); */
-  /* 	INTERSECT_JUST_GREATER(is, order, 1, RCross); */
-  /* } */
 
   if (LF <= 0 && RF <= 0 && (DotL || DotR)) {
 
@@ -2315,13 +2304,21 @@ static LANPR_RenderLine *lanpr_triangle_generate_intersection_line_only(
   LANPR_RenderVert *TE0 = 0;
   LANPR_RenderVert *TE1 = 0;
   LANPR_RenderVert *TE2 = 0;
-  tnsVector3d cl; /*  rb->scene->ActiveCamera->gloc; */
-  real ZMax = ((Camera *)rb->camera->data)->clip_end;
-  real ZMin = ((Camera *)rb->camera->data)->clip_start;
+  tnsVector3d cl;
+
+  double ZMin, ZMax;
+  Camera *cam;
+  if(rb->viewport_override){
+    ZMax = rb->far_clip;
+    ZMin = rb->near_clip;
+    copy_v3db_v3fl(cl, rb->camera_pos);
+  }else{
+    ZMax = ((Camera *)rb->camera->data)->clip_end;
+    ZMin = ((Camera *)rb->camera->data)->clip_start;
+    cam = rb->camera->data;
+    copy_v3db_v3fl(cl, rb->camera->obmat[3]);
+  }
   LANPR_RenderVert *Share = lanpr_triangle_share_point(testing, rt);
-  Camera *cam = rb->camera->data;
-
-  copy_v3db_v3fl(cl, rb->camera->obmat[3]);
 
   if (Share) {
     LANPR_RenderVert *NewShare;
@@ -2409,10 +2406,12 @@ static LANPR_RenderLine *lanpr_triangle_generate_intersection_line_only(
   mul_v3db_db(l->fbcoord, (1 / l->fbcoord[3]) /**HeightMultiply/2*/);
   mul_v3db_db(r->fbcoord, (1 / r->fbcoord[3]) /**HeightMultiply/2*/);
 
-  l->fbcoord[0] -= cam->shiftx * 2;
-  l->fbcoord[1] -= cam->shifty * 2;
-  r->fbcoord[0] -= cam->shiftx * 2;
-  r->fbcoord[1] -= cam->shifty * 2;
+  if(!rb->viewport_override){
+    l->fbcoord[0] -= cam->shiftx * 2;
+    l->fbcoord[1] -= cam->shifty * 2;
+    r->fbcoord[0] -= cam->shiftx * 2;
+    r->fbcoord[1] -= cam->shifty * 2;
+  }
 
   l->fbcoord[2] = ZMin * ZMax / (ZMax - fabs(l->fbcoord[2]) * (ZMax - ZMin));
   r->fbcoord[2] = ZMin * ZMax / (ZMax - fabs(r->fbcoord[2]) * (ZMax - ZMin));
@@ -2539,7 +2538,7 @@ static void lanpr_compute_scene_contours(LANPR_RenderBuffer *rb, float threshold
     Dot1 = 0;
     Dot2 = 0;
 
-    if (c->type == CAM_PERSP) {
+    if (rb->viewport_override || c->type == CAM_PERSP) {
       sub_v3_v3v3_db(view_vector, rl->l->gloc, rb->camera_pos);
     }
 
@@ -2656,6 +2655,8 @@ LANPR_RenderBuffer *ED_lanpr_create_render_buffer(void)
     ED_lanpr_destroy_render_data(lanpr_share.render_buffer_shared);
     rb->viewport_override = lanpr_share.viewport_camera_override;
     copy_v3_v3_db(rb->camera_pos, lanpr_share.camera_pos);
+    rb->near_clip = lanpr_share.near_clip;
+    rb->far_clip = lanpr_share.far_clip;
     return rb;
   }
 
@@ -2664,6 +2665,8 @@ LANPR_RenderBuffer *ED_lanpr_create_render_buffer(void)
   lanpr_share.render_buffer_shared = rb;
   rb->viewport_override = lanpr_share.viewport_camera_override;
   copy_v3_v3_db(rb->camera_pos, lanpr_share.camera_pos);
+  rb->near_clip = lanpr_share.near_clip;
+  rb->far_clip = lanpr_share.far_clip;
 
   BLI_spin_init(&rb->lock_task);
   BLI_spin_init(&rb->render_data_pool.lock_mem);



More information about the Bf-blender-cvs mailing list