Blender  V2.93
Classes | Macros | Typedefs | Enumerations | Functions
draw_cache_impl_curve.c File Reference

Curve API for render engines. More...

#include "MEM_guardedalloc.h"
#include "BLI_listbase.h"
#include "BLI_math_vector.h"
#include "BLI_utildefines.h"
#include "DNA_curve_types.h"
#include "BKE_curve.h"
#include "BKE_displist.h"
#include "BKE_font.h"
#include "GPU_batch.h"
#include "GPU_capabilities.h"
#include "GPU_material.h"
#include "GPU_texture.h"
#include "UI_resources.h"
#include "DRW_render.h"
#include "draw_cache_inline.h"
#include "draw_cache_impl.h"

Go to the source code of this file.

Classes

struct  CurveRenderData
 
struct  CurveBatchCache
 

Macros

#define SELECT   1
 
#define ACTIVE_NURB   (1 << 2)
 
#define BEZIER_HANDLE   (1 << 3)
 
#define EVEN_U_BIT   (1 << 4) /* Alternate this bit for every U vert. */
 
#define COLOR_SHIFT   5
 

Typedefs

typedef struct CurveRenderData CurveRenderData
 
typedef struct CurveBatchCache CurveBatchCache
 

Enumerations

enum  { COLOR_NURB_ULINE_ID = TH_HANDLE_AUTOCLAMP - TH_HANDLE_FREE + 2 , TOT_HANDLE_COL }
 
enum  {
  CU_DATATYPE_WIRE = 1 << 0 , CU_DATATYPE_OVERLAY = 1 << 1 , CU_DATATYPE_NORMAL = 1 << 2 , CU_DATATYPE_SURFACE = 1 << 3 ,
  CU_DATATYPE_TEXT_SELECT = 1 << 4
}
 

Functions

static void curve_batch_cache_clear (Curve *cu)
 
static void curve_render_overlay_verts_edges_len_get (ListBase *lb, int *r_vert_len, int *r_edge_len)
 
static void curve_render_wire_verts_edges_len_get (const CurveCache *ob_curve_cache, int *r_curve_len, int *r_vert_len, int *r_edge_len)
 
static int curve_render_normal_len_get (const ListBase *lb, const CurveCache *ob_curve_cache)
 
static CurveRenderDatacurve_render_data_create (Curve *cu, CurveCache *ob_curve_cache, const int types)
 
static void curve_render_data_free (CurveRenderData *rdata)
 
static int curve_render_data_overlay_verts_len_get (const CurveRenderData *rdata)
 
static int curve_render_data_overlay_edges_len_get (const CurveRenderData *rdata)
 
static int curve_render_data_wire_verts_len_get (const CurveRenderData *rdata)
 
static int curve_render_data_wire_edges_len_get (const CurveRenderData *rdata)
 
static int curve_render_data_wire_curve_len_get (const CurveRenderData *rdata)
 
static int curve_render_data_normal_len_get (const CurveRenderData *rdata)
 
static void curve_cd_calc_used_gpu_layers (CustomDataMask *cd_layers, struct GPUMaterial **gpumat_array, int gpumat_array_len)
 
static bool curve_batch_cache_valid (Curve *cu)
 
static void curve_batch_cache_init (Curve *cu)
 
void DRW_curve_batch_cache_validate (Curve *cu)
 
static CurveBatchCachecurve_batch_cache_get (Curve *cu)
 
void DRW_curve_batch_cache_dirty_tag (Curve *cu, int mode)
 
void DRW_curve_batch_cache_free (Curve *cu)
 
Private Curve Cache API
static void curve_create_curves_pos (CurveRenderData *rdata, GPUVertBuf *vbo_curves_pos)
 
static void curve_create_curves_lines (CurveRenderData *rdata, GPUIndexBuf *ibo_curve_lines)
 
static void curve_create_edit_curves_nor (CurveRenderData *rdata, GPUVertBuf *vbo_curves_nor, const Scene *scene)
 
static uint8_t beztriple_vflag_get (CurveRenderData *rdata, uint8_t flag, uint8_t col_id, int v_idx, int nu_id, bool handle_point, const bool handle_selected)
 
static uint8_t bpoint_vflag_get (CurveRenderData *rdata, uint8_t flag, int v_idx, int nu_id, int u)
 
