Blender  V2.93
Classes | Macros | Typedefs | Enumerations | Functions
MOD_lineart.h File Reference
#include "BLI_listbase.h"
#include "BLI_math.h"
#include "BLI_threads.h"
#include <math.h>

Go to the source code of this file.

Classes

struct  LineartStaticMemPoolNode
 
struct  LineartStaticMemPool
 
struct  LineartTriangleAdjacent
 
struct  LineartTriangle
 
struct  LineartTriangleThread
 
struct  LineartElementLinkNode
 
struct  LineartLineSegment
 
struct  LineartVert
 
struct  LineartVertIntersection
 
struct  LineartEdge
 
struct  LineartLineChain
 
struct  LineartLineChainItem
 
struct  LineartChainRegisterEntry
 
struct  LineartRenderBuffer
 
struct  LineartRenderTaskInfo
 
struct  LineartBoundingArea
 

Macros

#define DBL_TRIANGLE_LIM   1e-8
 
#define DBL_EDGE_LIM   1e-9
 
#define LRT_MEMORY_POOL_64MB   (1 << 26)
 
#define LRT_THREAD_EDGE_COUNT   1000
 
#define LRT_TILE(tile, r, c, CCount)   tile[r * CCount + c]
 
#define LRT_CLAMP(a, Min, Max)   a = a < Min ? Min : (a > Max ? Max : a)
 
#define LRT_MAX3_INDEX(a, b, c)   (a > b ? (a > c ? 0 : (b > c ? 1 : 2)) : (b > c ? 1 : 2))
 
#define LRT_MIN3_INDEX(a, b, c)   (a < b ? (a < c ? 0 : (b < c ? 1 : 2)) : (b < c ? 1 : 2))
 
#define LRT_MAX3_INDEX_ABC(x, y, z)   (x > y ? (x > z ? a : (y > z ? b : c)) : (y > z ? b : c))
 
#define LRT_MIN3_INDEX_ABC(x, y, z)   (x < y ? (x < z ? a : (y < z ? b : c)) : (y < z ? b : c))
 
#define LRT_ABC(index)   (index == 0 ? a : (index == 1 ? b : c))
 
#define LRT_DOUBLE_CLOSE_ENOUGH(a, b)   (((a) + DBL_EDGE_LIM) >= (b) && ((a)-DBL_EDGE_LIM) <= (b))
 

Typedefs

typedef struct LineartStaticMemPoolNode LineartStaticMemPoolNode
 
typedef struct LineartStaticMemPool LineartStaticMemPool
 
typedef struct LineartTriangleAdjacent LineartTriangleAdjacent
 
typedef struct LineartTriangle LineartTriangle
 
typedef struct LineartTriangleThread LineartTriangleThread
 
typedef enum eLineArtElementNodeFlag eLineArtElementNodeFlag
 
typedef struct LineartElementLinkNode LineartElementLinkNode
 
typedef struct LineartLineSegment LineartLineSegment
 
typedef struct LineartVert LineartVert
 
typedef struct LineartVertIntersection LineartVertIntersection
 
typedef enum eLineArtVertFlags eLineArtVertFlags
 
typedef struct LineartEdge LineartEdge
 
typedef struct LineartLineChain LineartLineChain
 
typedef struct LineartLineChainItem LineartLineChainItem
 
typedef struct LineartChainRegisterEntry LineartChainRegisterEntry
 
typedef struct LineartRenderBuffer LineartRenderBuffer
 
typedef enum eLineartTriangleFlags eLineartTriangleFlags
 
typedef struct LineartRenderTaskInfo LineartRenderTaskInfo
 
typedef struct LineartBoundingArea LineartBoundingArea
 

Enumerations

enum  eLineArtElementNodeFlag { LRT_ELEMENT_IS_ADDITIONAL = (1 << 0) , LRT_ELEMENT_BORDER_ONLY = (1 << 1) , LRT_ELEMENT_NO_INTERSECTION = (1 << 2) }
 
enum  eLineArtVertFlags { LRT_VERT_HAS_INTERSECTION_DATA = (1 << 0) , LRT_VERT_EDGE_USED = (1 << 1) }
 
