* PBVH drawing for eevee is now used for PBVH_FACES as well as PBVH_BMESH. * PBVH_FACES now uses pbvh draw for eevee rendering * Refactored gpu_pbvh_gpu_make_vcol_offs into a more general gpu_pbvh_gpu_make_attr_offs. This should be a usable alternative to using a generic attribute gpu system (whether the one that's #ifdef'd out in gpu_buffers.c, or the new one that hit master recently). * Textured workbench draw mode now works for pbvh drawing. * Fixed nasty stack overflow in dyntopo edge collapse.
161 lines
5.8 KiB
C++
161 lines
5.8 KiB
C++
/*
|
|
* 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.
|
|
*/
|
|
|
|
/** \file
|
|
* \ingroup gpu
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <stddef.h>
|
|
|
|
#include "BKE_attribute.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
struct BMesh;
|
|
struct CCGElem;
|
|
struct CCGKey;
|
|
struct DMFlagMat;
|
|
struct GSet;
|
|
struct TableGSet;
|
|
struct MLoop;
|
|
struct MLoopCol;
|
|
struct MLoopTri;
|
|
struct MPoly;
|
|
struct MPropCol;
|
|
struct MVert;
|
|
struct Mesh;
|
|
struct PBVH;
|
|
struct SubdivCCG;
|
|
struct CustomData;
|
|
|
|
/* Buffers for drawing from PBVH grids. */
|
|
typedef struct GPU_PBVH_Buffers GPU_PBVH_Buffers;
|
|
|
|
typedef struct PBVHGPUBuildArgs {
|
|
GPU_PBVH_Buffers *buffers;
|
|
struct BMesh *bm;
|
|
|
|
struct TableGSet *bm_faces;
|
|
struct TableGSet *bm_unique_verts;
|
|
struct TableGSet *bm_other_verts;
|
|
|
|
struct PBVHTriBuf *tribuf;
|
|
|
|
const int update_flags;
|
|
const int cd_vert_node_offset;
|
|
int face_sets_color_seed;
|
|
int face_sets_color_default;
|
|
bool flat_vcol;
|
|
short mat_nr, active_vcol_type, active_vcol_domain;
|
|
struct CustomDataLayer *active_vcol_layer;
|
|
struct CustomDataLayer *render_vcol_layer;
|
|
} PBVHGPUBuildArgs;
|
|
|
|
/* Build must be called once before using the other functions, used every time
|
|
* mesh topology changes. Threaded. */
|
|
GPU_PBVH_Buffers *GPU_pbvh_mesh_buffers_build(const struct MPoly *mpoly,
|
|
const struct MLoop *mloop,
|
|
const struct MLoopTri *looptri,
|
|
const struct MVert *mvert,
|
|
const int *face_indices,
|
|
const int *sculpt_face_sets,
|
|
const int face_indices_len,
|
|
const struct Mesh *mesh);
|
|
|
|
GPU_PBVH_Buffers *GPU_pbvh_grid_buffers_build(int totgrid, unsigned int **grid_hidden);
|
|
|
|
GPU_PBVH_Buffers *GPU_pbvh_bmesh_buffers_build(bool smooth_shading);
|
|
|
|
/* Free part of data for update. Not thread safe, must run in OpenGL main thread. */
|
|
void GPU_pbvh_bmesh_buffers_update_free(GPU_PBVH_Buffers *buffers);
|
|
void GPU_pbvh_grid_buffers_update_free(GPU_PBVH_Buffers *buffers,
|
|
const struct DMFlagMat *grid_flag_mats,
|
|
const int *grid_indices);
|
|
|
|
/* Update mesh buffers without topology changes. Threaded. */
|
|
enum {
|
|
GPU_PBVH_BUFFERS_SHOW_MASK = (1 << 1),
|
|
GPU_PBVH_BUFFERS_SHOW_VCOL = (1 << 2),
|
|
GPU_PBVH_BUFFERS_SHOW_SCULPT_FACE_SETS = (1 << 3),
|
|
};
|
|
|
|
void GPU_pbvh_mesh_buffers_update(GPU_PBVH_Buffers *buffers,
|
|
const struct MVert *mvert,
|
|
const CustomData *vdata,
|
|
const CustomData *ldata,
|
|
const float *vmask,
|
|
const CustomDataLayer *active_vcol_layer,
|
|
const CustomDataLayer *render_vcol_layer,
|
|
const AttributeDomain active_vcol_domain,
|
|
const int *sculpt_face_sets,
|
|
const int face_sets_color_seed,
|
|
const int face_sets_color_default,
|
|
const int update_flags);
|
|
|
|
bool GPU_pbvh_update_attribute_names(
|
|
CustomData *vdata,
|
|
CustomData *ldata,
|
|
bool need_full_render,
|
|
bool fast_mode, // fast mode renders without vcol, uv, facesets, even mask, etc
|
|
int active_vcol_type,
|
|
int active_vcol_domain,
|
|
struct CustomDataLayer *active_vcol_layer,
|
|
struct CustomDataLayer *render_vcol_layer);
|
|
|
|
void GPU_pbvh_bmesh_buffers_update(PBVHGPUBuildArgs *args);
|
|
|
|
void GPU_pbvh_grid_buffers_update(GPU_PBVH_Buffers *buffers,
|
|
struct SubdivCCG *subdiv_ccg,
|
|
struct CCGElem **grids,
|
|
const struct DMFlagMat *grid_flag_mats,
|
|
int *grid_indices,
|
|
int totgrid,
|
|
const int *sculpt_face_sets,
|
|
const int face_sets_color_seed,
|
|
const int face_sets_color_default,
|
|
const struct CCGKey *key,
|
|
const int update_flags);
|
|
|
|
/* Finish update. Not thread safe, must run in OpenGL main thread. */
|
|
void GPU_pbvh_buffers_update_flush(GPU_PBVH_Buffers *buffers);
|
|
|
|
/* Free buffers. Not thread safe, must run in OpenGL main thread. */
|
|
void GPU_pbvh_buffers_free(GPU_PBVH_Buffers *buffers);
|
|
|
|
/* draw */
|
|
struct GPUBatch *GPU_pbvh_buffers_batch_get(GPU_PBVH_Buffers *buffers, bool fast, bool wires);
|
|
|
|
short GPU_pbvh_buffers_material_index_get(GPU_PBVH_Buffers *buffers);
|
|
bool GPU_pbvh_buffers_has_overlays(GPU_PBVH_Buffers *buffers);
|
|
float *GPU_pbvh_get_extra_matrix(GPU_PBVH_Buffers *buffers);
|
|
|
|
/** if need_full_render is false, only the active (not render!) vcol layer will
|
|
be uploaded to GPU*/
|
|
|
|
void GPU_pbvh_need_full_render_set(bool state);
|
|
bool GPU_pbvh_need_full_render_get(void);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|