Blender  V3.3
Classes | Macros | Typedefs | Functions | Variables
mball_tessellate.c File Reference
#include <ctype.h>
#include <float.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MEM_guardedalloc.h"
#include "DNA_meta_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "BLI_listbase.h"
#include "BLI_math.h"
#include "BLI_memarena.h"
#include "BLI_string_utils.h"
#include "BLI_utildefines.h"
#include "BKE_global.h"
#include "BKE_displist.h"
#include "BKE_mball_tessellate.h"
#include "BKE_object.h"
#include "BKE_scene.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_query.h"
#include "BLI_strict_flags.h"

Go to the source code of this file.

Classes

struct  corner
 
struct  cube
 
struct  cubes
 
struct  centerlist
 
struct  edgelist
 
struct  intlist
 
struct  intlists
 
struct  Box
 
struct  MetaballBVHNode
 
struct  process
 

Macros

#define MBALL_ARRAY_LEN_INIT   4096
 
#define L   0 /* Left direction: -x, -i. */
 
#define R   1 /* Right direction: +x, +i. */
 
#define B   2 /* Bottom direction: -y, -j. */
 
#define T   3 /* Top direction: +y, +j. */
 
#define N   4 /* Near direction: -z, -k. */
 
#define F   5 /* Far direction: +z, +k. */
 
#define LBN   0 /* Left bottom near corner. */
 
#define LBF   1 /* Left bottom far corner. */
 
#define LTN   2 /* Left top near corner. */
 
#define LTF   3 /* Left top far corner. */
 
#define RBN   4 /* Right bottom near corner. */
 
#define RBF   5 /* Right bottom far corner. */
 
#define RTN   6 /* Right top near corner. */
 
#define RTF   7 /* Right top far corner. */
 
#define HASHBIT   (5)
 
#define HASHSIZE   (size_t)(1 << (3 * HASHBIT))
 
#define HASH(i, j, k)   ((((((i)&31) << 5) | ((j)&31)) << 5) | ((k)&31))
 
#define MB_BIT(i, bit)   (((i) >> (bit)) & 1)
 
#define LB   0 /* left bottom edge */
 
#define LT   1 /* left top edge */
 
#define LN   2 /* left near edge */
 
#define LF   3 /* left far edge */
 
#define RB   4 /* right bottom edge */
 
#define RT   5 /* right top edge */
 
#define RN   6 /* right near edge */
 
#define RF   7 /* right far edge */
 
#define BN   8 /* bottom near edge */
 
#define BF   9 /* bottom far edge */
 
#define TN   10 /* top near edge */
 
#define TF   11 /* top far edge */
 

Typedefs

typedef struct corner CORNER
 
typedef struct cube CUBE
 
typedef struct cubes CUBES
 
typedef struct centerlist CENTERLIST
 
typedef struct edgelist EDGELIST
 
typedef struct intlist INTLIST
 
typedef struct intlists INTLISTS
 
typedef struct Box Box
 
typedef struct MetaballBVHNode MetaballBVHNode
 
typedef struct process PROCESS
 

Functions

static int vertid (PROCESS *process, const CORNER *c1, const CORNER *c2)
 
static void add_cube (PROCESS *process, int i, int j, int k)
 
static void make_face (PROCESS *process, int i1, int i2, int i3, int i4)
 
static void converge (PROCESS *process, const CORNER *c1, const CORNER *c2, float r_p[3])
 
static void make_box_union (const BoundBox *a, const Box *b, Box *r_out)
 
static void make_box_from_metaelem (Box *r, const MetaElem *ml)
 
static unsigned int partition_mainb (MetaElem **mainb, unsigned int start, unsigned int end, unsigned int s, float div)
 
static void build_bvh_spatial (PROCESS *process, MetaballBVHNode *node, unsigned int start, unsigned int end, const Box *allbox)
 
static float densfunc (const MetaElem *ball, float x, float y, float z)
 
static float metaball (PROCESS *process, float x, float y, float z)
 
static void freepolygonize (PROCESS *process)
 
static void docube (PROCESS *process, CUBE *cube)
 
static CORNERsetcorner (PROCESS *process, int i, int j, int k)
 
static int nextcwedge (int edge, int face)
 
static int otherface (int edge, int face)
 
static void makecubetable (void)
 
