2016-10-13 04:22:28 +00: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.
|
|
|
|
|
*
|
|
|
|
|
* The Original Code is Copyright (C) 2005 Blender Foundation.
|
|
|
|
|
* All rights reserved.
|
|
|
|
|
*/
|
|
|
|
|
|
2019-02-18 08:08:12 +11:00
|
|
|
/** \file
|
|
|
|
|
* \ingroup gpu
|
2016-10-13 04:22:28 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
2016-10-21 20:50:00 +00:00
|
|
|
#include <stdbool.h>
|
|
|
|
|
|
2020-03-19 08:06:49 +01:00
|
|
|
#include "DNA_scene_types.h"
|
2020-03-19 09:33:03 +01:00
|
|
|
#include "DNA_vec_types.h"
|
2017-02-07 11:20:15 +01:00
|
|
|
|
|
|
|
|
#include "GPU_framebuffer.h"
|
|
|
|
|
#include "GPU_texture.h"
|
|
|
|
|
|
2020-03-02 15:28:47 +01:00
|
|
|
#ifdef __cplusplus
|
|
|
|
|
extern "C" {
|
|
|
|
|
#endif
|
|
|
|
|
|
2019-09-20 12:44:29 +02:00
|
|
|
#define GLA_PIXEL_OFS 0.375f
|
2017-05-04 15:46:09 +02:00
|
|
|
|
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
|
|
|
typedef struct GHash GHash;
|
2016-10-13 04:22:28 +00:00
|
|
|
typedef struct GPUViewport GPUViewport;
|
|
|
|
|
|
2022-01-24 21:16:06 +11:00
|
|
|
struct DRWData;
|
2021-10-05 09:36:11 +02:00
|
|
|
struct DefaultFramebufferList;
|
|
|
|
|
struct DefaultTextureList;
|
2022-01-24 21:16:06 +11:00
|
|
|
struct GPUFrameBuffer;
|
2017-04-12 19:49:19 +10:00
|
|
|
|
2017-02-07 11:20:15 +01:00
|
|
|
GPUViewport *GPU_viewport_create(void);
|
2020-03-19 08:06:49 +01:00
|
|
|
GPUViewport *GPU_viewport_stereo_create(void);
|
|
|
|
|
void GPU_viewport_bind(GPUViewport *viewport, int view, const rcti *rect);
|
2017-02-07 11:20:15 +01:00
|
|
|
void GPU_viewport_unbind(GPUViewport *viewport);
|
2021-12-09 20:01:47 +11:00
|
|
|
/**
|
|
|
|
|
* Merge and draw the buffers of \a viewport into the currently active framebuffer, performing
|
|
|
|
|
* color transform to display space.
|
|
|
|
|
*
|
|
|
|
|
* \param rect: Coordinates to draw into. By swapping min and max values, drawing can be done
|
|
|
|
|
* with inversed axis coordinates (upside down or sideways).
|
|
|
|
|
*/
|
2020-03-19 08:06:49 +01:00
|
|
|
void GPU_viewport_draw_to_screen(GPUViewport *viewport, int view, const rcti *rect);
|
2021-12-09 20:01:47 +11:00
|
|
|
/**
|
|
|
|
|
* Version of #GPU_viewport_draw_to_screen() that lets caller decide if display colorspace
|
|
|
|
|
* transform should be performed.
|
|
|
|
|
*/
|
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
|
|
|
void GPU_viewport_draw_to_screen_ex(GPUViewport *viewport,
|
2020-03-19 08:06:49 +01:00
|
|
|
int view,
|
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 rcti *rect,
|
2021-01-26 14:05:50 +01:00
|
|
|
bool display_colorspace,
|
|
|
|
|
bool do_overlay_merge);
|
2021-12-09 20:01:47 +11:00
|
|
|
/**
|
|
|
|
|
* Must be executed inside Draw-manager OpenGL Context.
|
|
|
|
|
*/
|
2016-10-13 04:22:28 +00:00
|
|
|
void GPU_viewport_free(GPUViewport *viewport);
|
|
|
|
|
|
2020-02-11 15:18:55 +01:00
|
|
|
void GPU_viewport_colorspace_set(GPUViewport *viewport,
|
|
|
|
|
ColorManagedViewSettings *view_settings,
|
2021-08-31 12:45:22 +02:00
|
|
|
const ColorManagedDisplaySettings *display_settings,
|
2020-02-11 15:18:55 +01:00
|
|
|
float dither);
|
|
|
|
|
|
2021-12-09 20:01:47 +11:00
|
|
|
/**
|
|
|
|
|
* Should be called from DRW after DRW_opengl_context_enable.
|
|
|
|
|
*/
|
2020-02-11 15:18:55 +01:00
|
|
|
void GPU_viewport_bind_from_offscreen(GPUViewport *viewport, struct GPUOffScreen *ofs);
|
2021-12-09 20:01:47 +11:00
|
|
|
/**
|
|
|
|
|
* Clear vars assigned from offscreen, so we don't free data owned by `GPUOffScreen`.
|
|
|
|
|
*/
|
2020-02-11 15:18:55 +01:00
|
|
|
void GPU_viewport_unbind_from_offscreen(GPUViewport *viewport,
|
|
|
|
|
struct GPUOffScreen *ofs,
|
2021-01-26 14:05:50 +01:00
|
|
|
bool display_colorspace,
|
|
|
|
|
bool do_overlay_merge);
|
2017-05-03 02:50:29 +10:00
|
|
|
|
2021-10-05 09:36:11 +02:00
|
|
|
struct DRWData **GPU_viewport_data_get(GPUViewport *viewport);
|
2017-11-06 16:47:23 +01:00
|
|
|
|
2021-12-09 20:01:47 +11:00
|
|
|
/**
|
|
|
|
|
* Merge the stereo textures. `color` and `overlay` texture will be modified.
|
|
|
|
|
*/
|
2020-03-19 08:06:49 +01:00
|
|
|
void GPU_viewport_stereo_composite(GPUViewport *viewport, Stereo3dFormat *stereo_format);
|
2018-03-17 04:47:26 +01:00
|
|
|
|
2017-09-25 20:07:02 +02:00
|
|
|
void GPU_viewport_tag_update(GPUViewport *viewport);
|
|
|
|
|
bool GPU_viewport_do_update(GPUViewport *viewport);
|
|
|
|
|
|
2021-10-05 09:36:11 +02:00
|
|
|
int GPU_viewport_active_view_get(GPUViewport *viewport);
|
|
|
|
|
bool GPU_viewport_is_stereo_get(GPUViewport *viewport);
|
2018-04-27 10:22:37 +02:00
|
|
|
|
2021-10-05 09:36:11 +02:00
|
|
|
GPUTexture *GPU_viewport_color_texture(GPUViewport *viewport, int view);
|
|
|
|
|
GPUTexture *GPU_viewport_overlay_texture(GPUViewport *viewport, int view);
|
|
|
|
|
GPUTexture *GPU_viewport_depth_texture(GPUViewport *viewport);
|
2017-02-07 11:20:15 +01:00
|
|
|
|
2021-12-09 20:01:47 +11:00
|
|
|
/**
|
|
|
|
|
* Overlay frame-buffer for drawing outside of DRW module.
|
|
|
|
|
*/
|
2021-10-05 09:36:11 +02:00
|
|
|
GPUFrameBuffer *GPU_viewport_framebuffer_overlay_get(GPUViewport *viewport);
|
2020-08-06 14:29:33 +02:00
|
|
|
|
2020-03-02 15:28:47 +01:00
|
|
|
#ifdef __cplusplus
|
|
|
|
|
}
|
|
|
|
|
#endif
|