Blender  V2.93
Classes | Macros | Typedefs | Enumerations | Functions | Variables
BKE_effect.h File Reference
#include "BLI_utildefines.h"

Go to the source code of this file.

Classes

struct  EffectedPoint
 
struct  GuideEffectorData
 
struct  EffectorData
 
struct  EffectorCache
 
struct  EffectorRelation
 
struct  SimDebugElement
 
struct  SimDebugData
 

Macros

#define PE_WIND_AS_SPEED   1
 
#define PE_USE_NORMAL_DATA   4
 
#define PE_VELOCITY_TO_IMPULSE   1
 
#define _VA_SIM_DEBUG_HASH1(a)   (BKE_sim_debug_data_hash(a))
 
#define _VA_SIM_DEBUG_HASH2(a, b)    (BKE_sim_debug_data_hash_combine(BKE_sim_debug_data_hash(a), _VA_SIM_DEBUG_HASH1(b)))
 
#define _VA_SIM_DEBUG_HASH3(a, b, c)    (BKE_sim_debug_data_hash_combine(BKE_sim_debug_data_hash(a), _VA_SIM_DEBUG_HASH2(b, c)))
 
#define _VA_SIM_DEBUG_HASH4(a, b, c, d)    (BKE_sim_debug_data_hash_combine(BKE_sim_debug_data_hash(a), _VA_SIM_DEBUG_HASH3(b, c, d)))
 
#define _VA_SIM_DEBUG_HASH5(a, b, c, d, e)    (BKE_sim_debug_data_hash_combine(BKE_sim_debug_data_hash(a), _VA_SIM_DEBUG_HASH4(b, c, d, e)))
 
#define _VA_SIM_DEBUG_HASH6(a, b, c, d, e, f)    (BKE_sim_debug_data_hash_combine(BKE_sim_debug_data_hash(a), _VA_SIM_DEBUG_HASH5(b, c, d, e, f)))
 
#define _VA_SIM_DEBUG_HASH7(a, b, c, d, e, f, g)
 
#define _VA_SIM_DEBUG_HASH8(a, b, c, d, e, f, g, h)
 
#define SIM_DEBUG_HASH(...)   VA_NARGS_CALL_OVERLOAD(_VA_SIM_DEBUG_HASH, __VA_ARGS__)
 
#define BKE_sim_debug_data_add_dot(p, r, g, b, category, ...)
 
#define BKE_sim_debug_data_add_circle(p, radius, r, g, b, category, ...)
 
#define BKE_sim_debug_data_add_line(p1, p2, r, g, b, category, ...)
 
#define BKE_sim_debug_data_add_vector(p, d, r, g, b, category, ...)
 
#define BKE_sim_debug_data_add_string(p, str, r, g, b, category, ...)
 
#define BKE_sim_debug_data_remove(...)    BKE_sim_debug_data_remove_element(SIM_DEBUG_HASH(__VA_ARGS__))
 

Typedefs

typedef struct EffectedPoint EffectedPoint
 
typedef struct GuideEffectorData GuideEffectorData
 
typedef struct EffectorData EffectorData
 
typedef struct EffectorCache EffectorCache
 
typedef struct EffectorRelation EffectorRelation
 
typedef struct SimDebugElement SimDebugElement
 
typedef enum eSimDebugElement_Type eSimDebugElement_Type
 
typedef struct SimDebugData SimDebugData
 

Enumerations

enum  eSimDebugElement_Type {
  SIM_DEBUG_ELEM_DOT , SIM_DEBUG_ELEM_CIRCLE , SIM_DEBUG_ELEM_LINE , SIM_DEBUG_ELEM_VECTOR ,
  SIM_DEBUG_ELEM_STRING
}
 

Functions

struct EffectorWeightsBKE_effector_add_weights (struct Collection *collection)
 
struct PartDeflectBKE_partdeflect_new (int type)
 
