[Bf-blender-cvs] [f8eb85d9108] tmp-workbench-rewrite2: Split render output writing into their own functions
Miguel Pozo
noreply at git.blender.org
Tue Jan 10 15:55:20 CET 2023
Commit: f8eb85d91085f2ac2bf115916487843ca3d18f78
Author: Miguel Pozo
Date: Mon Jan 9 17:32:29 2023 +0100
Branches: tmp-workbench-rewrite2
https://developer.blender.org/rBf8eb85d91085f2ac2bf115916487843ca3d18f78
Split render output writing into their own functions
===================================================================
M source/blender/draw/engines/workbench/workbench_engine.cc
===================================================================
diff --git a/source/blender/draw/engines/workbench/workbench_engine.cc b/source/blender/draw/engines/workbench/workbench_engine.cc
index c4115d996b4..ce0e0f9347d 100644
--- a/source/blender/draw/engines/workbench/workbench_engine.cc
+++ b/source/blender/draw/engines/workbench/workbench_engine.cc
@@ -521,6 +521,75 @@ static bool workbench_render_framebuffers_init(void)
# define GPU_FINISH_DELIMITER()
#endif
+static void write_render_color_output(struct RenderLayer *layer,
+ const char *viewname,
+ GPUFrameBuffer *fb,
+ const struct rcti *rect)
+{
+ RenderPass *rp = RE_pass_find_by_name(layer, RE_PASSNAME_COMBINED, viewname);
+ if (rp) {
+ GPU_framebuffer_bind(fb);
+ GPU_framebuffer_read_color(fb,
+ rect->xmin,
+ rect->ymin,
+ BLI_rcti_size_x(rect),
+ BLI_rcti_size_y(rect),
+ 4,
+ 0,
+ GPU_DATA_FLOAT,
+ rp->rect);
+ }
+}
+
+static void write_render_z_output(struct RenderLayer *layer,
+ const char *viewname,
+ GPUFrameBuffer *fb,
+ const struct rcti *rect,
+ float4x4 winmat)
+{
+ RenderPass *rp = RE_pass_find_by_name(layer, RE_PASSNAME_Z, viewname);
+ if (rp) {
+ GPU_framebuffer_bind(fb);
+ GPU_framebuffer_read_depth(fb,
+ rect->xmin,
+ rect->ymin,
+ BLI_rcti_size_x(rect),
+ BLI_rcti_size_y(rect),
+ GPU_DATA_FLOAT,
+ rp->rect);
+
+ int pix_num = BLI_rcti_size_x(rect) * BLI_rcti_size_y(rect);
+
+ /* Convert ogl depth [0..1] to view Z [near..far] */
+ if (DRW_view_is_persp_get(nullptr)) {
+ for (float &z : MutableSpan(rp->rect, pix_num)) {
+ if (z == 1.0f) {
+ z = 1e10f; /* Background */
+ }
+ else {
+ z = z * 2.0f - 1.0f;
+ z = winmat[3][2] / (z + winmat[2][2]);
+ }
+ }
+ }
+ else {
+ /* Keep in mind, near and far distance are negatives. */
+ float near = DRW_view_near_distance_get(nullptr);
+ float far = DRW_view_far_distance_get(nullptr);
+ float range = fabsf(far - near);
+
+ for (float &z : MutableSpan(rp->rect, pix_num)) {
+ if (z == 1.0f) {
+ z = 1e10f; /* Background */
+ }
+ else {
+ z = z * range - near;
+ }
+ }
+ }
+ }
+}
+
static void workbench_render_to_image(void *vedata,
struct RenderEngine *engine,
struct RenderLayer *layer,
@@ -597,66 +666,8 @@ static void workbench_render_to_image(void *vedata,
} while (ved->instance->scene_state.sample + 1 < ved->instance->scene_state.samples_len);
const char *viewname = RE_GetActiveRenderView(engine->re);
- /* Write render output. */
- {
- RenderPass *rp = RE_pass_find_by_name(layer, RE_PASSNAME_COMBINED, viewname);
- if (rp) {
- GPU_framebuffer_bind(dfbl->default_fb);
- GPU_framebuffer_read_color(dfbl->default_fb,
- rect->xmin,
- rect->ymin,
- BLI_rcti_size_x(rect),
- BLI_rcti_size_y(rect),
- 4,
- 0,
- GPU_DATA_FLOAT,
- rp->rect);
- }
- }
- /* Write render Z output */
- {
- RenderPass *rp = RE_pass_find_by_name(layer, RE_PASSNAME_Z, viewname);
- if (rp) {
- GPU_framebuffer_bind(dfbl->default_fb);
- GPU_framebuffer_read_depth(dfbl->default_fb,
- rect->xmin,
- rect->ymin,
- BLI_rcti_size_x(rect),
- BLI_rcti_size_y(rect),
- GPU_DATA_FLOAT,
- rp->rect);
-
- int pix_num = BLI_rcti_size_x(rect) * BLI_rcti_size_y(rect);
-
- /* Convert ogl depth [0..1] to view Z [near..far] */
- if (DRW_view_is_persp_get(nullptr)) {
- for (float &z : MutableSpan(rp->rect, pix_num)) {
- if (z == 1.0f) {
- z = 1e10f; /* Background */
- }
- else {
- z = z * 2.0f - 1.0f;
- z = winmat[3][2] / (z + winmat[2][2]);
- }
- }
- }
- else {
- /* Keep in mind, near and far distance are negatives. */
- float near = DRW_view_near_distance_get(nullptr);
- float far = DRW_view_far_distance_get(nullptr);
- float range = fabsf(far - near);
-
- for (float &z : MutableSpan(rp->rect, pix_num)) {
- if (z == 1.0f) {
- z = 1e10f; /* Background */
- }
- else {
- z = z * range - near;
- }
- }
- }
- }
- }
+ write_render_color_output(layer, viewname, dfbl->default_fb, rect);
+ write_render_z_output(layer, viewname, dfbl->default_fb, rect, winmat);
}
static void workbench_render_update_passes(RenderEngine *engine,
More information about the Bf-blender-cvs
mailing list