The lines index buffer can contain all edges (edit mode) or only loose edges (object mode). When switching between these modes the wrong content of the index buffer can be used. This patch will clear the lines index buffer when a `loose_edges` is requested. Making sure it is always up to date. Note that this is supporting an exising hack where the IBO is truncated during the creation. We should find a different way how to solve these kind of issues. Reviewed By: fclem Differential Revision: https://developer.blender.org/D6349
113 lines
3.8 KiB
C++
113 lines
3.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) 2016 by Mike Erwin.
|
|
* All rights reserved.
|
|
*/
|
|
|
|
/** \file
|
|
* \ingroup gpu
|
|
*
|
|
* GPU element list (AKA index buffer)
|
|
*/
|
|
|
|
#ifndef __GPU_ELEMENT_H__
|
|
#define __GPU_ELEMENT_H__
|
|
|
|
#include "GPU_primitive.h"
|
|
|
|
#define GPU_TRACK_INDEX_RANGE 1
|
|
|
|
typedef enum {
|
|
GPU_INDEX_U16,
|
|
GPU_INDEX_U32,
|
|
} GPUIndexBufType;
|
|
|
|
typedef struct GPUIndexBuf {
|
|
uint index_start;
|
|
uint index_len;
|
|
bool is_subrange;
|
|
#if GPU_TRACK_INDEX_RANGE
|
|
GPUIndexBufType index_type;
|
|
uint32_t gl_index_type;
|
|
uint base_index;
|
|
#endif
|
|
uint32_t ibo_id; /* 0 indicates not yet sent to VRAM */
|
|
union {
|
|
void *data; /* non-NULL indicates not yet sent to VRAM */
|
|
struct GPUIndexBuf *src; /* if is_subrange is true, this is the source buffer. */
|
|
};
|
|
} GPUIndexBuf;
|
|
|
|
void GPU_indexbuf_use(GPUIndexBuf *);
|
|
uint GPU_indexbuf_size_get(const GPUIndexBuf *);
|
|
|
|
typedef struct GPUIndexBufBuilder {
|
|
uint max_allowed_index;
|
|
uint max_index_len;
|
|
uint index_len;
|
|
GPUPrimType prim_type;
|
|
uint *data;
|
|
} GPUIndexBufBuilder;
|
|
|
|
/* supports all primitive types. */
|
|
void GPU_indexbuf_init_ex(GPUIndexBufBuilder *, GPUPrimType, uint index_len, uint vertex_len);
|
|
|
|
/* supports only GPU_PRIM_POINTS, GPU_PRIM_LINES and GPU_PRIM_TRIS. */
|
|
void GPU_indexbuf_init(GPUIndexBufBuilder *, GPUPrimType, uint prim_len, uint vertex_len);
|
|
|
|
void GPU_indexbuf_add_generic_vert(GPUIndexBufBuilder *, uint v);
|
|
void GPU_indexbuf_add_primitive_restart(GPUIndexBufBuilder *);
|
|
|
|
void GPU_indexbuf_add_point_vert(GPUIndexBufBuilder *, uint v);
|
|
void GPU_indexbuf_add_line_verts(GPUIndexBufBuilder *, uint v1, uint v2);
|
|
void GPU_indexbuf_add_tri_verts(GPUIndexBufBuilder *, uint v1, uint v2, uint v3);
|
|
void GPU_indexbuf_add_line_adj_verts(GPUIndexBufBuilder *, uint v1, uint v2, uint v3, uint v4);
|
|
|
|
void GPU_indexbuf_set_point_vert(GPUIndexBufBuilder *builder, uint elem, uint v1);
|
|
void GPU_indexbuf_set_line_verts(GPUIndexBufBuilder *builder, uint elem, uint v1, uint v2);
|
|
void GPU_indexbuf_set_tri_verts(GPUIndexBufBuilder *builder, uint elem, uint v1, uint v2, uint v3);
|
|
|
|
/* Skip primitive rendering at the given index. */
|
|
void GPU_indexbuf_set_point_restart(GPUIndexBufBuilder *builder, uint elem);
|
|
void GPU_indexbuf_set_line_restart(GPUIndexBufBuilder *builder, uint elem);
|
|
void GPU_indexbuf_set_tri_restart(GPUIndexBufBuilder *builder, uint elem);
|
|
|
|
GPUIndexBuf *GPU_indexbuf_build(GPUIndexBufBuilder *);
|
|
void GPU_indexbuf_build_in_place(GPUIndexBufBuilder *, GPUIndexBuf *);
|
|
|
|
/* Create a subrange of an existing indexbuffer. */
|
|
GPUIndexBuf *GPU_indexbuf_create_subrange(GPUIndexBuf *ibo, uint start, uint length);
|
|
void GPU_indexbuf_create_subrange_in_place(GPUIndexBuf *r_ibo,
|
|
GPUIndexBuf *ibo,
|
|
uint start,
|
|
uint length);
|
|
|
|
void GPU_indexbuf_discard(GPUIndexBuf *);
|
|
|
|
int GPU_indexbuf_primitive_len(GPUPrimType prim_type);
|
|
|
|
/* Macros */
|
|
|
|
#define GPU_INDEXBUF_DISCARD_SAFE(elem) \
|
|
do { \
|
|
if (elem != NULL) { \
|
|
GPU_indexbuf_discard(elem); \
|
|
elem = NULL; \
|
|
} \
|
|
} while (0)
|
|
|
|
#endif /* __GPU_ELEMENT_H__ */
|