2016-11-16 17:01:19 +01:00
|
|
|
/*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*
|
2019-01-23 11:29:18 +11:00
|
|
|
* Copyright 2016, Blender Foundation.
|
2016-11-16 17:01:19 +01:00
|
|
|
*/
|
|
|
|
|
2019-02-18 08:08:12 +11:00
|
|
|
/** \file
|
|
|
|
* \ingroup draw
|
2017-02-07 11:20:15 +01:00
|
|
|
*/
|
|
|
|
|
2020-08-07 09:50:34 +02:00
|
|
|
#pragma once
|
2017-02-07 11:20:15 +01:00
|
|
|
|
2020-05-08 18:16:39 +02:00
|
|
|
#include "BLI_sys_types.h" /* for bool */
|
|
|
|
|
|
|
|
#include "DNA_object_enums.h"
|
|
|
|
|
|
|
|
#include "DRW_engine_types.h"
|
|
|
|
|
2019-11-29 11:42:18 +01:00
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
2017-04-26 04:39:25 +10:00
|
|
|
struct ARegion;
|
2018-01-09 14:09:14 +01:00
|
|
|
struct DRWInstanceDataList;
|
2019-01-28 21:08:24 +11:00
|
|
|
struct Depsgraph;
|
2017-03-08 20:00:09 +01:00
|
|
|
struct DrawEngineType;
|
Materials: add custom object properties as uniform attributes.
This patch allows the user to type a property name into the
Attribute node, which will then output the value of the property
for each individual object, allowing to e.g. customize shaders
by object without duplicating the shader.
In order to make supporting this easier for Eevee, it is necessary
to explicitly choose whether the attribute is varying or uniform
via a dropdown option of the Attribute node. The dropdown also
allows choosing whether instancing should be taken into account.
The Cycles design treats all attributes as one common namespace,
so the Blender interface converts the enum to a name prefix that
can't be entered using keyboard.
In Eevee, the attributes are provided to the shader via a UBO indexed
with resource_id, similar to the existing Object Info data. Unlike it,
however, it is necessary to maintain a separate buffer for every
requested combination of attributes.
This is done using a hash table with the attribute set as the key,
as it is expected that technically different but similar materials
may use the same set of attributes. In addition, in order to minimize
wasted memory, a sparse UBO pool is implemented, so that chunks that
don't contain any data don't have to be allocated.
The back-end Cycles code is already refactored and committed by Brecht.
Differential Revision: https://developer.blender.org/D2057
2020-08-05 19:14:40 +03:00
|
|
|
struct GHash;
|
2018-03-05 00:54:31 +01:00
|
|
|
struct GPUMaterial;
|
2017-05-03 02:50:29 +10:00
|
|
|
struct GPUOffScreen;
|
2018-01-05 10:18:44 +01:00
|
|
|
struct GPUViewport;
|
2019-01-28 21:08:24 +11:00
|
|
|
struct ID;
|
|
|
|
struct Main;
|
|
|
|
struct Object;
|
2020-07-20 13:56:29 +02:00
|
|
|
struct Render;
|
2018-01-29 14:56:16 +01:00
|
|
|
struct RenderEngine;
|
2017-10-16 17:15:03 -02:00
|
|
|
struct RenderEngineType;
|
2019-01-28 21:08:24 +11:00
|
|
|
struct Scene;
|
|
|
|
struct View3D;
|
|
|
|
struct ViewLayer;
|
|
|
|
struct bContext;
|
|
|
|
struct rcti;
|
2017-04-26 04:39:25 +10:00
|
|
|
|
2017-03-08 20:00:09 +01:00
|
|
|
void DRW_engines_register(void);
|
2017-02-07 11:20:15 +01:00
|
|
|
void DRW_engines_free(void);
|
|
|
|
|
2018-01-29 14:56:16 +01:00
|
|
|
bool DRW_engine_render_support(struct DrawEngineType *draw_engine_type);
|
2017-03-08 20:00:09 +01:00
|
|
|
void DRW_engine_register(struct DrawEngineType *draw_engine_type);
|
2017-04-12 19:49:19 +10:00
|
|
|
void DRW_engine_viewport_data_size_get(
|
2019-04-17 06:17:24 +02:00
|
|
|
const void *engine_type, int *r_fbl_len, int *r_txl_len, int *r_psl_len, int *r_stl_len);
|
2017-03-08 20:00:09 +01:00
|
|
|
|
2017-11-28 16:42:58 +01:00
|
|
|
typedef struct DRWUpdateContext {
|
2019-04-17 06:17:24 +02:00
|
|
|
struct Main *bmain;
|
|
|
|
struct Depsgraph *depsgraph;
|
|
|
|
struct Scene *scene;
|
|
|
|
struct ViewLayer *view_layer;
|
2020-03-06 16:56:42 +01:00
|
|
|
struct ARegion *region;
|
2019-04-17 06:17:24 +02:00
|
|
|
struct View3D *v3d;
|
|
|
|
struct RenderEngineType *engine_type;
|
2017-11-28 16:42:58 +01:00
|
|
|
} DRWUpdateContext;
|
|
|
|
void DRW_notify_view_update(const DRWUpdateContext *update_ctx);
|
2017-09-25 20:07:02 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
typedef enum eDRWSelectStage {
|
|
|
|
DRW_SELECT_PASS_PRE = 1,
|
|
|
|
DRW_SELECT_PASS_POST,
|
|
|
|
} eDRWSelectStage;
|
|
|
|
typedef bool (*DRW_SelectPassFn)(eDRWSelectStage stage, void *user_data);
|
|
|
|
typedef bool (*DRW_ObjectFilterFn)(struct Object *ob, void *user_data);
|
2018-03-01 16:31:36 +11:00
|
|
|
|
2017-03-08 20:00:09 +01:00
|
|
|
void DRW_draw_view(const struct bContext *C);
|
2020-05-01 10:29:25 -07:00
|
|
|
void DRW_draw_region_engine_info(int xoffset, int *yoffset, int line_height);
|
2017-05-03 00:45:10 +10:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
void DRW_draw_render_loop_ex(struct Depsgraph *depsgraph,
|
|
|
|
struct RenderEngineType *engine_type,
|
2020-03-06 16:56:42 +01:00
|
|
|
struct ARegion *region,
|
2019-04-17 06:17:24 +02:00
|
|
|
struct View3D *v3d,
|
|
|
|
struct GPUViewport *viewport,
|
|
|
|
const struct bContext *evil_C);
|
|
|
|
void DRW_draw_render_loop(struct Depsgraph *depsgraph,
|
2020-03-06 16:56:42 +01:00
|
|
|
struct ARegion *region,
|
2019-04-17 06:17:24 +02:00
|
|
|
struct View3D *v3d,
|
|
|
|
struct GPUViewport *viewport);
|
|
|
|
void DRW_draw_render_loop_offscreen(struct Depsgraph *depsgraph,
|
|
|
|
struct RenderEngineType *engine_type,
|
2020-03-06 16:56:42 +01:00
|
|
|
struct ARegion *region,
|
2019-04-17 06:17:24 +02:00
|
|
|
struct View3D *v3d,
|
VR: Initial Virtual Reality support - Milestone 1, Scene Inspection
NOTE: While most of the milestone 1 goals are there, a few smaller features and
improvements are still to be done.
Big picture of this milestone: Initial, OpenXR-based virtual reality support
for users and foundation for advanced use cases.
Maniphest Task: https://developer.blender.org/T71347
The tasks contains more information about this milestone.
To be clear: This is not a feature rich VR implementation, it's focused on the
initial scene inspection use case. We intentionally focused on that, further
features like controller support are part of the next milestone.
- How to use?
Instructions on how to use this are here:
https://wiki.blender.org/wiki/User:Severin/GSoC-2019/How_to_Test
These will be updated and moved to a more official place (likely the manual) soon.
Currently Windows Mixed Reality and Oculus devices are usable. Valve/HTC
headsets don't support the OpenXR standard yet and hence, do not work with this
implementation.
---------------
This is the C-side implementation of the features added for initial VR
support as per milestone 1. A "VR Scene Inspection" Add-on will be
committed separately, to expose the VR functionality in the UI. It also
adds some further features for milestone 1, namely a landmarking system
(stored view locations in the VR space)
Main additions/features:
* Support for rendering viewports to an HMD, with good performance.
* Option to sync the VR view perspective with a fully interactive,
regular 3D View (VR-Mirror).
* Option to disable positional tracking. Keeps the current position (calculated
based on the VR eye center pose) when enabled while a VR session is running.
* Some regular viewport settings for the VR view
* RNA/Python-API to query and set VR session state information.
* WM-XR: Layer tying Ghost-XR to the Blender specific APIs/data
* wmSurface API: drawable, non-window container (manages Ghost-OpenGL and GPU
context)
* DNA/RNA for management of VR session settings
* `--debug-xr` and `--debug-xr-time` commandline options
* Utility batch & config file for using the Oculus runtime on Windows.
* Most VR data is runtime only. The exception is user settings which are saved
to files (`XrSessionSettings`).
* VR support can be disabled through the `WITH_XR_OPENXR` compiler flag.
For architecture and code documentation, see
https://wiki.blender.org/wiki/Source/Interface/XR.
---------------
A few thank you's:
* A huge shoutout to Ray Molenkamp for his help during the project - it would
have not been that successful without him!
* Sebastian Koenig and Simeon Conzendorf for testing and feedback!
* The reviewers, especially Brecht Van Lommel!
* Dalai Felinto for pushing and managing me to get this done ;)
* The OpenXR working group for providing an open standard. I think we're the
first bigger application to adopt OpenXR. Congratulations to them and
ourselves :)
This project started as a Google Summer of Code 2019 project - "Core Support of
Virtual Reality Headsets through OpenXR" (see
https://wiki.blender.org/wiki/User:Severin/GSoC-2019/).
Some further information, including ideas for further improvements can be found
in the final GSoC report:
https://wiki.blender.org/wiki/User:Severin/GSoC-2019/Final_Report
Differential Revisions: D6193, D7098
Reviewed by: Brecht Van Lommel, Jeroen Bakker
2020-03-17 20:20:55 +01:00
|
|
|
const bool is_image_render,
|
2019-04-17 06:17:24 +02:00
|
|
|
const bool draw_background,
|
|
|
|
const bool do_color_management,
|
|
|
|
struct GPUOffScreen *ofs,
|
|
|
|
struct GPUViewport *viewport);
|
2020-09-11 07:59:48 +02:00
|
|
|
void DRW_draw_render_loop_2d_ex(struct Depsgraph *depsgraph,
|
|
|
|
struct ARegion *region,
|
|
|
|
struct GPUViewport *viewport,
|
|
|
|
const struct bContext *evil_C);
|
2019-04-17 06:17:24 +02:00
|
|
|
void DRW_draw_select_loop(struct Depsgraph *depsgraph,
|
2020-03-06 16:56:42 +01:00
|
|
|
struct ARegion *region,
|
2019-04-17 06:17:24 +02:00
|
|
|
struct View3D *v3d,
|
|
|
|
bool use_obedit_skip,
|
|
|
|
bool draw_surface,
|
|
|
|
bool use_nearest,
|
|
|
|
const struct rcti *rect,
|
|
|
|
DRW_SelectPassFn select_pass_fn,
|
|
|
|
void *select_pass_user_data,
|
|
|
|
DRW_ObjectFilterFn object_filter_fn,
|
|
|
|
void *object_filter_user_data);
|
|
|
|
void DRW_draw_depth_loop(struct Depsgraph *depsgraph,
|
2020-03-06 16:56:42 +01:00
|
|
|
struct ARegion *region,
|
2019-04-17 06:17:24 +02:00
|
|
|
struct View3D *v3d,
|
2019-07-30 21:40:42 +10:00
|
|
|
struct GPUViewport *viewport,
|
|
|
|
bool use_opengl_context);
|
2019-04-17 06:17:24 +02:00
|
|
|
void DRW_draw_depth_loop_gpencil(struct Depsgraph *depsgraph,
|
2020-03-06 16:56:42 +01:00
|
|
|
struct ARegion *region,
|
2019-04-17 06:17:24 +02:00
|
|
|
struct View3D *v3d,
|
|
|
|
struct GPUViewport *viewport);
|
2020-04-27 11:37:20 +02:00
|
|
|
void DRW_draw_depth_object(struct Scene *scene,
|
|
|
|
struct ARegion *region,
|
2019-12-10 15:18:16 +01:00
|
|
|
struct View3D *v3d,
|
2019-04-19 11:49:17 -03:00
|
|
|
struct GPUViewport *viewport,
|
|
|
|
struct Object *object);
|
2019-07-30 06:46:59 -03:00
|
|
|
void DRW_draw_select_id(struct Depsgraph *depsgraph,
|
2020-03-06 16:56:42 +01:00
|
|
|
struct ARegion *region,
|
2019-07-30 06:46:59 -03:00
|
|
|
struct View3D *v3d,
|
2019-08-15 10:31:54 -03:00
|
|
|
const struct rcti *rect);
|
2019-03-15 16:02:55 -03:00
|
|
|
|
2018-07-31 10:22:19 +02:00
|
|
|
/* grease pencil render */
|
2018-11-09 16:30:44 +01:00
|
|
|
bool DRW_render_check_grease_pencil(struct Depsgraph *depsgraph);
|
2018-07-31 10:22:19 +02:00
|
|
|
void DRW_render_gpencil(struct RenderEngine *engine, struct Depsgraph *depsgraph);
|
|
|
|
|
2017-02-07 11:20:15 +01:00
|
|
|
/* This is here because GPUViewport needs it */
|
2018-01-09 14:09:14 +01:00
|
|
|
struct DRWInstanceDataList *DRW_instance_data_list_create(void);
|
|
|
|
void DRW_instance_data_list_free(struct DRWInstanceDataList *idatalist);
|
Materials: add custom object properties as uniform attributes.
This patch allows the user to type a property name into the
Attribute node, which will then output the value of the property
for each individual object, allowing to e.g. customize shaders
by object without duplicating the shader.
In order to make supporting this easier for Eevee, it is necessary
to explicitly choose whether the attribute is varying or uniform
via a dropdown option of the Attribute node. The dropdown also
allows choosing whether instancing should be taken into account.
The Cycles design treats all attributes as one common namespace,
so the Blender interface converts the enum to a name prefix that
can't be entered using keyboard.
In Eevee, the attributes are provided to the shader via a UBO indexed
with resource_id, similar to the existing Object Info data. Unlike it,
however, it is necessary to maintain a separate buffer for every
requested combination of attributes.
This is done using a hash table with the attribute set as the key,
as it is expected that technically different but similar materials
may use the same set of attributes. In addition, in order to minimize
wasted memory, a sparse UBO pool is implemented, so that chunks that
don't contain any data don't have to be allocated.
The back-end Cycles code is already refactored and committed by Brecht.
Differential Revision: https://developer.blender.org/D2057
2020-08-05 19:14:40 +03:00
|
|
|
void DRW_uniform_attrs_pool_free(struct GHash *table);
|
2017-02-07 11:20:15 +01:00
|
|
|
|
2020-07-20 13:56:29 +02:00
|
|
|
void DRW_render_context_enable(struct Render *render);
|
|
|
|
void DRW_render_context_disable(struct Render *render);
|
|
|
|
|
2018-02-26 19:41:17 +01:00
|
|
|
void DRW_opengl_context_create(void);
|
|
|
|
void DRW_opengl_context_destroy(void);
|
|
|
|
void DRW_opengl_context_enable(void);
|
|
|
|
void DRW_opengl_context_disable(void);
|
|
|
|
|
VR: Initial Virtual Reality support - Milestone 1, Scene Inspection
NOTE: While most of the milestone 1 goals are there, a few smaller features and
improvements are still to be done.
Big picture of this milestone: Initial, OpenXR-based virtual reality support
for users and foundation for advanced use cases.
Maniphest Task: https://developer.blender.org/T71347
The tasks contains more information about this milestone.
To be clear: This is not a feature rich VR implementation, it's focused on the
initial scene inspection use case. We intentionally focused on that, further
features like controller support are part of the next milestone.
- How to use?
Instructions on how to use this are here:
https://wiki.blender.org/wiki/User:Severin/GSoC-2019/How_to_Test
These will be updated and moved to a more official place (likely the manual) soon.
Currently Windows Mixed Reality and Oculus devices are usable. Valve/HTC
headsets don't support the OpenXR standard yet and hence, do not work with this
implementation.
---------------
This is the C-side implementation of the features added for initial VR
support as per milestone 1. A "VR Scene Inspection" Add-on will be
committed separately, to expose the VR functionality in the UI. It also
adds some further features for milestone 1, namely a landmarking system
(stored view locations in the VR space)
Main additions/features:
* Support for rendering viewports to an HMD, with good performance.
* Option to sync the VR view perspective with a fully interactive,
regular 3D View (VR-Mirror).
* Option to disable positional tracking. Keeps the current position (calculated
based on the VR eye center pose) when enabled while a VR session is running.
* Some regular viewport settings for the VR view
* RNA/Python-API to query and set VR session state information.
* WM-XR: Layer tying Ghost-XR to the Blender specific APIs/data
* wmSurface API: drawable, non-window container (manages Ghost-OpenGL and GPU
context)
* DNA/RNA for management of VR session settings
* `--debug-xr` and `--debug-xr-time` commandline options
* Utility batch & config file for using the Oculus runtime on Windows.
* Most VR data is runtime only. The exception is user settings which are saved
to files (`XrSessionSettings`).
* VR support can be disabled through the `WITH_XR_OPENXR` compiler flag.
For architecture and code documentation, see
https://wiki.blender.org/wiki/Source/Interface/XR.
---------------
A few thank you's:
* A huge shoutout to Ray Molenkamp for his help during the project - it would
have not been that successful without him!
* Sebastian Koenig and Simeon Conzendorf for testing and feedback!
* The reviewers, especially Brecht Van Lommel!
* Dalai Felinto for pushing and managing me to get this done ;)
* The OpenXR working group for providing an open standard. I think we're the
first bigger application to adopt OpenXR. Congratulations to them and
ourselves :)
This project started as a Google Summer of Code 2019 project - "Core Support of
Virtual Reality Headsets through OpenXR" (see
https://wiki.blender.org/wiki/User:Severin/GSoC-2019/).
Some further information, including ideas for further improvements can be found
in the final GSoC report:
https://wiki.blender.org/wiki/User:Severin/GSoC-2019/Final_Report
Differential Revisions: D6193, D7098
Reviewed by: Brecht Van Lommel, Jeroen Bakker
2020-03-17 20:20:55 +01:00
|
|
|
#ifdef WITH_XR_OPENXR
|
|
|
|
/* XXX see comment on DRW_xr_opengl_context_get() */
|
|
|
|
void *DRW_xr_opengl_context_get(void);
|
|
|
|
void *DRW_xr_gpu_context_get(void);
|
|
|
|
void DRW_xr_drawing_begin(void);
|
|
|
|
void DRW_xr_drawing_end(void);
|
|
|
|
#endif
|
|
|
|
|
2019-04-19 02:22:22 +02:00
|
|
|
/* For garbage collection */
|
|
|
|
void DRW_cache_free_old_batches(struct Main *bmain);
|
|
|
|
|
2018-07-19 15:48:13 +02:00
|
|
|
/* Never use this. Only for closing blender. */
|
|
|
|
void DRW_opengl_context_enable_ex(bool restore);
|
|
|
|
void DRW_opengl_context_disable_ex(bool restore);
|
|
|
|
|
2018-07-10 14:40:28 +02:00
|
|
|
void DRW_opengl_render_context_enable(void *re_gl_context);
|
|
|
|
void DRW_opengl_render_context_disable(void *re_gl_context);
|
2019-08-17 01:17:30 +10:00
|
|
|
void DRW_gpu_render_context_enable(void *re_gpu_context);
|
|
|
|
void DRW_gpu_render_context_disable(void *re_gpu_context);
|
2018-07-10 14:40:28 +02:00
|
|
|
|
2018-03-05 00:54:31 +01:00
|
|
|
void DRW_deferred_shader_remove(struct GPUMaterial *mat);
|
|
|
|
|
2018-07-10 14:14:55 +02:00
|
|
|
struct DrawDataList *DRW_drawdatalist_from_id(struct ID *id);
|
|
|
|
void DRW_drawdata_free(struct ID *id);
|
|
|
|
|
2019-11-29 11:42:18 +01:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|