[Bf-blender-cvs] [4aad147] viewport_experiments: Support camera GPU parameters when looking/rendering through camera in the viewport.
Antony Riakiotakis
noreply at git.blender.org
Tue Nov 4 14:32:07 CET 2014
Commit: 4aad147fe457d7d1cc916645e07569a19833e068
Author: Antony Riakiotakis
Date: Tue Nov 4 14:28:25 2014 +0100
Branches: viewport_experiments
https://developer.blender.org/rB4aad147fe457d7d1cc916645e07569a19833e068
Support camera GPU parameters when looking/rendering through camera in
the viewport.
===================================================================
M source/blender/blenkernel/BKE_camera.h
M source/blender/blenkernel/intern/camera.c
M source/blender/editors/include/ED_view3d.h
M source/blender/editors/render/render_opengl.c
M source/blender/editors/space_view3d/view3d_draw.c
M source/blender/gpu/intern/gpu_compositing.c
M source/blender/makesdna/DNA_gpu_types.h
M source/blender/makesdna/DNA_view3d_types.h
M source/blender/makesrna/intern/rna_space.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_camera.h b/source/blender/blenkernel/BKE_camera.h
index 01b401c..52fbc73 100644
--- a/source/blender/blenkernel/BKE_camera.h
+++ b/source/blender/blenkernel/BKE_camera.h
@@ -46,6 +46,7 @@ struct RenderData;
struct Scene;
struct rctf;
struct View3D;
+struct GPUFXOptions;
/* Camera Datablock */
@@ -120,6 +121,8 @@ void BKE_camera_view_frame(struct Scene *scene, struct Camera *camera, float r_v
bool BKE_camera_view_frame_fit_to_scene(struct Scene *scene, struct View3D *v3d, struct Object *camera_ob,
float r_co[3]);
+void BKE_GPU_dof_from_camera(struct Object *camera, struct GPUFXOptions *options);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenkernel/intern/camera.c b/source/blender/blenkernel/intern/camera.c
index 1402f62..215da01 100644
--- a/source/blender/blenkernel/intern/camera.c
+++ b/source/blender/blenkernel/intern/camera.c
@@ -593,3 +593,19 @@ bool BKE_camera_view_frame_fit_to_scene(Scene *scene, struct View3D *v3d, Object
}
}
}
+
+void BKE_GPU_dof_from_camera(struct Object *camera, struct GPUFXOptions *options)
+{
+ if (camera->type == OB_CAMERA) {
+ Camera *cam = camera->data;
+ options->dof_options = &cam->gpu_dof;
+ if (cam->dof_ob) {
+ float vec[3];
+ sub_v3_v3v3(vec, cam->dof_ob->obmat[3], camera->obmat[3]);
+ options->dof_options->dof_focus_distance = len_v3(vec);
+ }
+ else {
+ options->dof_options->dof_focus_distance = cam->YF_dofdist;
+ }
+ }
+}
diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h
index 9b998fc..b51e210 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -63,6 +63,7 @@ struct wmOperatorType;
struct wmWindow;
struct GPUFX;
struct GPUOffScreen;
+struct GPUFXOptions;
/* for derivedmesh drawing callbacks, for view3d_select, .... */
typedef struct ViewContext {
@@ -306,7 +307,7 @@ int ED_view3d_scene_layer_set(int lay, const int *values, int *active);
bool ED_view3d_context_activate(struct bContext *C);
void ED_view3d_draw_offscreen_init(struct Scene *scene, struct View3D *v3d);
void ED_view3d_draw_offscreen(struct Scene *scene, struct View3D *v3d, struct ARegion *ar, int winx, int winy, float viewmat[4][4],
- float winmat[4][4], bool do_bgpic, bool do_sky, struct GPUFX *fx, bool is_persp, struct GPUOffScreen *ofs);
+ float winmat[4][4], bool do_bgpic, bool do_sky, struct GPUFX *fx, bool is_persp, struct GPUOffScreen *ofs, struct GPUFXOptions *fxoptions, int fxflags);
struct ImBuf *ED_view3d_draw_offscreen_imbuf(struct Scene *scene, struct View3D *v3d, struct ARegion *ar, int sizex, int sizey, unsigned int flag,
bool draw_background, int alpha_mode, char err_out[256]);
diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c
index cadd086..7266f5e 100644
--- a/source/blender/editors/render/render_opengl.c
+++ b/source/blender/editors/render/render_opengl.c
@@ -33,6 +33,7 @@
#include "MEM_guardedalloc.h"
+#include "DNA_camera_types.h"
#include "BLI_math.h"
#include "BLI_math_color_blend.h"
#include "BLI_blenlib.h"
@@ -42,6 +43,7 @@
#include "DNA_scene_types.h"
#include "DNA_object_types.h"
+#include "BKE_camera.h"
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_image.h"
@@ -206,6 +208,12 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
}
else if (view_context) {
bool is_persp;
+ /* full copy */
+ GPUFXOptions options = {0};
+
+ if (v3d->fxoptions)
+ options = *v3d->fxoptions;
+
ED_view3d_draw_offscreen_init(scene, v3d);
GPU_offscreen_bind(oglrender->ofs, true); /* bind */
@@ -216,6 +224,7 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
camera = v3d->camera;
RE_GetCameraWindow(oglrender->re, camera, scene->r.cfra, winmat);
is_persp = true;
+ BKE_GPU_dof_from_camera(camera, &options);
}
else {
rctf viewplane;
@@ -231,7 +240,7 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
rect = MEM_mallocN(sizex * sizey * sizeof(unsigned char) * 4, "offscreen rect");
if ((scene->r.mode & R_OSA) == 0) {
- ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat, draw_bgpic, draw_sky, oglrender->fx, is_persp, oglrender->ofs);
+ ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat, draw_bgpic, draw_sky, oglrender->fx, is_persp, oglrender->ofs, &options, v3d->shader_fx);
GPU_offscreen_read_pixels(oglrender->ofs, GL_UNSIGNED_BYTE, rect);
}
else {
@@ -244,7 +253,7 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
BLI_jitter_init(jit_ofs, scene->r.osa);
/* first sample buffer, also initializes 'rv3d->persmat' */
- ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat, draw_bgpic, draw_sky, oglrender->fx, is_persp, oglrender->ofs);
+ ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat, draw_bgpic, draw_sky, oglrender->fx, is_persp, oglrender->ofs, &options, v3d->shader_fx);
GPU_offscreen_read_pixels(oglrender->ofs, GL_UNSIGNED_BYTE, rect);
for (i = 0; i < sizex * sizey * 4; i++)
@@ -257,7 +266,7 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
(jit_ofs[j][0] * 2.0f) / sizex,
(jit_ofs[j][1] * 2.0f) / sizey);
- ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat_jitter, draw_bgpic, draw_sky, oglrender->fx, is_persp, oglrender->ofs);
+ ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat_jitter, draw_bgpic, draw_sky, oglrender->fx, is_persp, oglrender->ofs, &options, v3d->shader_fx);
GPU_offscreen_read_pixels(oglrender->ofs, GL_UNSIGNED_BYTE, rect);
for (i = 0; i < sizex * sizey * 4; i++)
@@ -448,7 +457,7 @@ static bool screen_opengl_render_init(bContext *C, wmOperator *op)
* running notifiers again will overwrite */
oglrender->scene->customdata_mask |= oglrender->scene->customdata_mask_modal;
- if (oglrender->v3d->shader_fx & (V3D_FX_DEPTH_OF_FIELD | V3D_FX_DEPTH_OF_FIELD)) {
+ if (oglrender->v3d->shader_fx & (GPU_FX_DEPTH_OF_FIELD | GPU_FX_DEPTH_OF_FIELD)) {
oglrender->fx = GPU_create_fx_compositor();
}
}
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index c8386eb..e9bcb8fe 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -2501,7 +2501,7 @@ static void gpu_update_lamps_shadows(Scene *scene, View3D *v3d)
invert_m4_m4(rv3d.persinv, rv3d.viewinv);
/* no need to call ED_view3d_draw_offscreen_init since shadow buffers were already updated */
- ED_view3d_draw_offscreen(scene, v3d, &ar, winsize, winsize, viewmat, winmat, false, false, NULL, true, NULL);
+ ED_view3d_draw_offscreen(scene, v3d, &ar, winsize, winsize, viewmat, winmat, false, false, NULL, true, NULL, NULL, 0);
GPU_lamp_shadow_buffer_unbind(shadow->lamp);
v3d->drawtype = drawtype;
@@ -2811,7 +2811,7 @@ void ED_view3d_draw_offscreen_init(Scene *scene, View3D *v3d)
*/
void ED_view3d_draw_offscreen(Scene *scene, View3D *v3d, ARegion *ar, int winx, int winy,
float viewmat[4][4], float winmat[4][4],
- bool do_bgpic, bool do_sky, GPUFX *fx, bool is_persp, GPUOffScreen *ofs)
+ bool do_bgpic, bool do_sky, GPUFX *fx, bool is_persp, GPUOffScreen *ofs, GPUFXOptions *fxoptions, int fxflags)
{
int bwinx, bwiny;
rcti brect;
@@ -2849,7 +2849,7 @@ void ED_view3d_draw_offscreen(Scene *scene, View3D *v3d, ARegion *ar, int winx,
/* framebuffer fx needed, we need to draw offscreen first */
if (v3d->shader_fx && fx) {
- do_compositing = GPU_initialize_fx_passes(fx, &ar->winrct, NULL, v3d->shader_fx, v3d->fxoptions);
+ do_compositing = GPU_initialize_fx_passes(fx, &ar->winrct, NULL, fxflags, fxoptions);
}
/* clear opengl buffers */
@@ -2937,6 +2937,8 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Scene *scene, View3D *v3d, ARegion *ar, in
/* render 3d view */
if (rv3d->persp == RV3D_CAMOB && v3d->camera) {
CameraParams params;
+ GPUFXOptions options = {0};
+ Object *camera = v3d->camera;
BKE_camera_params_init(¶ms);
/* fallback for non camera objects */
@@ -2946,10 +2948,12 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Scene *scene, View3D *v3d, ARegion *ar, in
BKE_camera_params_compute_viewplane(¶ms, sizex, sizey, scene->r.xasp, scene->r.yasp);
BKE_camera_params_compute_matrix(¶ms);
- ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, params.winmat, draw_background, draw_sky, NULL, !params.is_ortho, ofs);
+ BKE_GPU_dof_from_camera(camera, &options);
+
+ ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, params.winmat, draw_background, draw_sky, NULL, !params.is_ortho, ofs, &options, 0);
}
else {
- ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, NULL, draw_background, draw_sky, NULL, true, ofs);
+ ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, NULL, draw_background, draw_sky, NULL, true, ofs, NULL, 0);
}
/* read in pixels & stamp */
@@ -3442,10 +3446,14 @@ static void view3d_main_area_draw_objects(const bContext *C, Scene *scene, View3
/* framebuffer fx needed, we need to draw offscreen first */
if (v3d->shader_fx) {
+ GPUFXOptions options = *v3d->fxoptions;
if (!rv3d->compositor)
rv3d->compositor = GPU_create_fx_compositor();
- do_compositing = GPU_initialize_fx_passes(rv3d->compositor, &ar->winrct, &ar->drawrct, v3d->shader_fx, v3d->fxoptions);
+ if (rv3d->persp == RV3D_CAMOB && v3d->camera)
+ BKE_GPU_dof_from_camera(v3d->camera, &options);
+
+ do_compositing = GPU_initialize_fx_passes(rv3d->compositor, &ar->winrct, &ar->drawrct, v3d->shader_fx, &options);
}
/* clear the background */
diff --git a/source/blender/gpu/intern/gpu_compositing.c b/source/blender/gpu/intern/gpu_compositing.c
index d441535..08ad144 100644
--- a/source/blender/gpu/intern/gpu_compositing.
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list