static void curve_create_edit_data_and_handles (CurveRenderData *rdata, GPUVertBuf *vbo_pos, GPUVertBuf *vbo_data, GPUIndexBuf *ibo_edit_verts_points, GPUIndexBuf *ibo_edit_lines)
 
Public Object/Curve API
GPUBatchDRW_curve_batch_cache_get_wire_edge (Curve *cu)
 
GPUBatchDRW_curve_batch_cache_get_normal_edge (Curve *cu)
 
GPUBatchDRW_curve_batch_cache_get_edit_edges (Curve *cu)
 
GPUBatchDRW_curve_batch_cache_get_edit_verts (Curve *cu)
 
GPUBatchDRW_curve_batch_cache_get_triangles_with_normals (struct Curve *cu)
 
GPUBatch ** DRW_curve_batch_cache_get_surface_shaded (struct Curve *cu, struct GPUMaterial **gpumat_array, uint gpumat_array_len)
 
GPUVertBufDRW_curve_batch_cache_pos_vertbuf_get (struct Curve *cu)
 
GPUBatchDRW_curve_batch_cache_get_wireframes_face (Curve *cu)
 
GPUBatchDRW_curve_batch_cache_get_edge_detection (Curve *cu, bool *r_is_manifold)
 
int DRW_curve_material_count_get (Curve *cu)
 
Grouped batch generation
void DRW_curve_batch_cache_create_requested (Object *ob, const struct Scene *scene)
 

Detailed Description

Curve API for render engines.

Definition in file draw_cache_impl_curve.c.

Macro Definition Documentation

◆ ACTIVE_NURB

#define ACTIVE_NURB   (1 << 2)

Definition at line 53 of file draw_cache_impl_curve.c.

◆ BEZIER_HANDLE

#define BEZIER_HANDLE   (1 << 3)

Definition at line 54 of file draw_cache_impl_curve.c.

◆ COLOR_SHIFT

#define COLOR_SHIFT   5

Definition at line 56 of file draw_cache_impl_curve.c.

◆ EVEN_U_BIT

#define EVEN_U_BIT   (1 << 4) /* Alternate this bit for every U vert. */

Definition at line 55 of file draw_cache_impl_curve.c.

◆ SELECT

#define SELECT   1

Definition at line 52 of file draw_cache_impl_curve.c.

Typedef Documentation

◆ CurveBatchCache

◆ CurveRenderData

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
COLOR_NURB_ULINE_ID 
TOT_HANDLE_COL 

Definition at line 59 of file draw_cache_impl_curve.c.

◆ anonymous enum

anonymous enum
Enumerator
CU_DATATYPE_WIRE 
CU_DATATYPE_OVERLAY 
CU_DATATYPE_NORMAL 
CU_DATATYPE_SURFACE 
CU_DATATYPE_TEXT_SELECT 

Definition at line 203 of file draw_cache_impl_curve.c.

Function Documentation

◆ beztriple_vflag_get()

static uint8_t beztriple_vflag_get ( CurveRenderData rdata,
uint8_t  flag,
uint8_t  col_id,
int  v_idx,
int  nu_id,
bool  handle_point,
const bool  handle_selected 
)
static

◆ bpoint_vflag_get()

static uint8_t bpoint_vflag_get ( CurveRenderData rdata,
uint8_t  flag,
int  v_idx,
int  nu_id,
int  u 
)
static

◆ curve_batch_cache_clear()

static void curve_batch_cache_clear ( Curve cu)
static

TODO

  • Ensure CurveCache, SEQUENCER_DAG_WORKAROUND.
  • Check number of verts/edges to see if cache is valid.
  • Check if 'overlay.edges' can use single attribute per edge, not 2 (for selection drawing).

Definition at line 509 of file draw_cache_impl_curve.c.

References CurveBatchCache::batch, batch, Curve::batch_cache, CurveBatchCache::cd_used, CurveBatchCache::edit, GPU_BATCH_DISCARD_SAFE, GPU_INDEXBUF_DISCARD_SAFE, GPU_VERTBUF_DISCARD_SAFE, GPUBatch, CurveBatchCache::ibo, CurveBatchCache::mat_len, MEM_SAFE_FREE, CurveBatchCache::ordered, CurveBatchCache::surf_per_mat, and CurveBatchCache::surf_per_mat_tris.

Referenced by DRW_curve_batch_cache_free(), and DRW_curve_batch_cache_validate().

