Merge branch 'blender-v3.0-release'
This commit is contained in:
commit
a6d1a2d3fc
|
@ -106,24 +106,6 @@ including advanced features.
|
|||
floating-point values. These values are interpreted as a plane equation.
|
||||
|
||||
|
||||
.. function:: glColor (red, green, blue, alpha):
|
||||
|
||||
B{glColor3b, glColor3d, glColor3f, glColor3i, glColor3s, glColor3ub, glColor3ui, glColor3us,
|
||||
glColor4b, glColor4d, glColor4f, glColor4i, glColor4s, glColor4ub, glColor4ui, glColor4us,
|
||||
glColor3bv, glColor3dv, glColor3fv, glColor3iv, glColor3sv, glColor3ubv, glColor3uiv,
|
||||
glColor3usv, glColor4bv, glColor4dv, glColor4fv, glColor4iv, glColor4sv, glColor4ubv,
|
||||
glColor4uiv, glColor4usv}
|
||||
|
||||
Set a new color.
|
||||
|
||||
.. seealso:: `OpenGL Docs <https://khronos.org/registry/OpenGL-Refpages/gl4/html/glColor.xhtml>`__
|
||||
|
||||
:type red, green, blue, alpha: Depends on function prototype.
|
||||
:arg red, green, blue: Specify new red, green, and blue values for the current color.
|
||||
:arg alpha: Specifies a new alpha value for the current color. Included only in the
|
||||
four-argument glColor4 commands. (With '4' colors only)
|
||||
|
||||
|
||||
.. function:: glColorMask(red, green, blue, alpha):
|
||||
|
||||
Enable and disable writing of frame buffer color components
|
||||
|
|
|
@ -1367,6 +1367,61 @@ void DRW_notify_view_update(const DRWUpdateContext *update_ctx)
|
|||
BLI_ticket_mutex_unlock(DST.gl_context_mutex);
|
||||
}
|
||||
|
||||
/* update a viewport which belongs to a GPUOffscreen */
|
||||
void DRW_notify_view_update_offscreen(struct Depsgraph *depsgraph,
|
||||
RenderEngineType *engine_type,
|
||||
ARegion *region,
|
||||
View3D *v3d,
|
||||
GPUViewport *viewport)
|
||||
{
|
||||
|
||||
if (viewport && GPU_viewport_do_update(viewport)) {
|
||||
|
||||
Scene *scene = DEG_get_evaluated_scene(depsgraph);
|
||||
ViewLayer *view_layer = DEG_get_evaluated_view_layer(depsgraph);
|
||||
RegionView3D *rv3d = region->regiondata;
|
||||
|
||||
const bool gpencil_engine_needed = drw_gpencil_engine_needed(depsgraph, v3d);
|
||||
|
||||
/* Reset before using it. */
|
||||
drw_state_prepare_clean_for_draw(&DST);
|
||||
|
||||
DST.draw_ctx = (DRWContextState){
|
||||
.region = region,
|
||||
.rv3d = rv3d,
|
||||
.v3d = v3d,
|
||||
.scene = scene,
|
||||
.view_layer = view_layer,
|
||||
.obact = OBACT(view_layer),
|
||||
.engine_type = engine_type,
|
||||
.depsgraph = depsgraph,
|
||||
};
|
||||
|
||||
/* Custom lightweight initialize to avoid resetting the memory-pools. */
|
||||
DST.viewport = viewport;
|
||||
DST.vmempool = drw_viewport_data_ensure(DST.viewport);
|
||||
|
||||
/* Separate update for each stereo view. */
|
||||
int view_count = GPU_viewport_is_stereo_get(viewport) ? 2 : 1;
|
||||
for (int view = 0; view < view_count; view++) {
|
||||
DST.view_data_active = DST.vmempool->view_data[view];
|
||||
|
||||
drw_engines_enable(view_layer, engine_type, gpencil_engine_needed);
|
||||
drw_engines_data_validate();
|
||||
|
||||
DRW_ENABLED_ENGINE_ITER (DST.view_data_active, draw_engine, data) {
|
||||
if (draw_engine->view_update) {
|
||||
draw_engine->view_update(data);
|
||||
}
|
||||
}
|
||||
|
||||
drw_engines_disable();
|
||||
}
|
||||
|
||||
drw_manager_exit(&DST);
|
||||
}
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
|
@ -1742,11 +1797,14 @@ void DRW_draw_render_loop_offscreen(struct Depsgraph *depsgraph,
|
|||
GPUOffScreen *ofs,
|
||||
GPUViewport *viewport)
|
||||
{
|
||||
/* Create temporary viewport if needed. */
|
||||
/* Create temporary viewport if needed or update the existing viewport. */
|
||||
GPUViewport *render_viewport = viewport;
|
||||
if (viewport == NULL) {
|
||||
render_viewport = GPU_viewport_create();
|
||||
}
|
||||
else {
|
||||
DRW_notify_view_update_offscreen(depsgraph, engine_type, region, v3d, render_viewport);
|
||||
}
|
||||
|
||||
GPU_viewport_bind_from_offscreen(render_viewport, ofs);
|
||||
|
||||
|
|
|
@ -44,6 +44,7 @@
|
|||
#include "GPU_context.h"
|
||||
#include "GPU_framebuffer.h"
|
||||
#include "GPU_texture.h"
|
||||
#include "GPU_viewport.h"
|
||||
|
||||
#include "ED_view3d.h"
|
||||
#include "ED_view3d_offscreen.h"
|
||||
|
@ -355,6 +356,15 @@ static PyObject *pygpu_offscreen_draw_view3d(BPyGPUOffScreen *self, PyObject *ar
|
|||
|
||||
GPU_offscreen_bind(self->ofs, true);
|
||||
|
||||
/* Cache the GPUViewport so the framebuffers and associated textures are
|
||||
* not reallocated each time, see: T89204 */
|
||||
if (!self->viewport) {
|
||||
self->viewport = GPU_viewport_create();
|
||||
}
|
||||
else {
|
||||
GPU_viewport_tag_update(self->viewport);
|
||||
}
|
||||
|
||||
ED_view3d_draw_offscreen(depsgraph,
|
||||
scene,
|
||||
v3d->shading.type,
|
||||
|
@ -370,7 +380,7 @@ static PyObject *pygpu_offscreen_draw_view3d(BPyGPUOffScreen *self, PyObject *ar
|
|||
do_color_management,
|
||||
true,
|
||||
self->ofs,
|
||||
NULL);
|
||||
self->viewport);
|
||||
|
||||
GPU_offscreen_unbind(self->ofs, true);
|
||||
|
||||
|
@ -391,6 +401,11 @@ static PyObject *pygpu_offscreen_free(BPyGPUOffScreen *self)
|
|||
{
|
||||
BPY_GPU_OFFSCREEN_CHECK_OBJ(self);
|
||||
|
||||
if (self->viewport) {
|
||||
GPU_viewport_free(self->viewport);
|
||||
self->viewport = NULL;
|
||||
}
|
||||
|
||||
GPU_offscreen_free(self->ofs);
|
||||
self->ofs = NULL;
|
||||
Py_RETURN_NONE;
|
||||
|
@ -399,6 +414,9 @@ static PyObject *pygpu_offscreen_free(BPyGPUOffScreen *self)
|
|||
|
||||
static void BPyGPUOffScreen__tp_dealloc(BPyGPUOffScreen *self)
|
||||
{
|
||||
if (self->viewport) {
|
||||
GPU_viewport_free(self->viewport);
|
||||
}
|
||||
if (self->ofs) {
|
||||
GPU_offscreen_free(self->ofs);
|
||||
}
|
||||
|
@ -469,6 +487,7 @@ PyObject *BPyGPUOffScreen_CreatePyObject(GPUOffScreen *ofs)
|
|||
|
||||
self = PyObject_New(BPyGPUOffScreen, &BPyGPUOffScreen_Type);
|
||||
self->ofs = ofs;
|
||||
self->viewport = NULL;
|
||||
|
||||
return (PyObject *)self;
|
||||
}
|
||||
|
|
|
@ -26,9 +26,13 @@ extern PyTypeObject BPyGPUOffScreen_Type;
|
|||
|
||||
#define BPyGPUOffScreen_Check(v) (Py_TYPE(v) == &BPyGPUOffScreen_Type)
|
||||
|
||||
struct GPUOffscreen;
|
||||
struct GPUViewport;
|
||||
|
||||
typedef struct BPyGPUOffScreen {
|
||||
PyObject_HEAD
|
||||
struct GPUOffScreen *ofs;
|
||||
struct GPUViewport *viewport;
|
||||
} BPyGPUOffScreen;
|
||||
|
||||
PyObject *BPyGPUOffScreen_CreatePyObject(struct GPUOffScreen *ofs) ATTR_NONNULL(1);
|
||||
|
|
Loading…
Reference in New Issue