void BKE_mball_cubeTable_free (void)
 
static int setcenter (PROCESS *process, CENTERLIST *table[], const int i, const int j, const int k)
 
static void setedge (PROCESS *process, int i1, int j1, int k1, int i2, int j2, int k2, int vid)
 
static int getedge (EDGELIST *table[], int i1, int j1, int k1, int i2, int j2, int k2)
 
static void addtovertices (PROCESS *process, const float v[3], const float no[3])
 
static void vnormal (PROCESS *process, const float point[3], float r_no[3])
 
static void next_lattice (int r[3], const float pos[3], const float size)
 
static void prev_lattice (int r[3], const float pos[3], const float size)
 
static void closest_latice (int r[3], const float pos[3], const float size)
 
static void find_first_points (PROCESS *process, const unsigned int em)
 
static void polygonize (PROCESS *process)
 
static void init_meta (Depsgraph *depsgraph, PROCESS *process, Scene *scene, Object *ob)
 
void BKE_mball_polygonize (Depsgraph *depsgraph, Scene *scene, Object *ob, ListBase *dispbase)
 

Variables

static INTLISTScubetable [256]
 
static char faces [256]
 
static int corner1 [12]
 
static int corner2 [12]
 
static int leftface [12]
 
static int rightface [12]
 

Macro Definition Documentation

◆ B

#define B   2 /* Bottom direction: -y, -j. */

Definition at line 263 of file mball_tessellate.c.

◆ BF

#define BF   9 /* bottom far edge */

Definition at line 514 of file mball_tessellate.c.

◆ BN

#define BN   8 /* bottom near edge */

Definition at line 513 of file mball_tessellate.c.

◆ F

#define F   5 /* Far direction: +z, +k. */

Definition at line 266 of file mball_tessellate.c.

◆ HASH

#define HASH (   i,
  j,
 
)    ((((((i)&31) << 5) | ((j)&31)) << 5) | ((k)&31))

Definition at line 285 of file mball_tessellate.c.

◆ HASHBIT

#define HASHBIT   (5)

the LBN corner of cube (i, j, k), corresponds with location (i-0.5)*size, (j-0.5)*size, (k-0.5)*size)

Definition at line 281 of file mball_tessellate.c.

◆ HASHSIZE

#define HASHSIZE   (size_t)(1 << (3 * HASHBIT))

Hash table size (32768).

Definition at line 283 of file mball_tessellate.c.

◆ L

#define L   0 /* Left direction: -x, -i. */

BASED AT CODE (but mostly rewritten) : C code from the article "An Implicit Surface Polygonizer" by Jules Bloomenthal jbloo.nosp@m.m@be.nosp@m.auty..nosp@m.gmu..nosp@m.edu in "Graphics Gems IV", Academic Press, 1994

Authored by Jules Bloomenthal, Xerox PARC. Copyright (c) Xerox Corporation, 1991. All rights reserved. Permission is granted to reproduce, use and distribute this code for any and all purposes, provided that this notice appears in all copies.

Definition at line 261 of file mball_tessellate.c.

◆ LB

#define LB   0 /* left bottom edge */

Definition at line 505 of file mball_tessellate.c.

◆ LBF

#define LBF   1 /* Left bottom far corner. */

Definition at line 268 of file mball_tessellate.c.

◆ LBN

#define LBN   0 /* Left bottom near corner. */

Definition at line 267 of file mball_tessellate.c.

◆ LF

#define LF   3 /* left far edge */

Definition at line 508 of file mball_tessellate.c.

◆ LN

#define LN   2 /* left near edge */

Definition at line 507 of file mball_tessellate.c.

◆ LT

#define LT   1 /* left top edge */

Definition at line 506 of file mball_tessellate.c.

◆ LTF

#define LTF   3 /* Left top far corner. */

Definition at line 270 of file mball_tessellate.c.

◆ LTN

#define LTN   2 /* Left top near corner. */

Definition at line 269 of file mball_tessellate.c.

◆ MB_BIT

#define MB_BIT (   i,
  bit 
)    (((i) >> (bit)) & 1)

Definition at line 287 of file mball_tessellate.c.

◆ MBALL_ARRAY_LEN_INIT

#define MBALL_ARRAY_LEN_INIT   4096