◆ curve_batch_cache_get()

static CurveBatchCache* curve_batch_cache_get ( Curve cu)
static

◆ curve_batch_cache_init()

static void curve_batch_cache_init ( Curve cu)
static

◆ curve_batch_cache_valid()

static bool curve_batch_cache_valid ( Curve cu)
static

◆ curve_cd_calc_used_gpu_layers()

static void curve_cd_calc_used_gpu_layers ( CustomDataMask cd_layers,
struct GPUMaterial **  gpumat_array,
int  gpumat_array_len 
)
static

◆ curve_create_curves_lines()

static void curve_create_curves_lines ( CurveRenderData rdata,
GPUIndexBuf ibo_curve_lines 
)
static

◆ curve_create_curves_pos()

static void curve_create_curves_pos ( CurveRenderData rdata,
GPUVertBuf vbo_curves_pos 
)
static

◆ curve_create_edit_curves_nor()

static void curve_create_edit_curves_nor ( CurveRenderData rdata,
GPUVertBuf vbo_curves_nor,
const Scene scene 
)
static

◆ curve_create_edit_data_and_handles()

static void curve_create_edit_data_and_handles ( CurveRenderData rdata,
GPUVertBuf vbo_pos,
GPUVertBuf vbo_data,
GPUIndexBuf ibo_edit_verts_points,
GPUIndexBuf ibo_edit_lines 
)
static

◆ curve_render_data_create()

static CurveRenderData* curve_render_data_create ( Curve cu,
CurveCache ob_curve_cache,
const int  types 
)
static

◆ curve_render_data_free()

static void curve_render_data_free ( CurveRenderData rdata)
static

Definition at line 265 of file draw_cache_impl_curve.c.

References MEM_freeN.

Referenced by DRW_curve_batch_cache_create_requested().

◆ curve_render_data_normal_len_get()

static int curve_render_data_normal_len_get ( const CurveRenderData rdata)
static

◆ curve_render_data_overlay_edges_len_get()

static int curve_render_data_overlay_edges_len_get ( const CurveRenderData rdata)
static

◆ curve_render_data_overlay_verts_len_get()

static int curve_render_data_overlay_verts_len_get ( const CurveRenderData rdata)
static

◆ curve_render_data_wire_curve_len_get()

static int curve_render_data_wire_curve_len_get ( const CurveRenderData rdata)
static

◆ curve_render_data_wire_edges_len_get()

static int curve_render_data_wire_edges_len_get ( const CurveRenderData rdata)
static

◆ curve_render_data_wire_verts_len_get()

static int curve_render_data_wire_verts_len_get ( const CurveRenderData rdata)
static

◆ curve_render_normal_len_get()

static int curve_render_normal_len_get ( const ListBase lb,
const CurveCache ob_curve_cache 
)
static

◆ curve_render_overlay_verts_edges_len_get()

static void curve_render_overlay_verts_edges_len_get ( ListBase lb,
int *  r_vert_len,
int *  r_edge_len 
)
static

Definition at line 77 of file draw_cache_impl_curve.c.

References BLI_assert, and LISTBASE_FOREACH.

Referenced by curve_render_data_create().

◆ curve_render_wire_verts_edges_len_get()

static void curve_render_wire_verts_edges_len_get ( const CurveCache ob_curve_cache,
int *  r_curve_len,
int *  r_vert_len,
int *  r_edge_len 
)
static

◆ DRW_curve_batch_cache_create_requested()

void DRW_curve_batch_cache_create_requested ( Object ob,
const struct Scene scene 
)

Definition at line 967 of file draw_cache_impl_curve.c.