struct PartDeflectBKE_partdeflect_copy (const struct PartDeflect *pd_src)
 
void BKE_partdeflect_free (struct PartDeflect *pd)
 
struct ListBaseBKE_effector_relations_create (struct Depsgraph *depsgraph, struct ViewLayer *view_layer, struct Collection *collection)
 
void BKE_effector_relations_free (struct ListBase *lb)
 
struct ListBaseBKE_effectors_create (struct Depsgraph *depsgraph, struct Object *ob_src, struct ParticleSystem *psys_src, struct EffectorWeights *weights, bool use_rotation)
 
void BKE_effectors_apply (struct ListBase *effectors, struct ListBase *colliders, struct EffectorWeights *weights, struct EffectedPoint *point, float *force, float *wind_force, float *impulse)
 
void BKE_effectors_free (struct ListBase *lb)
 
void pd_point_from_particle (struct ParticleSimulationData *sim, struct ParticleData *pa, struct ParticleKey *state, struct EffectedPoint *point)
 
void pd_point_from_loc (struct Scene *scene, float *loc, float *vel, int index, struct EffectedPoint *point)
 
void pd_point_from_soft (struct Scene *scene, float *loc, float *vel, int index, struct EffectedPoint *point)
 
float effector_falloff (struct EffectorCache *eff, struct EffectorData *efd, struct EffectedPoint *point, struct EffectorWeights *weights)
 
int closest_point_on_surface (struct SurfaceModifierData *surmd, const float co[3], float surface_co[3], float surface_nor[3], float surface_vel[3])
 
int get_effector_data (struct EffectorCache *eff, struct EffectorData *efd, struct EffectedPoint *point, int real_velocity)
 
unsigned int BKE_sim_debug_data_hash (int i)
 
unsigned int BKE_sim_debug_data_hash_combine (unsigned int kx, unsigned int ky)
 
void BKE_sim_debug_data_set_enabled (bool enable)
 
bool BKE_sim_debug_data_get_enabled (void)
 
void BKE_sim_debug_data_free (void)
 
void BKE_sim_debug_data_add_element (int type, const float v1[3], const float v2[3], const char *str, float r, float g, float b, const char *category, unsigned int hash)
 
void BKE_sim_debug_data_remove_element (unsigned int hash)
 
void BKE_sim_debug_data_clear (void)
 
void BKE_sim_debug_data_clear_category (const char *category)
 

Variables

SimDebugData_sim_debug_data
 

Macro Definition Documentation

◆ _VA_SIM_DEBUG_HASH1

#define _VA_SIM_DEBUG_HASH1 (   a)    (BKE_sim_debug_data_hash(a))

Definition at line 183 of file BKE_effect.h.

◆ _VA_SIM_DEBUG_HASH2

#define _VA_SIM_DEBUG_HASH2 (   a,
 
)     (BKE_sim_debug_data_hash_combine(BKE_sim_debug_data_hash(a), _VA_SIM_DEBUG_HASH1(b)))

Definition at line 184 of file BKE_effect.h.

◆ _VA_SIM_DEBUG_HASH3

#define _VA_SIM_DEBUG_HASH3 (   a,
  b,
 
)     (BKE_sim_debug_data_hash_combine(BKE_sim_debug_data_hash(a), _VA_SIM_DEBUG_HASH2(b, c)))

Definition at line 186 of file BKE_effect.h.

◆ _VA_SIM_DEBUG_HASH4

#define _VA_SIM_DEBUG_HASH4 (   a,
  b,
  c,
 
)     (BKE_sim_debug_data_hash_combine(BKE_sim_debug_data_hash(a), _VA_SIM_DEBUG_HASH3(b, c, d)))

Definition at line 188 of file BKE_effect.h.

◆ _VA_SIM_DEBUG_HASH5

#define _VA_SIM_DEBUG_HASH5 (   a,
  b,
  c,
  d,
  e 
)     (BKE_sim_debug_data_hash_combine(BKE_sim_debug_data_hash(a), _VA_SIM_DEBUG_HASH4(b, c, d, e)))

