[Bf-blender-cvs] [1ff7a6ef259] temp-lanpr-cleanup2: LANPR: Use viewport "camera" to do cpu mode updates.
YimingWu
noreply at git.blender.org
Thu Nov 7 06:03:08 CET 2019
Commit: 1ff7a6ef2596dcc5c5cc3b13a7e54a79b9ea65c6
Author: YimingWu
Date: Thu Nov 7 13:01:56 2019 +0800
Branches: temp-lanpr-cleanup2
https://developer.blender.org/rB1ff7a6ef2596dcc5c5cc3b13a7e54a79b9ea65c6
LANPR: Use viewport "camera" to do cpu mode updates.
Caution: matrix seems not perfectly aligned.
===================================================================
M source/blender/draw/engines/lanpr/lanpr_engine.c
M source/blender/editors/include/ED_lanpr.h
M source/blender/editors/lanpr/lanpr_cpu.c
===================================================================
diff --git a/source/blender/draw/engines/lanpr/lanpr_engine.c b/source/blender/draw/engines/lanpr/lanpr_engine.c
index 30b4f50d93e..053010f0664 100644
--- a/source/blender/draw/engines/lanpr/lanpr_engine.c
+++ b/source/blender/draw/engines/lanpr/lanpr_engine.c
@@ -221,6 +221,22 @@ static void lanpr_cache_init(void *vedata)
const DRWContextState *draw_ctx = DRW_context_state_get();
Scene *scene = DEG_get_evaluated_scene(draw_ctx->depsgraph);
SceneLANPR *lanpr = &scene->lanpr;
+ View3D *v3d = draw_ctx->v3d;
+ RegionView3D *rv3d = v3d ? draw_ctx->rv3d : NULL;
+
+ BLI_spin_lock(&lanpr_share.lock_render_status);
+ if (rv3d) {
+ copy_v3db_v3fl(lanpr_share.camera_pos, rv3d->viewinv[3]);
+ copy_m4d_m4(lanpr_share.viewinv, rv3d->viewinv);
+ copy_m4d_m4(lanpr_share.persp, rv3d->persmat);
+ lanpr_share.near_clip = v3d->clip_start;
+ lanpr_share.far_clip = v3d->clip_end;
+ lanpr_share.viewport_camera_override = 1;
+ }
+ else {
+ lanpr_share.viewport_camera_override = 0;
+ }
+ BLI_spin_unlock(&lanpr_share.lock_render_status);
int texture_size = lanpr_dpix_texture_size(lanpr);
lanpr_share.texture_size = texture_size;
diff --git a/source/blender/editors/include/ED_lanpr.h b/source/blender/editors/include/ED_lanpr.h
index 94fc3e9c9c6..3a5df33ef9f 100644
--- a/source/blender/editors/include/ED_lanpr.h
+++ b/source/blender/editors/include/ED_lanpr.h
@@ -297,6 +297,9 @@ typedef struct LANPR_RenderBuffer {
int use_intersections;
int _pad;
+ int viewport_override;
+ double camera_pos[3];
+
} LANPR_RenderBuffer;
typedef enum LANPR_RenderStatus {
@@ -346,6 +349,13 @@ typedef struct LANPR_SharedResource {
/** Set before rendering and cleared upon finish! */
struct RenderEngine *re_render;
+
+ /** When drawing in the viewport, use the following values. */
+ int viewport_camera_override;
+ double camera_pos[3];
+ double near_clip, far_clip;
+ double viewinv[4][4];
+ double persp[4][4];
} LANPR_SharedResource;
#define DBL_TRIANGLE_LIM 1e-8
diff --git a/source/blender/editors/lanpr/lanpr_cpu.c b/source/blender/editors/lanpr/lanpr_cpu.c
index 0a1fde7b7ac..1134e0d3670 100644
--- a/source/blender/editors/lanpr/lanpr_cpu.c
+++ b/source/blender/editors/lanpr/lanpr_cpu.c
@@ -94,6 +94,7 @@ static int lanpr_triangle_line_imagespace_intersection_v2(SpinLock *spl,
LANPR_RenderTriangle *rt,
LANPR_RenderLine *rl,
Object *cam,
+ double *override_camera_loc,
double vp[4][4],
double *CameraDir,
double *From,
@@ -686,8 +687,16 @@ static void lanpr_calculate_single_line_occlusion(LANPR_RenderBuffer *rb,
continue;
}
rt->testing[thread_id] = rl;
- if (lanpr_triangle_line_imagespace_intersection_v2(
- &rb->lock_task, (void *)rt, rl, c, rb->view_projection, rb->view_vector, &l, &r)) {
+ if (lanpr_triangle_line_imagespace_intersection_v2(&rb->lock_task,
+ (void *)rt,
+ rl,
+ c,
+ rb->viewport_override ? rb->camera_pos :
+ NULL,
+ rb->view_projection,
+ rb->view_vector,
+ &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. */
@@ -1805,31 +1814,43 @@ 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;
- float sensor = BKE_camera_sensor_size(cam->sensor_fit, cam->sensor_x, cam->sensor_y);
- real fov = focallength_to_fov(cam->lens, sensor);
+ /* lock becore accessing shared status data */
+ BLI_spin_lock(&lanpr_share.lock_render_status);
+
+ if (lanpr_share.viewport_camera_override) {
+ copy_m4_m4_db(proj, lanpr_share.persp);
+ invert_m4_m4(inv, lanpr_share.viewinv);
+ unit_m4_db(lanpr_share.viewinv);
+ mul_m4_m4m4_db_uniq(result, proj, lanpr_share.viewinv);
+ copy_m4_m4_db(proj, result);
+ copy_m4_m4_db(rb->view_projection, proj);
+ }
+ else {
+ float sensor = BKE_camera_sensor_size(cam->sensor_fit, cam->sensor_x, cam->sensor_y);
+ real fov = focallength_to_fov(cam->lens, sensor);
- memset(rb->material_pointers, 0, sizeof(void *) * 2048);
+ memset(rb->material_pointers, 0, sizeof(void *) * 2048);
- real asp = ((real)rb->w / (real)rb->h);
+ real asp = ((real)rb->w / (real)rb->h);
- if (cam->type == CAM_PERSP) {
- tmat_make_perspective_matrix_44d(proj, fov, asp, cam->clip_start, cam->clip_end);
- }
- else if (cam->type == CAM_ORTHO) {
- real w = cam->ortho_scale / 2;
- tmat_make_ortho_matrix_44d(proj, -w, w, -w / asp, w / asp, cam->clip_start, cam->clip_end);
+ if (cam->type == CAM_PERSP) {
+ tmat_make_perspective_matrix_44d(proj, fov, asp, cam->clip_start, cam->clip_end);
+ }
+ else if (cam->type == CAM_ORTHO) {
+ real w = cam->ortho_scale / 2;
+ tmat_make_ortho_matrix_44d(proj, -w, w, -w / asp, w / asp, cam->clip_start, cam->clip_end);
+ }
+ invert_m4_m4(inv, c->obmat);
+ mul_m4db_m4db_m4fl_uniq(result, proj, inv);
+ copy_m4_m4_db(proj, result);
+ copy_m4_m4_db(rb->view_projection, proj);
}
+ BLI_spin_unlock(&lanpr_share.lock_render_status);
unit_m4_db(view);
- /* tObjApplyself_transformMatrix(c, 0); */
- /* tObjApplyGlobalTransformMatrixReverted(c); */
- invert_m4_m4(inv, c->obmat);
- mul_m4db_m4db_m4fl_uniq(result, proj, inv);
- copy_m4_m4_db(proj, result);
- copy_m4_m4_db(rb->view_projection, proj);
-
BLI_listbase_clear(&rb->triangle_buffer_pointers);
BLI_listbase_clear(&rb->vertex_buffer_pointers);
@@ -1842,14 +1863,6 @@ static void lanpr_make_render_geometry_buffers(Depsgraph *depsgraph,
lanpr_make_render_geometry_buffers_object(o, view, proj, rb, usage);
}
DEG_OBJECT_ITER_END;
-
- /* for (collection = s->master_collection.first; collection; collection = collection->ID.next) {
- */
- /* for (co = collection->gobject.first; co; co = co->next) { */
- /* //tObjApplyGlobalTransformMatrixRecursive(o); */
- /* lanpr_make_render_geometry_buffers_object(o, view, proj, rb); */
- /* } */
- /* } */
}
#define INTERSECT_SORT_MIN_TO_MAX_3(ia, ib, ic, lst) \
@@ -1902,6 +1915,7 @@ static int lanpr_triangle_line_imagespace_intersection_v2(SpinLock *UNUSED(spl),
LANPR_RenderTriangle *rt,
LANPR_RenderLine *rl,
Object *cam,
+ double *override_cam_loc,
double vp[4][4],
double *CameraDir,
double *From,
@@ -1955,7 +1969,12 @@ static int lanpr_triangle_line_imagespace_intersection_v2(SpinLock *UNUSED(spl),
copy_v3_v3_db(Cv, CameraDir);
- copy_v4db_v4fl(vd4, cam->obmat[3]);
+ if (override_cam_loc) {
+ copy_v3_v3_db(vd4, override_cam_loc);
+ }
+ else {
+ copy_v4db_v4fl(vd4, cam->obmat[3]);
+ }
if (((Camera *)cam->data)->type == CAM_PERSP) {
sub_v3_v3v3_db(Cv, vd4, rt->v[0]->gloc);
}
@@ -2476,7 +2495,14 @@ static void lanpr_compute_view_vector(LANPR_RenderBuffer *rb)
float trans[3];
float inv[4][4];
- invert_m4_m4(inv, rb->scene->camera->obmat);
+ BLI_spin_lock(&lanpr_share.lock_render_status);
+ if (lanpr_share.viewport_camera_override) {
+ invert_m4_m4(inv, lanpr_share.viewinv);
+ }
+ else {
+ invert_m4_m4(inv, rb->scene->camera->obmat);
+ }
+ BLI_spin_unlock(&lanpr_share.lock_render_status);
transpose_m4(inv);
mul_v3_mat3_m4v3(trans, inv, direction);
copy_v3db_v3fl(rb->view_vector, trans);
@@ -2487,17 +2513,21 @@ static void lanpr_compute_scene_contours(LANPR_RenderBuffer *rb, float threshold
real *view_vector = rb->view_vector;
real Dot1 = 0, Dot2 = 0;
real Result;
- tnsVector3d cam_location;
int Add = 0;
Object *cam_obj = rb->scene->camera;
- Camera *c = cam_obj->data;
+ Camera *c = cam_obj ? cam_obj->data : NULL;
LANPR_RenderLine *rl;
int contour_count = 0;
int crease_count = 0;
int MaterialCount = 0;
- if (c->type == CAM_ORTHO) {
- lanpr_compute_view_vector(rb);
+ if (!rb->viewport_override) {
+ if (c->type == CAM_ORTHO) {
+ lanpr_compute_view_vector(rb);
+ }
+ else if (c->type == CAM_PERSP) {
+ copy_v3db_v3fl(rb->camera_pos, cam_obj->obmat[3]);
+ }
}
for (rl = rb->all_render_lines.first; rl; rl = rl->next) {
@@ -2510,8 +2540,7 @@ static void lanpr_compute_scene_contours(LANPR_RenderBuffer *rb, float threshold
Dot2 = 0;
if (c->type == CAM_PERSP) {
- copy_v3db_v3fl(cam_location, cam_obj->obmat[3]);
- sub_v3_v3v3_db(view_vector, rl->l->gloc, cam_location);
+ sub_v3_v3v3_db(view_vector, rl->l->gloc, rb->camera_pos);
}
if (use_smooth_contour_modifier_contour) {
@@ -2623,13 +2652,18 @@ void ED_lanpr_destroy_render_data(LANPR_RenderBuffer *rb)
LANPR_RenderBuffer *ED_lanpr_create_render_buffer(void)
{
if (lanpr_share.render_buffer_shared) {
+ LANPR_RenderBuffer *rb = lanpr_share.render_buffer_shared;
ED_lanpr_destroy_render_data(lanpr_share.render_buffer_shared);
- return lanpr_share.render_buffer_sh
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list