Definition at line 42 of file mball_tessellate.c.

◆ N

#define N   4 /* Near direction: -z, -k. */

Definition at line 265 of file mball_tessellate.c.

◆ R

#define R   1 /* Right direction: +x, +i. */

Definition at line 262 of file mball_tessellate.c.

◆ RB

#define RB   4 /* right bottom edge */

Definition at line 509 of file mball_tessellate.c.

◆ RBF

#define RBF   5 /* Right bottom far corner. */

Definition at line 272 of file mball_tessellate.c.

◆ RBN

#define RBN   4 /* Right bottom near corner. */

Definition at line 271 of file mball_tessellate.c.

◆ RF

#define RF   7 /* right far edge */

Definition at line 512 of file mball_tessellate.c.

◆ RN

#define RN   6 /* right near edge */

Definition at line 511 of file mball_tessellate.c.

◆ RT

#define RT   5 /* right top edge */

Definition at line 510 of file mball_tessellate.c.

◆ RTF

#define RTF   7 /* Right top far corner. */

Definition at line 274 of file mball_tessellate.c.

◆ RTN

#define RTN   6 /* Right top near corner. */

Definition at line 273 of file mball_tessellate.c.

◆ T

#define T   3 /* Top direction: +y, +j. */

Definition at line 264 of file mball_tessellate.c.

◆ TF

#define TF   11 /* top far edge */

Definition at line 516 of file mball_tessellate.c.

◆ TN

#define TN   10 /* top near edge */

Definition at line 515 of file mball_tessellate.c.

Typedef Documentation

◆ Box

typedef struct Box Box

◆ CENTERLIST

typedef struct centerlist CENTERLIST

◆ CORNER

typedef struct corner CORNER

◆ CUBE

typedef struct cube CUBE

◆ CUBES

typedef struct cubes CUBES

◆ EDGELIST

typedef struct edgelist EDGELIST

◆ INTLIST

typedef struct intlist INTLIST

◆ INTLISTS

typedef struct intlists INTLISTS

◆ MetaballBVHNode

◆ PROCESS

typedef struct process PROCESS

Function Documentation

◆ add_cube()

static void add_cube ( PROCESS process,
int  i,
int  j,
int  k 
)
static

Adds cube at given lattice position to cube stack of process.

Definition at line 1036 of file mball_tessellate.c.

References BLI_memarena_alloc(), process::centers, cube::corners, cubes::cube, process::cubes, cube::i, cube::j, cube::k, MB_BIT, cubes::next, process::pgn_elements, setcenter(), and setcorner().

Referenced by docube(), and find_first_points().

◆ addtovertices()

static void addtovertices ( PROCESS process,
const float  v[3],
const float  no[3] 
)
static

Adds a vertex, expands memory if needed.

Definition at line 933 of file mball_tessellate.c.

References process::co, copy_v3_v3(), process::curvertex, MBALL_ARRAY_LEN_INIT, MEM_reallocN, process::no, process::totvertex, UNLIKELY, and v.

Referenced by vertid().

◆ BKE_mball_cubeTable_free()

void BKE_mball_cubeTable_free ( void  )

◆ BKE_mball_polygonize()

void BKE_mball_polygonize ( Depsgraph depsgraph,
Scene scene,
Object ob,
ListBase dispbase 
)

◆ build_bvh_spatial()

static void build_bvh_spatial ( PROCESS process,
MetaballBVHNode node,
unsigned int  start,
unsigned int  end,
const Box allbox 
)
static

Recursively builds a BVH, dividing elements along the middle of the longest axis of allbox.

Definition at line 188 of file mball_tessellate.c.

References MetaElem::bb, BLI_memarena_alloc(), process::bvh_queue_size, INIT_MINMAX, process::mainb, make_box_from_metaelem(), make_box_union(), Box::max, Box::min, node, NULL, partition_mainb(), and process::pgn_elements.

Referenced by BKE_mball_polygonize().

◆ closest_latice()

static void closest_latice ( int  r[3],
const float  pos[3],
const float  size 
)
static

Definition at line 1073 of file mball_tessellate.c.

References floorf, pos, r, and size().

Referenced by find_first_points().

◆ converge()

static void converge ( PROCESS process,
const CORNER c1,
const CORNER c2,
float  r_p[3] 
)
static

