155 lines
5.2 KiB
C
155 lines
5.2 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>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
struct BMesh;
|
|
struct CCGElem;
|
|
struct CCGKey;
|
|
struct DMFlagMat;
|
|
struct GSet;
|
|
struct MLoop;
|
|
struct MLoopCol;
|
|
struct MLoopTri;
|
|
struct MPoly;
|
|
struct MPropCol;
|
|
struct MVert;
|
|
struct Mesh;
|
|
struct PBVH;
|
|
struct SubdivCCG;
|
|
|
|
/**
|
|
* Buffers for drawing from PBVH grids.
|
|
*/
|
|
typedef struct GPU_PBVH_Buffers GPU_PBVH_Buffers;
|
|
|
|
/**
|
|
* Build must be called once before using the other functions,
|
|
* used every time mesh topology changes.
|
|
*
|
|
* Threaded: do not call any functions that use OpenGL calls!
|
|
*/
|
|
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,
|
|
int face_indices_len,
|
|
const struct Mesh *mesh);
|
|
|
|
/**
|
|
* Threaded: do not call any functions that use OpenGL calls!
|
|
*/
|
|
GPU_PBVH_Buffers *GPU_pbvh_grid_buffers_build(int totgrid, unsigned int **grid_hidden);
|
|
|
|
/**
|
|
* Threaded: do not call any functions that use OpenGL calls!
|
|
*/
|
|
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),
|
|
};
|
|
|
|
/**
|
|
* Threaded: do not call any functions that use OpenGL calls!
|
|
*/
|
|
void GPU_pbvh_mesh_buffers_update(GPU_PBVH_Buffers *buffers,
|
|
const struct MVert *mvert,
|
|
const float (*vert_normals)[3],
|
|
const float *vmask,
|
|
const struct MLoopCol *vcol,
|
|
const int *sculpt_face_sets,
|
|
int face_sets_color_seed,
|
|
int face_sets_color_default,
|
|
const struct MPropCol *vtcol,
|
|
int update_flags);
|
|
|
|
/**
|
|
* Creates a vertex buffer (coordinate, normal, color) and,
|
|
* if smooth shading, an element index buffer.
|
|
* Threaded: do not call any functions that use OpenGL calls!
|
|
*/
|
|
void GPU_pbvh_bmesh_buffers_update(GPU_PBVH_Buffers *buffers,
|
|
struct BMesh *bm,
|
|
struct GSet *bm_faces,
|
|
struct GSet *bm_unique_verts,
|
|
struct GSet *bm_other_verts,
|
|
int update_flags);
|
|
|
|
/**
|
|
* Threaded: do not call any functions that use OpenGL calls!
|
|
*/
|
|
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,
|
|
int face_sets_color_seed,
|
|
int face_sets_color_default,
|
|
const struct CCGKey *key,
|
|
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);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|