Definition at line 190 of file BKE_effect.h.

◆ _VA_SIM_DEBUG_HASH6

#define _VA_SIM_DEBUG_HASH6 (   a,
  b,
  c,
  d,
  e,
 
)     (BKE_sim_debug_data_hash_combine(BKE_sim_debug_data_hash(a), _VA_SIM_DEBUG_HASH5(b, c, d, e, f)))

Definition at line 192 of file BKE_effect.h.

◆ _VA_SIM_DEBUG_HASH7

#define _VA_SIM_DEBUG_HASH7 (   a,
  b,
  c,
  d,
  e,
  f,
 
)
Value:
_VA_SIM_DEBUG_HASH6(b, c, d, e, f, g)))
unsigned int BKE_sim_debug_data_hash_combine(unsigned int kx, unsigned int ky)
Definition: effect.c:1228
#define _VA_SIM_DEBUG_HASH6(a, b, c, d, e, f)
Definition: BKE_effect.h:192
unsigned int BKE_sim_debug_data_hash(int i)
Definition: effect.c:1223
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
static unsigned c
Definition: RandGen.cpp:97
static unsigned a[3]
Definition: RandGen.cpp:92

Definition at line 194 of file BKE_effect.h.

◆ _VA_SIM_DEBUG_HASH8

#define _VA_SIM_DEBUG_HASH8 (   a,
  b,
  c,
  d,
  e,
  f,
  g,
 
)
Value:
_VA_SIM_DEBUG_HASH7(b, c, d, e, f, g, h)))
#define _VA_SIM_DEBUG_HASH7(a, b, c, d, e, f, g)
Definition: BKE_effect.h:194

Definition at line 197 of file BKE_effect.h.

◆ BKE_sim_debug_data_add_circle

#define BKE_sim_debug_data_add_circle (   p,
  radius,
  r,
  g,
  b,
  category,
  ... 
)
Value:
{ \
const float v2[3] = {radius, 0.0f, 0.0f}; \
BKE_sim_debug_data_add_element( \
SIM_DEBUG_ELEM_CIRCLE, p, v2, NULL, r, g, b, category, SIM_DEBUG_HASH(__VA_ARGS__)); \
}
@ SIM_DEBUG_ELEM_CIRCLE
Definition: BKE_effect.h:216
#define SIM_DEBUG_HASH(...)
Definition: BKE_effect.h:201
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble GLdouble r _GL_VOID_RET _GL_VOID GLfloat GLfloat r _GL_VOID_RET _GL_VOID GLint GLint r _GL_VOID_RET _GL_VOID GLshort GLshort r _GL_VOID_RET _GL_VOID GLdouble GLdouble r
ATTR_WARN_UNUSED_RESULT const BMVert * v2

Definition at line 250 of file BKE_effect.h.

◆ BKE_sim_debug_data_add_dot

#define BKE_sim_debug_data_add_dot (   p,
  r,
  g,
  b,
  category,
  ... 
)
Value:
{ \
const float v2[3] = {0.0f, 0.0f, 0.0f}; \
BKE_sim_debug_data_add_element( \
SIM_DEBUG_ELEM_DOT, p, v2, NULL, r, g, b, category, SIM_DEBUG_HASH(__VA_ARGS__)); \
}
@ SIM_DEBUG_ELEM_DOT
Definition: BKE_effect.h:215

Definition at line 243 of file BKE_effect.h.

◆ BKE_sim_debug_data_add_line

#define BKE_sim_debug_data_add_line (   p1,
  p2,
  r,
  g,
  b,
  category,
  ... 
)
Value:
{ \
BKE_sim_debug_data_add_element( \
SIM_DEBUG_ELEM_LINE, p1, p2, NULL, r, g, b, category, SIM_DEBUG_HASH(__VA_ARGS__)); \
}
@ SIM_DEBUG_ELEM_LINE
Definition: BKE_effect.h:217