Given two corners, computes approximation of surface intersection point between them. In case of small threshold, do bisection.

Definition at line 997 of file mball_tessellate.c.

References corner::co, process::converge_res, copy_v3_v3(), interp_v3_v3v3(), metaball(), and corner::value.

Referenced by vertid().

◆ densfunc()

static float densfunc ( const MetaElem ball,
float  x,
float  y,
float  z 
)
static

Computes density from given metaball at given position. Metaball equation is: (1 - r^2 / R^2)^3 * s

r = distance from center R = metaball radius s - metaball stiffness

Definition at line 300 of file mball_tessellate.c.

References ATTR_FALLTHROUGH, MetaElem::expx, MetaElem::expy, MetaElem::expz, MetaElem::imat, MetaElem::len, len_squared_v3(), MB_BALL, MB_CUBE, MB_ELIPSOID, MB_PLANE, MB_TUBE, MB_TUBEX, MB_TUBEY, MB_TUBEZ, mul_m4_v3(), MetaElem::rad2, MetaElem::s, MetaElem::type, x, y, and z.

Referenced by metaball().

◆ docube()

static void docube ( PROCESS process,
CUBE cube 
)
static

triangulate the cube directly, without decomposition

Definition at line 584 of file mball_tessellate.c.

References add_cube(), corner1, corner2, cube::corners, count, cubetable, faces, cube::i, intlist::i, cube::j, cube::k, intlists::list, make_face(), MB_BIT, intlist::next, intlists::next, corner::value, and vertid().

Referenced by polygonize().

◆ find_first_points()

static void find_first_points ( PROCESS process,
const unsigned int  em 
)
static

◆ freepolygonize()

static void freepolygonize ( PROCESS process)
static

◆ getedge()

static int getedge ( EDGELIST table[],
int  i1,
int  j1,
int  k1,
int  i2,
int  j2,
int  k2 
)
static
Returns
vertex id for edge; return -1 if not set

Definition at line 906 of file mball_tessellate.c.

References HASH, edgelist::i1, i1, edgelist::i2, edgelist::j1, edgelist::j2, edgelist::k1, edgelist::k2, edgelist::next, NULL, t, and edgelist::vid.

Referenced by vertid().

◆ init_meta()

static void init_meta ( Depsgraph depsgraph,
PROCESS process,
Scene scene,
Object ob 
)
static

◆ make_box_from_metaelem()

static void make_box_from_metaelem ( Box r,
const MetaElem ml 
)
static

Definition at line 143 of file mball_tessellate.c.

References MetaElem::bb, copy_v3_v3(), r, and BoundBox::vec.

Referenced by build_bvh_spatial().

◆ make_box_union()

static void make_box_union ( const BoundBox a,
const Box b,
Box r_out 
)
static

Definition at line 132 of file mball_tessellate.c.

References Freestyle::a, usdtokens::b(), Box::max, max_ff(), Box::min, and min_ff().

Referenced by build_bvh_spatial(), and init_meta().

◆ make_face()

static void make_face ( PROCESS process,
int  i1,
int  i2,
int  i3,
int  i4 
)
static

◆ makecubetable()

static void makecubetable ( void  )
static

create the 256 entry table for cubical polygonization

Definition at line 741 of file mball_tessellate.c.

References B, BF, BN, Freestyle::c, corner1, corner2, cubetable, e, ELEM, F, faces, intlist::i, L, LB, leftface, LF, intlists::list, LN, LT, MB_BIT, MEM_callocN, N, intlist::next, intlists::next, nextcwedge(), NULL, otherface(), pos, R, RB, RF, rightface, RN, RT, T, TF, and TN.

Referenced by polygonize().

◆ metaball()

static float metaball ( PROCESS process,
float  x,
float  y,
float  z 
)
static

Computes density at given position form all meta-balls which contain this point in their box. Traverses BVH using a queue.

Definition at line 398 of file mball_tessellate.c.

References process::bvh_queue, densfunc(), process::metaball_bvh, node, process::thresh, x, y, and z.

Referenced by converge(), metaball_foreach_id(), metaball_free_data(), metaball_init_data(), setcorner(), and vnormal().

◆ next_lattice()

static void next_lattice ( int  r[3],
const float  pos[3],
const float  size 
)
static