enum  eLineartTriangleFlags {
  LRT_CULL_DONT_CARE = 0 , LRT_CULL_USED = (1 << 0) , LRT_CULL_DISCARD = (1 << 1) , LRT_CULL_GENERATED = (1 << 2) ,
  LRT_TRIANGLE_INTERSECTION_ONLY = (1 << 3) , LRT_TRIANGLE_NO_INTERSECTION = (1 << 4)
}
 

Functions

BLI_INLINE int lineart_LineIntersectTest2d (const double *a1, const double *a2, const double *b1, const double *b2, double *aRatio)
 
void MOD_lineart_destroy_render_data (struct LineartGpencilModifierData *lmd)
 
void MOD_lineart_chain_feature_lines (LineartRenderBuffer *rb)
 
void MOD_lineart_chain_split_for_fixed_occlusion (LineartRenderBuffer *rb)
 
void MOD_lineart_chain_connect (LineartRenderBuffer *rb)
 
void MOD_lineart_chain_discard_short (LineartRenderBuffer *rb, const float threshold)
 
void MOD_lineart_chain_split_angle (LineartRenderBuffer *rb, float angle_threshold_rad)
 
int MOD_lineart_chain_count (const LineartLineChain *rlc)
 
void MOD_lineart_chain_clear_picked_flag (struct LineartRenderBuffer *rb)
 
bool MOD_lineart_compute_feature_lines (struct Depsgraph *depsgraph, struct LineartGpencilModifierData *lmd)
 
LineartBoundingAreaMOD_lineart_get_parent_bounding_area (LineartRenderBuffer *rb, double x, double y)
 
LineartBoundingAreaMOD_lineart_get_bounding_area (LineartRenderBuffer *rb, double x, double y)
 
void MOD_lineart_gpencil_generate (LineartRenderBuffer *rb, struct Depsgraph *depsgraph, struct Object *ob, struct bGPDlayer *gpl, struct bGPDframe *gpf, char source_type, void *source_reference, int level_start, int level_end, int mat_nr, short edge_types, unsigned char transparency_flags, unsigned char transparency_mask, short thickness, float opacity, const char *source_vgname, const char *vgname, int modifier_flags)
 
float MOD_lineart_chain_compute_length (LineartLineChain *rlc)
 
void ED_operatortypes_lineart (void)
 

Macro Definition Documentation

◆ DBL_EDGE_LIM

#define DBL_EDGE_LIM   1e-9

Definition at line 312 of file MOD_lineart.h.

◆ DBL_TRIANGLE_LIM

#define DBL_TRIANGLE_LIM   1e-8

Definition at line 311 of file MOD_lineart.h.

◆ LRT_ABC

#define LRT_ABC (   index)    (index == 0 ? a : (index == 1 ? b : c))

Definition at line 409 of file MOD_lineart.h.

◆ LRT_CLAMP

#define LRT_CLAMP (   a,
  Min,
  Max 
)    a = a < Min ? Min : (a > Max ? Max : a)

Definition at line 399 of file MOD_lineart.h.

◆ LRT_DOUBLE_CLOSE_ENOUGH

#define LRT_DOUBLE_CLOSE_ENOUGH (   a,
 
)    (((a) + DBL_EDGE_LIM) >= (b) && ((a)-DBL_EDGE_LIM) <= (b))

Definition at line 411 of file MOD_lineart.h.

◆ LRT_MAX3_INDEX

#define LRT_MAX3_INDEX (   a,
  b,
 
)    (a > b ? (a > c ? 0 : (b > c ? 1 : 2)) : (b > c ? 1 : 2))

Definition at line 401 of file MOD_lineart.h.

◆ LRT_MAX3_INDEX_ABC

#define LRT_MAX3_INDEX_ABC (   x,
  y,
  z 
)    (x > y ? (x > z ? a : (y > z ? b : c)) : (y > z ? b : c))

Definition at line 405 of file MOD_lineart.h.

◆ LRT_MEMORY_POOL_64MB

#define LRT_MEMORY_POOL_64MB   (1 << 26)

Definition at line 314 of file MOD_lineart.h.

◆ LRT_MIN3_INDEX