Definition at line 257 of file BKE_effect.h.

◆ BKE_sim_debug_data_add_string

#define BKE_sim_debug_data_add_string (   p,
  str,
  r,
  g,
  b,
  category,
  ... 
)
Value:
{ \
BKE_sim_debug_data_add_element( \
SIM_DEBUG_ELEM_STRING, p, NULL, str, r, g, b, category, SIM_DEBUG_HASH(__VA_ARGS__)); \
}
@ SIM_DEBUG_ELEM_STRING
Definition: BKE_effect.h:219
#define str(s)

Definition at line 269 of file BKE_effect.h.

◆ BKE_sim_debug_data_add_vector

#define BKE_sim_debug_data_add_vector (   p,
  d,
  r,
  g,
  b,
  category,
  ... 
)
Value:
{ \
BKE_sim_debug_data_add_element( \
SIM_DEBUG_ELEM_VECTOR, p, d, NULL, r, g, b, category, SIM_DEBUG_HASH(__VA_ARGS__)); \
}
@ SIM_DEBUG_ELEM_VECTOR
Definition: BKE_effect.h:218

Definition at line 263 of file BKE_effect.h.

◆ BKE_sim_debug_data_remove

#define BKE_sim_debug_data_remove (   ...)     BKE_sim_debug_data_remove_element(SIM_DEBUG_HASH(__VA_ARGS__))

Definition at line 275 of file BKE_effect.h.

◆ PE_USE_NORMAL_DATA

#define PE_USE_NORMAL_DATA   4

Definition at line 171 of file BKE_effect.h.

◆ PE_VELOCITY_TO_IMPULSE

#define PE_VELOCITY_TO_IMPULSE   1

Definition at line 174 of file BKE_effect.h.

◆ PE_WIND_AS_SPEED

#define PE_WIND_AS_SPEED   1

Definition at line 170 of file BKE_effect.h.

◆ SIM_DEBUG_HASH

#define SIM_DEBUG_HASH (   ...)    VA_NARGS_CALL_OVERLOAD(_VA_SIM_DEBUG_HASH, __VA_ARGS__)

Definition at line 201 of file BKE_effect.h.

Typedef Documentation

◆ EffectedPoint

typedef struct EffectedPoint EffectedPoint

◆ EffectorCache

typedef struct EffectorCache EffectorCache

◆ EffectorData

typedef struct EffectorData EffectorData

◆ EffectorRelation

◆ eSimDebugElement_Type

◆ GuideEffectorData

◆ SimDebugData

typedef struct SimDebugData SimDebugData

◆ SimDebugElement

Enumeration Type Documentation

◆ eSimDebugElement_Type

Enumerator
SIM_DEBUG_ELEM_DOT 
SIM_DEBUG_ELEM_CIRCLE 
SIM_DEBUG_ELEM_LINE 
SIM_DEBUG_ELEM_VECTOR 
SIM_DEBUG_ELEM_STRING 

Definition at line 214 of file BKE_effect.h.

Function Documentation

◆ BKE_effector_add_weights()

struct EffectorWeights* BKE_effector_add_weights ( struct Collection collection)

◆ BKE_effector_relations_create()

struct ListBase* BKE_effector_relations_create ( struct Depsgraph depsgraph,
struct ViewLayer view_layer,
struct Collection collection 
)

◆ BKE_effector_relations_free()

void BKE_effector_relations_free ( struct ListBase lb)

Definition at line 265 of file effect.c.

References BLI_freelistN(), and MEM_freeN.

Referenced by blender::deg::clear_physics_relations().

◆ BKE_effectors_apply()

void BKE_effectors_apply ( struct ListBase effectors,
struct ListBase colliders,
struct EffectorWeights weights,
struct EffectedPoint point,
float force,
float wind_force,
float impulse 
)

◆ BKE_effectors_create()