Definition at line 1060 of file mball_tessellate.c.

References ceil(), pos, r, and size().

Referenced by find_first_points(), and prev_lattice().

◆ nextcwedge()

static int nextcwedge ( int  edge,
int  face 
)
static

return next clockwise edge from given edge around given face

Definition at line 698 of file mball_tessellate.c.

References B, BF, BN, L, LB, LF, LN, LT, R, RB, RF, RN, RT, T, TF, and TN.

Referenced by makecubetable().

◆ otherface()

static int otherface ( int  edge,
int  face 
)
static
Returns
the face adjoining edge that is not the given face

Definition at line 732 of file mball_tessellate.c.

References leftface, and rightface.

Referenced by makecubetable().

◆ partition_mainb()

static unsigned int partition_mainb ( MetaElem **  mainb,
unsigned int  start,
unsigned int  end,
unsigned int  s,
float  div 
)
static

Partitions part of process.mainb array [start, end) along axis s. Returns i, where centroids of elements in the [start, i) segment lie "on the right side" of div, and elements in the [i, end) segment lie "on the left"

Definition at line 155 of file mball_tessellate.c.

References MetaElem::bb, SWAP, and BoundBox::vec.

Referenced by build_bvh_spatial().

◆ polygonize()

static void polygonize ( PROCESS process)
static

The main polygonization proc. Allocates memory, makes cubetable, finds starting surface points and processes cubes on the stack until none left.

Definition at line 1134 of file mball_tessellate.c.

References process::bvh_queue, process::bvh_queue_size, Freestyle::c, process::centers, process::corners, cubes::cube, process::cubes, docube(), process::edges, find_first_points(), HASHSIZE, makecubetable(), MEM_callocN, cubes::next, NULL, and process::totelem.

Referenced by BKE_mball_polygonize().

◆ prev_lattice()

static void prev_lattice ( int  r[3],
const float  pos[3],
const float  size 
)
static

Definition at line 1066 of file mball_tessellate.c.

References next_lattice(), pos, r, and size().

Referenced by find_first_points().

◆ setcenter()

static int setcenter ( PROCESS process,
CENTERLIST table[],
const int  i,
const int  j,
const int  k 
)
static

Inserts cube at lattice i, j, k into hash table, marking it as "done"

Definition at line 846 of file mball_tessellate.c.

References BLI_memarena_alloc(), HASH, centerlist::i, centerlist::j, centerlist::k, l, centerlist::next, BMLoop::next, NULL, and process::pgn_elements.

Referenced by add_cube().

◆ setcorner()

static CORNER* setcorner ( PROCESS process,
int  i,
int  j,
int  k 
)
static

return corner with the given lattice location set (and cache) its function value

Definition at line 662 of file mball_tessellate.c.

References BLI_memarena_alloc(), Freestyle::c, process::corners, float(), HASH, metaball(), NULL, process::pgn_elements, and process::size.

Referenced by add_cube(), and find_first_points().

◆ setedge()

static void setedge ( PROCESS process,
int  i1,
int  j1,
int  k1,
int  i2,
int  j2,
int  k2,
int  vid 
)
static

Sets vid of vertex lying on given edge.

Definition at line 873 of file mball_tessellate.c.

References BLI_memarena_alloc(), process::edges, HASH, edgelist::i1, i1, edgelist::i2, edgelist::j1, edgelist::j2, edgelist::k1, edgelist::k2, edgelist::next, process::pgn_elements, t, and edgelist::vid.

Referenced by vertid().

◆ vertid()

static int vertid ( PROCESS process,
const CORNER c1,
const CORNER c2 
)
static
Returns
the id of vertex between two corners.

If it wasn't previously computed, does converge() and adds vertex to process.

Definition at line 969 of file mball_tessellate.c.

References addtovertices(), converge(), process::curvertex, process::edges, getedge(), corner::i, corner::j, corner::k, setedge(), v, vnormal(), and zero_v3().

Referenced by docube().

◆ vnormal()

static void vnormal ( PROCESS process,
const float  point[3],
float  r_no[3] 
)
static

Computes normal from density field at given point.

Note
Doesn't do normalization!

Definition at line 953 of file mball_tessellate.c.

References process::delta, metaball(), and point.

Referenced by GeometryManager::device_update_mesh(), Mesh::pack_normals(), and vertid().