#define LRT_MIN3_INDEX (   a,
  b,
 
)    (a < b ? (a < c ? 0 : (b < c ? 1 : 2)) : (b < c ? 1 : 2))

Definition at line 403 of file MOD_lineart.h.

◆ LRT_MIN3_INDEX_ABC

#define LRT_MIN3_INDEX_ABC (   x,
  y,
  z 
)    (x < y ? (x < z ? a : (y < z ? b : c)) : (y < z ? b : c))

Definition at line 407 of file MOD_lineart.h.

◆ LRT_THREAD_EDGE_COUNT

#define LRT_THREAD_EDGE_COUNT   1000

Controls how many edges a worker thread is processing at one request. There's no significant performance impact on choosing different values. Don't make it too small so that the worker thread won't request too many times.

Definition at line 328 of file MOD_lineart.h.

◆ LRT_TILE

#define LRT_TILE (   tile,
  r,
  c,
  CCount 
)    tile[r * CCount + c]

Definition at line 397 of file MOD_lineart.h.

Typedef Documentation

◆ eLineArtElementNodeFlag

◆ eLineartTriangleFlags

◆ eLineArtVertFlags

◆ LineartBoundingArea

Bounding area diagram:

+----+ <----U (Upper edge Y value)
| |
+----+ <----B (Bottom edge Y value)
^ ^
L R (Left/Right edge X value)
#define X
Definition: GeomUtils.cpp:213
#define Y
Definition: GeomUtils.cpp:214
#define U
#define B
#define R
#define L
char Upper(char ch)
Definition: utility_io.cpp:142

Example structure when subdividing 1 bounding areas: 1 area can be divided into 4 smaller children to accommodate image areas with denser triangle distribution.

+--+--+-----+
+--+--+ |
+--+--+-----+
| | |
+-----+-----+

lp/rp/up/bp is the list for storing pointers to adjacent bounding areas.

◆ LineartChainRegisterEntry

◆ LineartEdge

typedef struct LineartEdge LineartEdge

◆ LineartElementLinkNode

◆ LineartLineChain

◆ LineartLineChainItem

◆ LineartLineSegment

◆ LineartRenderBuffer

◆ LineartRenderTaskInfo

◆ LineartStaticMemPool

◆ LineartStaticMemPoolNode

◆ LineartTriangle

◆ LineartTriangleAdjacent

◆ LineartTriangleThread

◆ LineartVert

typedef struct LineartVert LineartVert

◆ LineartVertIntersection

Enumeration Type Documentation

◆ eLineArtElementNodeFlag

Enumerator
LRT_ELEMENT_IS_ADDITIONAL 
LRT_ELEMENT_BORDER_ONLY 
LRT_ELEMENT_NO_INTERSECTION 

Definition at line 79 of file MOD_lineart.h.

◆ eLineartTriangleFlags

Enumerator
LRT_CULL_DONT_CARE 
LRT_CULL_USED 
LRT_CULL_DISCARD 
LRT_CULL_GENERATED 
LRT_TRIANGLE_INTERSECTION_ONLY 
LRT_TRIANGLE_NO_INTERSECTION 

Definition at line 316 of file MOD_lineart.h.

◆ eLineArtVertFlags

Enumerator
LRT_VERT_HAS_INTERSECTION_DATA 
LRT_VERT_EDGE_USED 

Definition at line 135 of file MOD_lineart.h.

Function Documentation

◆ ED_operatortypes_lineart()

void ED_operatortypes_lineart ( void  )

◆ lineart_LineIntersectTest2d()

BLI_INLINE int lineart_LineIntersectTest2d ( const double a1,
const double a2,
const double b1,
const double b2,
double aRatio 
)

◆ MOD_lineart_chain_clear_picked_flag()

void MOD_lineart_chain_clear_picked_flag ( struct LineartRenderBuffer rb)

Definition at line 892 of file lineart_chain.c.

References LineartRenderBuffer::chains, LISTBASE_FOREACH, and NULL.

Referenced by MOD_lineart_compute_feature_lines().

◆ MOD_lineart_chain_compute_length()

float MOD_lineart_chain_compute_length ( LineartLineChain rlc)

◆ MOD_lineart_chain_connect()

void MOD_lineart_chain_connect ( LineartRenderBuffer rb)

