[Bf-blender-cvs] [7a60a31] temp-mball-refactor: BKE_mball: split tessellation into its own file

Campbell Barton noreply at git.blender.org
Thu Feb 26 04:51:35 CET 2015


Commit: 7a60a311b33507e048fb47b62e4ba24b51ad883d
Author: Campbell Barton
Date:   Thu Feb 26 14:39:57 2015 +1100
Branches: temp-mball-refactor
https://developer.blender.org/rB7a60a311b33507e048fb47b62e4ba24b51ad883d

BKE_mball: split tessellation into its own file

this has a lot of its own local structs, functions,
better to keep isolated from general metaball selection/library logic.

===================================================================

A	source/blender/blenkernel/BKE_mball_tessellate.h
M	source/blender/blenkernel/CMakeLists.txt
M	source/blender/blenkernel/intern/mball.c
A	source/blender/blenkernel/intern/mball_tessellate.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_mball_tessellate.h b/source/blender/blenkernel/BKE_mball_tessellate.h
new file mode 100644
index 0000000..e69de29
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index b3469ce..9faa3ed 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -119,6 +119,7 @@ set(SRC
 	intern/mask_rasterize.c
 	intern/material.c
 	intern/mball.c
+	intern/mball_tessellate.c
 	intern/mesh.c
 	intern/mesh_evaluate.c
 	intern/mesh_mapping.c
@@ -233,6 +234,7 @@ set(SRC
 	BKE_mask.h
 	BKE_material.h
 	BKE_mball.h
+	BKE_mball_tessellate.h
 	BKE_mesh.h
 	BKE_mesh_mapping.h
 	BKE_mesh_remap.h
diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c
index ce20636..efc5b23 100644
--- a/source/blender/blenkernel/intern/mball.c
+++ b/source/blender/blenkernel/intern/mball.c
@@ -65,119 +65,6 @@
 #include "BKE_object.h"
 #include "BKE_material.h"
 
-/* Data types */
-
-typedef struct vertex {         /* surface vertex */
-	float co[3];  /* position and surface normal */
-	float no[3];
-} VERTEX;
-
-typedef struct vertices {       /* list of vertices in polygonization */
-	int count, max;             /* # vertices, max # allowed */
-	VERTEX *ptr;                /* dynamically allocated */
-} VERTICES;
-
-typedef struct corner {         /* corner of a cube */
-	int i, j, k;                /* (i, j, k) is index within lattice */
-	float co[3], value;       /* location and function value */
-	struct corner *next;
-} CORNER;
-
-typedef struct cube {           /* partitioning cell (cube) */
-	int i, j, k;                /* lattice location of cube */
-	CORNER *corners[8];         /* eight corners */
-} CUBE;
-
-typedef struct cubes {          /* linked list of cubes acting as stack */
-	CUBE cube;                  /* a single cube */
-	struct cubes *next;         /* remaining elements */
-} CUBES;
-
-typedef struct centerlist {     /* list of cube locations */
-	int i, j, k;                /* cube location */
-	struct centerlist *next;    /* remaining elements */
-} CENTERLIST;
-
-typedef struct edgelist {       /* list of edges */
-	int i1, j1, k1, i2, j2, k2; /* edge corner ids */
-	int vid;                    /* vertex id */
-	struct edgelist *next;      /* remaining elements */
-} EDGELIST;
-
-typedef struct intlist {        /* list of integers */
-	int i;                      /* an integer */
-	struct intlist *next;       /* remaining elements */
-} INTLIST;
-
-typedef struct intlists {       /* list of list of integers */
-	INTLIST *list;              /* a list of integers */
-	struct intlists *next;      /* remaining elements */
-} INTLISTS;
-
-/* dividing scene using octal tree makes polygonisation faster */
-typedef struct ml_pointer {
-	struct ml_pointer *next, *prev;
-	struct MetaElem *ml;
-} ml_pointer;
-
-typedef struct octal_node {
-	struct octal_node *nodes[8];/* children of current node */
-	struct octal_node *parent;  /* parent of current node */
-	struct ListBase elems;      /* ListBase of MetaElem pointers (ml_pointer) */
-	float x_min, y_min, z_min;  /* 1st border point */
-	float x_max, y_max, z_max;  /* 7th border point */
-	float x, y, z;              /* center of node */
-	int pos, neg;               /* number of positive and negative MetaElements in the node */
-	int count;                  /* number of MetaElems, which belongs to the node */
-} octal_node;
-
-typedef struct octal_tree {
-	struct octal_node *first;   /* first node */
-	int pos, neg;               /* number of positive and negative MetaElements in the scene */
-	short depth;                /* number of scene subdivision */
-} octal_tree;
-
-struct pgn_elements {
-	struct pgn_elements *next, *prev;
-	char *data;
-};
-
-typedef struct process {        /* parameters, function, storage */
-	/* ** old G_mb contents ** */
-	float thresh;
-	int totelem;
-	MetaElem **mainb;
-	octal_tree *metaball_tree;
-
-	/* ** old process contents ** */
-
-	/* what happens here? floats, I think. */
-	/*  float (*function)(void);	 */	/* implicit surface function */
-	float (*function)(struct process *, float, float, float);
-	float size, delta;          /* cube size, normal delta */
-	int bounds;                 /* cube range within lattice */
-	CUBES *cubes;               /* active cubes */
-	VERTICES vertices;          /* surface vertices */
-	CENTERLIST **centers;       /* cube center hash table */
-	CORNER **corners;           /* corner value hash table */
-	EDGELIST **edges;           /* edge and vertex id hash table */
-
-	/* Runtime things */
-	int *indices;
-	int totindex, curindex;
-
-	int pgn_offset;
-	struct pgn_elements *pgn_current;
-	ListBase pgn_list;
-} PROCESS;
-
-/* Forward declarations */
-static int vertid(PROCESS *process, const CORNER *c1, const CORNER *c2, MetaBall *mb);
-static int setcenter(PROCESS *process, CENTERLIST *table[], const int i, const int j, const int k);
-static CORNER *setcorner(PROCESS *process, int i, int j, int k);
-static void converge(PROCESS *process, const float p1[3], const float p2[3], float v1, float v2,
-                     float p[3], MetaBall *mb, int f);
-
 /* Functions */
 
 void BKE_mball_unlink(MetaBall *mb)
@@ -558,1817 +445,6 @@ Object *BKE_mball_basis_find(Scene *scene, Object *basis)
 	return basis;
 }
 
-
-/* ******************** ARITH ************************* */
-
-/* BASED AT CODE (but mostly rewritten) :
- * C code from the article
- * "An Implicit Surface Polygonizer"
- * by Jules Bloomenthal, jbloom at beauty.gmu.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. */
-
-#define RES 12 /* # converge iterations    */
-
-#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     */
-
-/* the LBN corner of cube (i, j, k), corresponds with location
- * (i-0.5)*size, (j-0.5)*size, (k-0.5)*size) */
-
-#define HASHBIT     (5)
-#define HASHSIZE    (size_t)(1 << (3 * HASHBIT))   /*! < hash table size (32768) */
-
-#define HASH(i, j, k) ((((( (i) & 31) << 5) | ( (j) & 31)) << 5) | ( (k) & 31) )
-
-#define MB_BIT(i, bit) (((i) >> (bit)) & 1)
-#define FLIP(i, bit) ((i) ^ 1 << (bit)) /* flip the given bit of i */
-
-
-/* **************** POLYGONIZATION ************************ */
-
-static void calc_mballco(MetaElem *ml, float vec[3])
-{
-	if (ml->mat) {
-		mul_m4_v3((float (*)[4])ml->mat, vec);
-	}
-}
-
-static float densfunc(MetaElem *ball, float x, float y, float z)
-{
-	float dist2;
-	float dvec[3] = {x, y, z};
-
-	mul_m4_v3((float (*)[4])ball->imat, dvec);
-
-	switch (ball->type) {
-		case MB_BALL:
-			/* do nothing */
-			break;
-		case MB_TUBE:
-			if      (dvec[0] >  ball->expx) dvec[0] -= ball->expx;
-			else if (dvec[0] < -ball->expx) dvec[0] += ball->expx;
-			else                            dvec[0] = 0.0;
-			break;
-		case MB_PLANE:
-			if      (dvec[0] >  ball->expx) dvec[0] -= ball->expx;
-			else if (dvec[0] < -ball->expx) dvec[0] += ball->expx;
-			else                            dvec[0] = 0.0;
-			if      (dvec[1] >  ball->expy) dvec[1] -= ball->expy;
-			else if (dvec[1] < -ball->expy) dvec[1] += ball->expy;
-			else                            dvec[1] = 0.0;
-			break;
-		case MB_ELIPSOID:
-			dvec[0] /= ball->expx;
-			dvec[1] /= ball->expy;
-			dvec[2] /= ball->expz;
-			break;
-		case MB_CUBE:
-			if      (dvec[0] >  ball->expx) dvec[0] -= ball->expx;
-			else if (dvec[0] < -ball->expx) dvec[0] += ball->expx;
-			else                            dvec[0] = 0.0;
-
-			if      (dvec[1] >  ball->expy) dvec[1] -= ball->expy;
-			else if (dvec[1] < -ball->expy) dvec[1] += ball->expy;
-			else                            dvec[1] = 0.0;
-
-			if      (dvec[2] >  ball->expz) dvec[2] -= ball->expz;
-			else if (dvec[2] < -ball->expz) dvec[2] += ball->expz;
-			else                            dvec[2] = 0.0;
-			break;
-
-		/* *** deprecated, could be removed?, do-versioned at least *** */
-		case MB_TUBEX:
-			if      (dvec[0] >  ball->len) dvec[0] -= ball->len;
-			else if (dvec[0] < -ball->len) dvec[0] += ball->len;
-			else                           dvec[0] = 0.0;
-			break;
-		case MB_TUBEY:
-			if      (dvec[1] >  ball->len) dvec[1] -= ball->len;
-			else if (dvec[1] < -ball->len) dvec[1] += ball->len;
-			else                           dvec[1] = 0.0;
-			break;
-		case MB_TUBEZ:
-			if      (dvec[2] >  ball->len) dvec[2] -= ball->len;
-			else if (dvec[2] < -ball->len) dvec[2] += ball->len;
-			else                           dvec[2] = 0.0;
-			break;
-		/* *** end deprecated *** */
-	}
-
-	dist2 = 1.0f - (len_squared_v3(dvec) / ball->rad2);
-
-	if ((ball->flag & MB_NEGATIVE) == 0) {
-		return (dist2 < 0.0f) ? -0.5f : (ball->s * dist2 * dist2 * dist2) - 0.5f;
-	}
-	else {
-		return (dist2 < 0.0f) ? 0.5f : 0.5f - (ball->s * dist2 * dist2 * dist2);
-	}
-}
-
-static octal_node *find_metaball_octal_node(octal_node *node, float x, float y, float z, short depth)
-{
-	if (!depth) return node;
-	
-	if (z < node->z) {
-		if (y < node->y) {
-			if (x < node->x) {
-				if (node->nodes[0])
-					return find_metaball_octal_node(node->nodes[0], x, y, z, depth--);
-				else
-					return node;
-			}
-			else {
-				if (node->nodes[1])
-					return find_metaball_octal_node(node->nodes[1], x, y, z, depth--);
-				else
-					return node;
-			}
-		}
-		else {
-			if (x < node->x) {
-				if (node->nodes[3])
-					return find_metaball_octal_node(node->nodes[3], x, y

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list