Variable Documentation

◆ corner1

int corner1[12]
static
Initial value:
= {
LBN,
LTN,
LBN,
LBF,
RBN,
RTN,
RBN,
RBF,
LBN,
LBF,
LTN,
LTF,
}
#define RTN
#define RBN
#define LTN
#define LTF
#define LBF
#define LBN
#define RBF

Definition at line 522 of file mball_tessellate.c.

Referenced by docube(), makecubetable(), and p_rectangle_area().

◆ corner2

int corner2[12]
static
Initial value:
= {
LBF,
LTF,
LTN,
LTF,
RBF,
RTF,
RTN,
RTF,
RBN,
RBF,
RTN,
RTF,
}
#define RTF

Definition at line 536 of file mball_tessellate.c.

Referenced by docube(), makecubetable(), and p_rectangle_area().

◆ cubetable

INTLISTS* cubetable[256]
static

Definition at line 518 of file mball_tessellate.c.

Referenced by BKE_mball_cubeTable_free(), docube(), and makecubetable().

◆ faces

char faces[256]
static

Definition at line 519 of file mball_tessellate.c.

Referenced by bevel_build_edge_polygons(), bevel_rebuild_existing_polygons(), BKE_mesh_validate_arrays(), BKE_pbvh_get_grid_updates(), BKE_pbvh_update_normals(), bm_face_array_calc_bounds(), bm_face_array_calc_unique_uv_coords(), bm_face_array_uv_rotate_fit_aabb(), bm_face_array_uv_scale_y(), bm_face_array_visit(), BM_faces_join(), BM_faces_join_pair(), bm_log_face_values_swap(), bm_log_faces_restore(), bm_log_faces_unmake(), BM_mesh_calc_edge_groups_as_arrays(), bm_mesh_calc_tessellation_with_partial__multi_threaded(), bm_mesh_calc_tessellation_with_partial__single_threaded(), bm_mesh_calc_uv_islands(), BM_mesh_intersect(), BM_mesh_normals_update_with_partial_ex(), bm_uuidwalk_rehash_facelinks(), BM_vert_collapse_faces(), bmo_connect_verts_exec(), bmo_create_cube_exec(), bmo_dissolve_faces_exec(), bmo_recalc_face_normals_array(), ccgSubSurf__allFaces(), ccgSubSurf__effectedFaceNeighbors(), docube(), ED_uvedit_pack_islands_multi(), ED_uvedit_selected_faces(), edbm_select_similar_region_exec(), Freestyle::WFillGrid::fillGrid(), Freestyle::WSFillGrid::fillGrid(), blender::io::obj::fixup_invalid_polygon(), get_selected_indices(), knife_find_line_hits(), makecubetable(), mesh_separate_arrays(), MOD_solidify_nonmanifold_modifyMesh(), multires_stitch_grids(), partialvis_update_bmesh(), partialvis_update_bmesh_faces(), pbvh_faces_node_nearest_to_ray(), pbvh_faces_node_raycast(), pbvh_update_normals_accum_task_cb(), QFLOW_quadriflow_remesh(), recalc_face_normals_find_index(), sculpt_undo_bmesh_push(), btConvexHullInternal::shrink(), subdiv_ccg_average_inner_grids_task(), subdiv_ccg_coord_to_ptex_coord(), subdiv_ccg_eval_regular_grid(), subdiv_ccg_eval_special_grid(), subdiv_ccg_init_faces_edge_neighborhood(), subdiv_ccg_init_faces_vertex_neighborhood(), subdiv_ccg_recalc_modified_inner_normal_task(), and blender::meshintersect::CDTArrangement< Arith_t >::~CDTArrangement().

◆ leftface

int leftface[12]
static
Initial value:
= {
B,
L,
L,
F,
R,
T,
N,
R,
N,
B,
T,
F,
}
#define N
#define T
#define B
#define F
#define R
#define L

Definition at line 550 of file mball_tessellate.c.

Referenced by makecubetable(), and otherface().

◆ rightface

int rightface[12]
static
Initial value:
= {
L,
T,
N,
L,
B,
R,
R,
F,
B,
F,
N,
T,
}

Definition at line 565 of file mball_tessellate.c.

Referenced by makecubetable(), and otherface().