struct ListBase* BKE_effectors_create ( struct Depsgraph depsgraph,
struct Object ob_src,
struct ParticleSystem psys_src,
struct EffectorWeights weights,
bool  use_rotation 
)

◆ BKE_effectors_free()

void BKE_effectors_free ( struct ListBase lb)

◆ BKE_partdeflect_copy()

struct PartDeflect* BKE_partdeflect_copy ( const struct PartDeflect pd_src)

Definition at line 125 of file effect.c.

References BLI_rng_copy(), MEM_dupallocN, NULL, and PartDeflect::rng.

Referenced by particle_settings_copy_data().

◆ BKE_partdeflect_free()

void BKE_partdeflect_free ( struct PartDeflect pd)

Definition at line 137 of file effect.c.

References BLI_rng_free(), MEM_freeN, and PartDeflect::rng.

Referenced by object_free_data(), and particle_settings_free_data().

◆ BKE_partdeflect_new()

struct PartDeflect* BKE_partdeflect_new ( int  type)

◆ BKE_sim_debug_data_add_element()

void BKE_sim_debug_data_add_element ( int  type,
const float  v1[3],
const float  v2[3],
const char *  str,
float  r,
float  g,
float  b,
const char *  category,
unsigned int  hash 
)

◆ BKE_sim_debug_data_clear()

void BKE_sim_debug_data_clear ( void  )

Definition at line 1383 of file effect.c.

References _sim_debug_data, BLI_ghash_clear(), debug_element_free(), SimDebugData::gh, and NULL.

◆ BKE_sim_debug_data_clear_category()

void BKE_sim_debug_data_clear_category ( const char *  category)

◆ BKE_sim_debug_data_free()

void BKE_sim_debug_data_free ( void  )

◆ BKE_sim_debug_data_get_enabled()

bool BKE_sim_debug_data_get_enabled ( void  )

Definition at line 1295 of file effect.c.

References _sim_debug_data, and NULL.

◆ BKE_sim_debug_data_hash()

unsigned int BKE_sim_debug_data_hash ( int  i)

Definition at line 1223 of file effect.c.

References BLI_ghashutil_uinthash().

◆ BKE_sim_debug_data_hash_combine()

unsigned int BKE_sim_debug_data_hash_combine ( unsigned int  kx,
unsigned int  ky 
)

Definition at line 1228 of file effect.c.

References Freestyle::a, Freestyle::c, and rot.

◆ BKE_sim_debug_data_remove_element()

void BKE_sim_debug_data_remove_element ( unsigned int  hash)

◆ BKE_sim_debug_data_set_enabled()

void BKE_sim_debug_data_set_enabled ( bool  enable)

◆ closest_point_on_surface()

int closest_point_on_surface ( struct SurfaceModifierData surmd,
const float  co[3],
float  surface_co[3],
float  surface_nor[3],
float  surface_vel[3] 
)

◆ effector_falloff()

float effector_falloff ( struct EffectorCache eff,
struct EffectorData efd,
struct EffectedPoint point,
struct EffectorWeights weights 
)

Referenced by precalc_guides(), and rule_goal_avoid().

◆ get_effector_data()

int get_effector_data ( struct EffectorCache eff,
struct EffectorData efd,
struct EffectedPoint point,
int  real_velocity 
)

◆ pd_point_from_loc()

void pd_point_from_loc ( struct Scene scene,
float loc,
float vel,
int  index,
struct EffectedPoint point 
)

◆ pd_point_from_particle()

void pd_point_from_particle ( struct ParticleSimulationData sim,
struct ParticleData pa,
struct ParticleKey state,
struct EffectedPoint point 
)

◆ pd_point_from_soft()

void pd_point_from_soft ( struct Scene scene,
float loc,
float vel,
int  index,
struct EffectedPoint point 
)

Variable Documentation

◆ _sim_debug_data

SimDebugData* _sim_debug_data
extern