References CurveBatchCache::batch, BLI_assert, CD_MASK_MLOOPUV, CD_MASK_TANGENT, CurveBatchCache::cd_needed, CurveBatchCache::cd_used, CU_DATATYPE_NORMAL, CU_DATATYPE_OVERLAY, CU_DATATYPE_SURFACE, CU_DATATYPE_WIRE, curve_batch_cache_get(), Object_Runtime::curve_cache, curve_create_curves_lines(), curve_create_curves_pos(), curve_create_edit_curves_nor(), curve_create_edit_data_and_handles(), curve_render_data_create(), curve_render_data_free(), CurveBatchCache::curves, CurveBatchCache::curves_lines, CurveBatchCache::curves_nor, CurveBatchCache::curves_pos, CurveBatchCache::curves_weight, CurveBatchCache::data, Object::data, CurveCache::disp, DRW_ADD_FLAG_FROM_IBO_REQUEST, DRW_ADD_FLAG_FROM_VBO_REQUEST, DRW_batch_requested(), DRW_displist_indexbuf_create_edges_adjacency_lines(), DRW_displist_indexbuf_create_lines_in_order(), DRW_displist_indexbuf_create_triangles_in_order(), DRW_displist_indexbuf_create_triangles_loop_split_by_material(), DRW_displist_vertbuf_create_loop_pos_and_nor_and_uv_and_tan(), DRW_displist_vertbuf_create_pos_and_nor(), DRW_displist_vertbuf_create_wiredata(), DRW_ibo_request(), DRW_ibo_requested(), DRW_vbo_request(), DRW_vbo_requested(), CurveBatchCache::edge_detection, CurveBatchCache::edge_fac, CurveBatchCache::edges_adj_lines, CurveBatchCache::edit, CurveBatchCache::edit_edges, CurveBatchCache::edit_lines, CurveBatchCache::edit_normals, CurveBatchCache::edit_verts, ELEM, GPU_BATCH_CLEAR_SAFE, GPU_PRIM_LINE_STRIP, GPU_PRIM_LINES, GPU_PRIM_LINES_ADJ, GPU_PRIM_POINTS, GPU_PRIM_TRIS, GPUBatch, CurveBatchCache::ibo, Object::id, CurveBatchCache::is_manifold, CurveBatchCache::loop_pos_nor, CurveBatchCache::loop_tan, CurveBatchCache::loop_uv, CurveBatchCache::mat_len, ID::name, OB_CURVE, CurveRenderData::ob_curve_cache, OB_FONT, OB_SURF, CurveBatchCache::ordered, CurveBatchCache::pos, CurveBatchCache::pos_nor, Object::runtime, scene, CurveBatchCache::surf_per_mat, CurveBatchCache::surf_per_mat_tris, CurveBatchCache::surfaces, CurveBatchCache::surfaces_edges, CurveBatchCache::surfaces_lines, CurveBatchCache::surfaces_tris, and Object::type.

Referenced by drw_batch_cache_generate_requested().

◆ DRW_curve_batch_cache_dirty_tag()

void DRW_curve_batch_cache_dirty_tag ( Curve cu,
int  mode 
)

◆ DRW_curve_batch_cache_free()

void DRW_curve_batch_cache_free ( Curve cu)

◆ DRW_curve_batch_cache_get_edge_detection()

GPUBatch* DRW_curve_batch_cache_get_edge_detection ( Curve cu,
bool *  r_is_manifold 
)

◆ DRW_curve_batch_cache_get_edit_edges()

GPUBatch* DRW_curve_batch_cache_get_edit_edges ( Curve cu)

◆ DRW_curve_batch_cache_get_edit_verts()

GPUBatch* DRW_curve_batch_cache_get_edit_verts ( Curve cu)

◆ DRW_curve_batch_cache_get_normal_edge()

GPUBatch* DRW_curve_batch_cache_get_normal_edge ( Curve cu)

◆ DRW_curve_batch_cache_get_surface_shaded()

GPUBatch** DRW_curve_batch_cache_get_surface_shaded ( struct Curve cu,
struct GPUMaterial **  gpumat_array,
uint  gpumat_array_len 
)

◆ DRW_curve_batch_cache_get_triangles_with_normals()

GPUBatch* DRW_curve_batch_cache_get_triangles_with_normals ( struct Curve cu)

◆ DRW_curve_batch_cache_get_wire_edge()

GPUBatch* DRW_curve_batch_cache_get_wire_edge ( Curve cu)

◆ DRW_curve_batch_cache_get_wireframes_face()

GPUBatch* DRW_curve_batch_cache_get_wireframes_face ( Curve cu)

◆ DRW_curve_batch_cache_pos_vertbuf_get()

GPUVertBuf* DRW_curve_batch_cache_pos_vertbuf_get ( struct Curve cu)

◆ DRW_curve_batch_cache_validate()

void DRW_curve_batch_cache_validate ( Curve cu)

◆ DRW_curve_material_count_get()

int DRW_curve_material_count_get ( Curve cu)