◆ MOD_lineart_chain_count()

int MOD_lineart_chain_count ( const LineartLineChain rlc)

Definition at line 883 of file lineart_chain.c.

References LineartLineChain::chain, count, and LISTBASE_FOREACH.

Referenced by lineart_gpencil_generate().

◆ MOD_lineart_chain_discard_short()

void MOD_lineart_chain_discard_short ( LineartRenderBuffer rb,
const float  threshold 
)

◆ MOD_lineart_chain_feature_lines()

void MOD_lineart_chain_feature_lines ( LineartRenderBuffer rb)

◆ MOD_lineart_chain_split_angle()

void MOD_lineart_chain_split_angle ( LineartRenderBuffer rb,
float  angle_threshold_rad 
)

◆ MOD_lineart_chain_split_for_fixed_occlusion()

void MOD_lineart_chain_split_for_fixed_occlusion ( LineartRenderBuffer rb)

◆ MOD_lineart_compute_feature_lines()

bool MOD_lineart_compute_feature_lines ( Depsgraph depsgraph,
LineartGpencilModifierData lmd 
)

This is the entry point of all line art calculations.

Returns
True when a change is made.

Definition at line 3651 of file lineart_cpu.c.

References LineartRenderBuffer::_source_collection, LineartRenderBuffer::_source_object, LineartRenderBuffer::_source_type, LineartRenderBuffer::angle_splitting_threshold, BKE_scene_camera_switch_update(), LineartGpencilModifierData::calculation_flags, Scene::camera, LineartGpencilModifierData::chaining_image_threshold, DEG_get_evaluated_scene(), depsgraph, ListBase::first, G, LineartGpencilModifierData::level_end, LineartGpencilModifierData::level_start, lineart_count_and_print_render_buffer_memory(), lineart_create_render_buffer(), lineart_main_add_triangles(), lineart_main_bounding_area_make_initial(), lineart_main_cull_triangles(), lineart_main_free_adjacent_data(), lineart_main_get_view_vector(), lineart_main_link_lines(), lineart_main_load_geometries(), lineart_main_occlusion_begin(), lineart_main_perspective_division(), lineart_triangle_size_get(), LRT_ALLOW_DUPLI_OBJECTS, MAX2, LineartRenderBuffer::max_occlusion_level, MIN2, MOD_lineart_chain_clear_picked_flag(), MOD_lineart_chain_connect(), MOD_lineart_chain_discard_short(), MOD_lineart_chain_feature_lines(), MOD_lineart_chain_split_angle(), MOD_lineart_chain_split_for_fixed_occlusion(), scene, LineartGpencilModifierData::source_collection, LineartGpencilModifierData::source_object, LineartGpencilModifierData::source_type, LineartRenderBuffer::triangle_size, and LineartRenderBuffer::vertex_buffer_pointers.

Referenced by bake_strokes(), bakeModifier(), and generateStrokes().

◆ MOD_lineart_destroy_render_data()

void MOD_lineart_destroy_render_data ( struct LineartGpencilModifierData lmd)

◆ MOD_lineart_get_bounding_area()

LineartBoundingArea* MOD_lineart_get_bounding_area ( LineartRenderBuffer rb,
double  x,
double  y 
)

Wrapper for more convenience.

Definition at line 3342 of file lineart_cpu.c.

References lineart_get_bounding_area(), MOD_lineart_get_parent_bounding_area(), NULL, x, and y.

Referenced by MOD_lineart_chain_feature_lines().

◆ MOD_lineart_get_parent_bounding_area()

LineartBoundingArea* MOD_lineart_get_parent_bounding_area ( LineartRenderBuffer rb,
double  x,
double  y 
)

◆ MOD_lineart_gpencil_generate()

void MOD_lineart_gpencil_generate ( LineartRenderBuffer rb,
Depsgraph depsgraph,
Object ob,
bGPDlayer gpl,
bGPDframe gpf,
char  source_type,
void *  source_reference,
int  level_start,
int  level_end,
int  mat_nr,
short  edge_types,
uchar  transparency_flags,
uchar  transparency_mask,
short  thickness,
float  opacity,
const char *  source_vgname,
const char *  vgname,
int  modifier_flags 
)