style cleanup: whitespace, bli & makesdna
This commit is contained in:
@@ -49,7 +49,7 @@ typedef struct bArgDoc {
|
||||
const char *short_arg;
|
||||
const char *long_arg;
|
||||
const char *documentation;
|
||||
int done;
|
||||
int done;
|
||||
} bArgDoc;
|
||||
|
||||
typedef struct bAKey {
|
||||
@@ -68,24 +68,24 @@ typedef struct bArgument {
|
||||
struct bArgs {
|
||||
ListBase docs;
|
||||
GHash *items;
|
||||
int argc;
|
||||
int argc;
|
||||
const char **argv;
|
||||
int *passes;
|
||||
int *passes;
|
||||
};
|
||||
|
||||
static unsigned int case_strhash(const void *ptr)
|
||||
{
|
||||
const char *s= ptr;
|
||||
unsigned int i= 0;
|
||||
const char *s = ptr;
|
||||
unsigned int i = 0;
|
||||
unsigned char c;
|
||||
|
||||
while ( (c= tolower(*s++)) )
|
||||
i= i*37 + c;
|
||||
while ( (c = tolower(*s++)) )
|
||||
i = i * 37 + c;
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
static unsigned int keyhash(const void *ptr)
|
||||
static unsigned int keyhash(const void *ptr)
|
||||
{
|
||||
const bAKey *k = ptr;
|
||||
return case_strhash(k->arg); // ^ BLI_ghashutil_inthash((void*)k->pass);
|
||||
@@ -102,7 +102,7 @@ static int keycmp(const void *a, const void *b)
|
||||
return strcmp(ka->arg, kb->arg);
|
||||
}
|
||||
else {
|
||||
return BLI_ghashutil_intcmp((const void*)ka->pass, (const void*)kb->pass);
|
||||
return BLI_ghashutil_intcmp((const void *)ka->pass, (const void *)kb->pass);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -182,8 +182,8 @@ static void internalAdd(struct bArgs *ba, const char *arg, int pass, int case_st
|
||||
|
||||
if (a) {
|
||||
printf("WARNING: conflicting argument\n");
|
||||
printf("\ttrying to add '%s' on pass %i, %scase sensitive\n", arg, pass, case_str == 1? "not ": "");
|
||||
printf("\tconflict with '%s' on pass %i, %scase sensitive\n\n", a->key->arg, (int)a->key->pass, a->key->case_str == 1? "not ": "");
|
||||
printf("\ttrying to add '%s' on pass %i, %scase sensitive\n", arg, pass, case_str == 1 ? "not " : "");
|
||||
printf("\tconflict with '%s' on pass %i, %scase sensitive\n\n", a->key->arg, (int)a->key->pass, a->key->case_str == 1 ? "not " : "");
|
||||
}
|
||||
|
||||
a = MEM_callocN(sizeof(bArgument), "bArgument");
|
||||
@@ -259,9 +259,9 @@ void BLI_argsParse(struct bArgs *ba, int pass, BA_ArgCallback default_cb, void *
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
for ( i = 1; i < ba->argc; i++) { /* skip argv[0] */
|
||||
for (i = 1; i < ba->argc; i++) { /* skip argv[0] */
|
||||
if (ba->passes[i] == 0) {
|
||||
/* -1 signal what side of the comparison it is */
|
||||
/* -1 signal what side of the comparison it is */
|
||||
bArgument *a = lookUp(ba, ba->argv[i], pass, -1);
|
||||
BA_ArgCallback func = NULL;
|
||||
void *data = NULL;
|
||||
|
||||
@@ -46,9 +46,9 @@
|
||||
|
||||
#ifndef va_copy
|
||||
# ifdef __va_copy
|
||||
# define va_copy(a,b) __va_copy(a,b)
|
||||
# define va_copy(a, b) __va_copy(a, b)
|
||||
# else /* !__va_copy */
|
||||
# define va_copy(a,b) ((a)=(b))
|
||||
# define va_copy(a, b) ((a) = (b))
|
||||
# endif /* __va_copy */
|
||||
#endif /* va_copy */
|
||||
|
||||
@@ -70,65 +70,65 @@ struct DynStr {
|
||||
|
||||
DynStr *BLI_dynstr_new(void)
|
||||
{
|
||||
DynStr *ds= MEM_mallocN(sizeof(*ds), "DynStr");
|
||||
ds->elems= ds->last= NULL;
|
||||
ds->curlen= 0;
|
||||
DynStr *ds = MEM_mallocN(sizeof(*ds), "DynStr");
|
||||
ds->elems = ds->last = NULL;
|
||||
ds->curlen = 0;
|
||||
|
||||
return ds;
|
||||
}
|
||||
|
||||
void BLI_dynstr_append(DynStr *ds, const char *cstr)
|
||||
{
|
||||
DynStrElem *dse= malloc(sizeof(*dse));
|
||||
int cstrlen= strlen(cstr);
|
||||
DynStrElem *dse = malloc(sizeof(*dse));
|
||||
int cstrlen = strlen(cstr);
|
||||
|
||||
dse->str= malloc(cstrlen+1);
|
||||
memcpy(dse->str, cstr, cstrlen+1);
|
||||
dse->next= NULL;
|
||||
dse->str = malloc(cstrlen + 1);
|
||||
memcpy(dse->str, cstr, cstrlen + 1);
|
||||
dse->next = NULL;
|
||||
|
||||
if (!ds->last)
|
||||
ds->last= ds->elems= dse;
|
||||
ds->last = ds->elems = dse;
|
||||
else
|
||||
ds->last= ds->last->next= dse;
|
||||
ds->last = ds->last->next = dse;
|
||||
|
||||
ds->curlen+= cstrlen;
|
||||
ds->curlen += cstrlen;
|
||||
}
|
||||
|
||||
void BLI_dynstr_nappend(DynStr *ds, const char *cstr, int len)
|
||||
{
|
||||
DynStrElem *dse= malloc(sizeof(*dse));
|
||||
int cstrlen= BLI_strnlen(cstr, len);
|
||||
DynStrElem *dse = malloc(sizeof(*dse));
|
||||
int cstrlen = BLI_strnlen(cstr, len);
|
||||
|
||||
dse->str= malloc(cstrlen+1);
|
||||
dse->str = malloc(cstrlen + 1);
|
||||
memcpy(dse->str, cstr, cstrlen);
|
||||
dse->str[cstrlen] = '\0';
|
||||
dse->next= NULL;
|
||||
dse->next = NULL;
|
||||
|
||||
if (!ds->last)
|
||||
ds->last= ds->elems= dse;
|
||||
ds->last = ds->elems = dse;
|
||||
else
|
||||
ds->last= ds->last->next= dse;
|
||||
ds->last = ds->last->next = dse;
|
||||
|
||||
ds->curlen+= cstrlen;
|
||||
ds->curlen += cstrlen;
|
||||
}
|
||||
|
||||
void BLI_dynstr_vappendf(DynStr *ds, const char *format, va_list args)
|
||||
{
|
||||
char *message, fixedmessage[256];
|
||||
int len= sizeof(fixedmessage);
|
||||
const int maxlen= 65536;
|
||||
int len = sizeof(fixedmessage);
|
||||
const int maxlen = 65536;
|
||||
int retval;
|
||||
|
||||
while (1) {
|
||||
va_list args_cpy;
|
||||
if (len == sizeof(fixedmessage))
|
||||
message= fixedmessage;
|
||||
message = fixedmessage;
|
||||
else
|
||||
message= MEM_callocN(sizeof(char) * len, "BLI_dynstr_appendf");
|
||||
message = MEM_callocN(sizeof(char) * len, "BLI_dynstr_appendf");
|
||||
|
||||
/* cant reuse the same args, so work on a copy */
|
||||
va_copy(args_cpy, args);
|
||||
retval= vsnprintf(message, len, format, args_cpy);
|
||||
retval = vsnprintf(message, len, format, args_cpy);
|
||||
va_end(args_cpy);
|
||||
|
||||
if (retval == -1) {
|
||||
@@ -136,7 +136,7 @@ void BLI_dynstr_vappendf(DynStr *ds, const char *format, va_list args)
|
||||
* there is a formatting error, so we impose a maximum length */
|
||||
if (message != fixedmessage)
|
||||
MEM_freeN(message);
|
||||
message= NULL;
|
||||
message = NULL;
|
||||
|
||||
len *= 2;
|
||||
if (len > maxlen) {
|
||||
@@ -148,10 +148,10 @@ void BLI_dynstr_vappendf(DynStr *ds, const char *format, va_list args)
|
||||
/* in C99 the actual length required is returned */
|
||||
if (message != fixedmessage)
|
||||
MEM_freeN(message);
|
||||
message= NULL;
|
||||
message = NULL;
|
||||
|
||||
/* retval doesn't include \0 terminator */
|
||||
len= retval + 1;
|
||||
len = retval + 1;
|
||||
}
|
||||
else
|
||||
break;
|
||||
@@ -169,8 +169,8 @@ void BLI_dynstr_appendf(DynStr *ds, const char *format, ...)
|
||||
{
|
||||
va_list args;
|
||||
char *message, fixedmessage[256];
|
||||
int len= sizeof(fixedmessage);
|
||||
const int maxlen= 65536;
|
||||
int len = sizeof(fixedmessage);
|
||||
const int maxlen = 65536;
|
||||
int retval;
|
||||
|
||||
/* note that it's tempting to just call BLI_dynstr_vappendf here
|
||||
@@ -179,12 +179,12 @@ void BLI_dynstr_appendf(DynStr *ds, const char *format, ...)
|
||||
|
||||
while (1) {
|
||||
if (len == sizeof(fixedmessage))
|
||||
message= fixedmessage;
|
||||
message = fixedmessage;
|
||||
else
|
||||
message= MEM_callocN(sizeof(char)*(len), "BLI_dynstr_appendf");
|
||||
message = MEM_callocN(sizeof(char) * (len), "BLI_dynstr_appendf");
|
||||
|
||||
va_start(args, format);
|
||||
retval= vsnprintf(message, len, format, args);
|
||||
retval = vsnprintf(message, len, format, args);
|
||||
va_end(args);
|
||||
|
||||
if (retval == -1) {
|
||||
@@ -192,7 +192,7 @@ void BLI_dynstr_appendf(DynStr *ds, const char *format, ...)
|
||||
* there is a formatting error, so we impose a maximum length */
|
||||
if (message != fixedmessage)
|
||||
MEM_freeN(message);
|
||||
message= NULL;
|
||||
message = NULL;
|
||||
|
||||
len *= 2;
|
||||
if (len > maxlen) {
|
||||
@@ -204,10 +204,10 @@ void BLI_dynstr_appendf(DynStr *ds, const char *format, ...)
|
||||
/* in C99 the actual length required is returned */
|
||||
if (message != fixedmessage)
|
||||
MEM_freeN(message);
|
||||
message= NULL;
|
||||
message = NULL;
|
||||
|
||||
/* retval doesn't include \0 terminator */
|
||||
len= retval + 1;
|
||||
len = retval + 1;
|
||||
}
|
||||
else
|
||||
break;
|
||||
@@ -231,19 +231,19 @@ void BLI_dynstr_get_cstring_ex(DynStr *ds, char *rets)
|
||||
char *s;
|
||||
DynStrElem *dse;
|
||||
|
||||
for (s= rets, dse= ds->elems; dse; dse= dse->next) {
|
||||
int slen= strlen(dse->str);
|
||||
for (s = rets, dse = ds->elems; dse; dse = dse->next) {
|
||||
int slen = strlen(dse->str);
|
||||
|
||||
memcpy(s, dse->str, slen);
|
||||
|
||||
s+= slen;
|
||||
s += slen;
|
||||
}
|
||||
rets[ds->curlen]= '\0';
|
||||
rets[ds->curlen] = '\0';
|
||||
}
|
||||
|
||||
char *BLI_dynstr_get_cstring(DynStr *ds)
|
||||
{
|
||||
char *rets= MEM_mallocN(ds->curlen+1, "dynstr_cstring");
|
||||
char *rets = MEM_mallocN(ds->curlen + 1, "dynstr_cstring");
|
||||
BLI_dynstr_get_cstring_ex(ds, rets);
|
||||
return rets;
|
||||
}
|
||||
@@ -252,13 +252,13 @@ void BLI_dynstr_free(DynStr *ds)
|
||||
{
|
||||
DynStrElem *dse;
|
||||
|
||||
for (dse= ds->elems; dse; ) {
|
||||
DynStrElem *n= dse->next;
|
||||
for (dse = ds->elems; dse; ) {
|
||||
DynStrElem *n = dse->next;
|
||||
|
||||
free(dse->str);
|
||||
free(dse);
|
||||
|
||||
dse= n;
|
||||
dse = n;
|
||||
}
|
||||
|
||||
MEM_freeN(ds);
|
||||
|
||||
@@ -78,7 +78,7 @@ int BLI_ghash_size(GHash *gh)
|
||||
void BLI_ghash_insert(GHash *gh, void *key, void *val)
|
||||
{
|
||||
unsigned int hash = gh->hashfp(key) % gh->nbuckets;
|
||||
Entry *e = (Entry*)BLI_mempool_alloc(gh->entrypool);
|
||||
Entry *e = (Entry *)BLI_mempool_alloc(gh->entrypool);
|
||||
|
||||
e->key = key;
|
||||
e->val = val;
|
||||
@@ -90,11 +90,11 @@ void BLI_ghash_insert(GHash *gh, void *key, void *val)
|
||||
int i, nold = gh->nbuckets;
|
||||
|
||||
gh->nbuckets = hashsizes[++gh->cursize];
|
||||
gh->buckets = (Entry**)MEM_mallocN(gh->nbuckets * sizeof(*gh->buckets), "buckets");
|
||||
gh->buckets = (Entry **)MEM_mallocN(gh->nbuckets * sizeof(*gh->buckets), "buckets");
|
||||
memset(gh->buckets, 0, gh->nbuckets * sizeof(*gh->buckets));
|
||||
|
||||
for (i = 0; i < nold; i++) {
|
||||
for (e = old[i]; e;) {
|
||||
for (e = old[i]; e; ) {
|
||||
Entry *n = e->next;
|
||||
|
||||
hash = gh->hashfp(e->key) % gh->nbuckets;
|
||||
@@ -174,7 +174,7 @@ void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreef
|
||||
for (i = 0; i < gh->nbuckets; i++) {
|
||||
Entry *e;
|
||||
|
||||
for (e = gh->buckets[i]; e;) {
|
||||
for (e = gh->buckets[i]; e; ) {
|
||||
Entry *n = e->next;
|
||||
|
||||
if (keyfreefp) keyfreefp(e->key);
|
||||
@@ -333,6 +333,6 @@ int BLI_ghashutil_paircmp(const void *a, const void *b)
|
||||
|
||||
void BLI_ghashutil_pairfree(void *ptr)
|
||||
{
|
||||
MEM_freeN((void*)ptr);
|
||||
MEM_freeN((void *)ptr);
|
||||
}
|
||||
|
||||
|
||||
@@ -184,7 +184,7 @@ void *BLI_heap_popmin(Heap *heap)
|
||||
if (heap->size == 1)
|
||||
heap->size--;
|
||||
else {
|
||||
HEAP_SWAP(heap, 0, heap->size-1);
|
||||
HEAP_SWAP(heap, 0, heap->size - 1);
|
||||
heap->size--;
|
||||
|
||||
BLI_heap_down(heap, 0);
|
||||
|
||||
@@ -50,59 +50,54 @@
|
||||
#define MAX_TREETYPE 32
|
||||
#define DEFAULT_FIND_NEAREST_HEAP_SIZE 1024
|
||||
|
||||
typedef struct BVHNode
|
||||
{
|
||||
typedef struct BVHNode {
|
||||
struct BVHNode **children;
|
||||
struct BVHNode *parent; // some user defined traversed need that
|
||||
struct BVHNode *skip[2];
|
||||
float *bv; // Bounding volume of all nodes, max 13 axis
|
||||
int index; // face, edge, vertex index
|
||||
char totnode; // how many nodes are used, used for speedup
|
||||
char main_axis; // Axis used to split this node
|
||||
float *bv; /* Bounding volume of all nodes, max 13 axis */
|
||||
int index; /* face, edge, vertex index */
|
||||
char totnode; /* how many nodes are used, used for speedup */
|
||||
char main_axis; /* Axis used to split this node */
|
||||
} BVHNode;
|
||||
|
||||
struct BVHTree
|
||||
{
|
||||
struct BVHTree {
|
||||
BVHNode **nodes;
|
||||
BVHNode *nodearray; /* pre-alloc branch nodes */
|
||||
BVHNode **nodechild; // pre-alloc childs for nodes
|
||||
float *nodebv; // pre-alloc bounding-volumes for nodes
|
||||
float epsilon; /* epslion is used for inflation of the k-dop */
|
||||
int totleaf; // leafs
|
||||
int totbranch;
|
||||
char tree_type; // type of tree (4 => quadtree)
|
||||
char axis; // kdop type (6 => OBB, 7 => AABB, ...)
|
||||
char start_axis, stop_axis; // KDOP_AXES array indices according to axis
|
||||
BVHNode *nodearray; /* pre-alloc branch nodes */
|
||||
BVHNode **nodechild; /* pre-alloc childs for nodes */
|
||||
float *nodebv; /* pre-alloc bounding-volumes for nodes */
|
||||
float epsilon; /* epslion is used for inflation of the k-dop */
|
||||
int totleaf; /* leafs */
|
||||
int totbranch;
|
||||
char tree_type; /* type of tree (4 => quadtree) */
|
||||
char axis; /* kdop type (6 => OBB, 7 => AABB, ...) */
|
||||
char start_axis, stop_axis; /* KDOP_AXES array indices according to axis */
|
||||
};
|
||||
|
||||
typedef struct BVHOverlapData
|
||||
{
|
||||
typedef struct BVHOverlapData {
|
||||
BVHTree *tree1, *tree2;
|
||||
BVHTreeOverlap *overlap;
|
||||
int i, max_overlap; /* i is number of overlaps */
|
||||
int start_axis, stop_axis;
|
||||
} BVHOverlapData;
|
||||
|
||||
typedef struct BVHNearestData
|
||||
{
|
||||
typedef struct BVHNearestData {
|
||||
BVHTree *tree;
|
||||
const float *co;
|
||||
const float *co;
|
||||
BVHTree_NearestPointCallback callback;
|
||||
void *userdata;
|
||||
float proj[13]; //coordinates projection over axis
|
||||
void *userdata;
|
||||
float proj[13]; /* coordinates projection over axis */
|
||||
BVHTreeNearest nearest;
|
||||
|
||||
} BVHNearestData;
|
||||
|
||||
typedef struct BVHRayCastData
|
||||
{
|
||||
typedef struct BVHRayCastData {
|
||||
BVHTree *tree;
|
||||
|
||||
BVHTree_RayCastCallback callback;
|
||||
void *userdata;
|
||||
void *userdata;
|
||||
|
||||
|
||||
BVHTreeRay ray;
|
||||
BVHTreeRay ray;
|
||||
float ray_dot_axis[13];
|
||||
float idot_axis[13];
|
||||
int index[6];
|
||||
@@ -120,55 +115,55 @@ typedef struct BVHRayCastData
|
||||
// Notes: You can choose the tree type --> binary, quad, octree, choose below
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static float KDOP_AXES[13][3] =
|
||||
{ {1.0, 0, 0}, {0, 1.0, 0}, {0, 0, 1.0}, {1.0, 1.0, 1.0}, {1.0, -1.0, 1.0}, {1.0, 1.0, -1.0},
|
||||
{1.0, -1.0, -1.0}, {1.0, 1.0, 0}, {1.0, 0, 1.0}, {0, 1.0, 1.0}, {1.0, -1.0, 0}, {1.0, 0, -1.0},
|
||||
{0, 1.0, -1.0}
|
||||
static float KDOP_AXES[13][3] = {
|
||||
{1.0, 0, 0}, {0, 1.0, 0}, {0, 0, 1.0}, {1.0, 1.0, 1.0}, {1.0, -1.0, 1.0}, {1.0, 1.0, -1.0},
|
||||
{1.0, -1.0, -1.0}, {1.0, 1.0, 0}, {1.0, 0, 1.0}, {0, 1.0, 1.0}, {1.0, -1.0, 0}, {1.0, 0, -1.0},
|
||||
{0, 1.0, -1.0}
|
||||
};
|
||||
|
||||
/*
|
||||
* Generic push and pop heap
|
||||
*/
|
||||
#define PUSH_HEAP_BODY(HEAP_TYPE, PRIORITY, heap, heap_size) \
|
||||
{ \
|
||||
HEAP_TYPE element = heap[heap_size-1]; \
|
||||
int child = heap_size-1; \
|
||||
while (child != 0) \
|
||||
{ \
|
||||
int parent = (child-1) / 2; \
|
||||
if (PRIORITY(element, heap[parent])) \
|
||||
{ \
|
||||
heap[child] = heap[parent]; \
|
||||
child = parent; \
|
||||
} \
|
||||
else break; \
|
||||
} \
|
||||
heap[child] = element; \
|
||||
}
|
||||
#define PUSH_HEAP_BODY(HEAP_TYPE, PRIORITY, heap, heap_size) \
|
||||
{ \
|
||||
HEAP_TYPE element = heap[heap_size - 1]; \
|
||||
int child = heap_size - 1; \
|
||||
while (child != 0) \
|
||||
{ \
|
||||
int parent = (child - 1) / 2; \
|
||||
if (PRIORITY(element, heap[parent])) \
|
||||
{ \
|
||||
heap[child] = heap[parent]; \
|
||||
child = parent; \
|
||||
} \
|
||||
else break; \
|
||||
} \
|
||||
heap[child] = element; \
|
||||
}
|
||||
|
||||
#define POP_HEAP_BODY(HEAP_TYPE, PRIORITY, heap, heap_size) \
|
||||
{ \
|
||||
HEAP_TYPE element = heap[heap_size-1]; \
|
||||
int parent = 0; \
|
||||
while (parent < (heap_size-1)/2 ) \
|
||||
{ \
|
||||
int child2 = (parent+1)*2; \
|
||||
if (PRIORITY(heap[child2-1], heap[child2])) \
|
||||
--child2; \
|
||||
\
|
||||
if (PRIORITY(element, heap[child2])) \
|
||||
break; \
|
||||
\
|
||||
heap[parent] = heap[child2]; \
|
||||
parent = child2; \
|
||||
} \
|
||||
heap[parent] = element; \
|
||||
}
|
||||
#define POP_HEAP_BODY(HEAP_TYPE, PRIORITY, heap, heap_size) \
|
||||
{ \
|
||||
HEAP_TYPE element = heap[heap_size - 1]; \
|
||||
int parent = 0; \
|
||||
while (parent < (heap_size - 1) / 2) \
|
||||
{ \
|
||||
int child2 = (parent + 1) * 2; \
|
||||
if (PRIORITY(heap[child2 - 1], heap[child2])) { \
|
||||
child2--; \
|
||||
} \
|
||||
if (PRIORITY(element, heap[child2])) { \
|
||||
break; \
|
||||
} \
|
||||
heap[parent] = heap[child2]; \
|
||||
parent = child2; \
|
||||
} \
|
||||
heap[parent] = element; \
|
||||
}
|
||||
|
||||
#if 0
|
||||
static int ADJUST_MEMORY(void *local_memblock, void **memblock, int new_size, int *max_size, int size_per_item)
|
||||
{
|
||||
int new_max_size = *max_size * 2;
|
||||
int new_max_size = *max_size * 2;
|
||||
void *new_memblock = NULL;
|
||||
|
||||
if (new_size <= *max_size)
|
||||
@@ -176,11 +171,11 @@ static int ADJUST_MEMORY(void *local_memblock, void **memblock, int new_size, in
|
||||
|
||||
if (*memblock == local_memblock)
|
||||
{
|
||||
new_memblock = malloc( size_per_item * new_max_size );
|
||||
new_memblock = malloc(size_per_item * new_max_size);
|
||||
memcpy(new_memblock, *memblock, size_per_item * *max_size);
|
||||
}
|
||||
else
|
||||
new_memblock = realloc(*memblock, size_per_item * new_max_size );
|
||||
new_memblock = realloc(*memblock, size_per_item * new_max_size);
|
||||
|
||||
if (new_memblock)
|
||||
{
|
||||
@@ -206,7 +201,7 @@ static int ADJUST_MEMORY(void *local_memblock, void **memblock, int new_size, in
|
||||
#if 0
|
||||
static int floor_lg(int a)
|
||||
{
|
||||
return (int)(floor(log(a)/log(2)));
|
||||
return (int)(floor(log(a) / log(2)));
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -217,20 +212,20 @@ static void bvh_insertionsort(BVHNode **a, int lo, int hi, int axis)
|
||||
{
|
||||
int i, j;
|
||||
BVHNode *t;
|
||||
for (i=lo; i < hi; i++) {
|
||||
j=i;
|
||||
for (i = lo; i < hi; i++) {
|
||||
j = i;
|
||||
t = a[i];
|
||||
while ((j!=lo) && (t->bv[axis] < (a[j-1])->bv[axis])) {
|
||||
a[j] = a[j-1];
|
||||
while ((j != lo) && (t->bv[axis] < (a[j - 1])->bv[axis])) {
|
||||
a[j] = a[j - 1];
|
||||
j--;
|
||||
}
|
||||
a[j] = t;
|
||||
}
|
||||
}
|
||||
|
||||
static int bvh_partition(BVHNode **a, int lo, int hi, BVHNode * x, int axis)
|
||||
static int bvh_partition(BVHNode **a, int lo, int hi, BVHNode *x, int axis)
|
||||
{
|
||||
int i=lo, j=hi;
|
||||
int i = lo, j = hi;
|
||||
while (1) {
|
||||
while ((a[i])->bv[axis] < x->bv[axis]) i++;
|
||||
j--;
|
||||
@@ -248,33 +243,33 @@ static int bvh_partition(BVHNode **a, int lo, int hi, BVHNode * x, int axis)
|
||||
#if 0
|
||||
static void bvh_downheap(BVHNode **a, int i, int n, int lo, int axis)
|
||||
{
|
||||
BVHNode * d = a[lo+i-1];
|
||||
BVHNode *d = a[lo + i - 1];
|
||||
int child;
|
||||
while (i<=n/2)
|
||||
while (i <= n / 2)
|
||||
{
|
||||
child = 2*i;
|
||||
if ((child < n) && ((a[lo+child-1])->bv[axis] < (a[lo+child])->bv[axis]))
|
||||
child = 2 * i;
|
||||
if ((child < n) && ((a[lo + child - 1])->bv[axis] < (a[lo + child])->bv[axis]))
|
||||
{
|
||||
child++;
|
||||
}
|
||||
if (!(d->bv[axis] < (a[lo+child-1])->bv[axis])) break;
|
||||
a[lo+i-1] = a[lo+child-1];
|
||||
if (!(d->bv[axis] < (a[lo + child - 1])->bv[axis])) break;
|
||||
a[lo + i - 1] = a[lo + child - 1];
|
||||
i = child;
|
||||
}
|
||||
a[lo+i-1] = d;
|
||||
a[lo + i - 1] = d;
|
||||
}
|
||||
|
||||
static void bvh_heapsort(BVHNode **a, int lo, int hi, int axis)
|
||||
{
|
||||
int n = hi-lo, i;
|
||||
for (i=n/2; i>=1; i=i-1)
|
||||
int n = hi - lo, i;
|
||||
for (i = n / 2; i >= 1; i = i - 1)
|
||||
{
|
||||
bvh_downheap(a, i, n, lo, axis);
|
||||
}
|
||||
for (i=n; i>1; i=i-1)
|
||||
for (i = n; i > 1; i = i - 1)
|
||||
{
|
||||
SWAP(BVHNode*, a[lo], a[lo+i-1]);
|
||||
bvh_downheap(a, 1, i-1, lo, axis);
|
||||
SWAP(BVHNode *, a[lo], a[lo + i - 1]);
|
||||
bvh_downheap(a, 1, i - 1, lo, axis);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -307,21 +302,21 @@ static BVHNode *bvh_medianof3(BVHNode **a, int lo, int mid, int hi, int axis) //
|
||||
/*
|
||||
* Quicksort algorithm modified for Introsort
|
||||
*/
|
||||
static void bvh_introsort_loop (BVHNode **a, int lo, int hi, int depth_limit, int axis)
|
||||
static void bvh_introsort_loop(BVHNode **a, int lo, int hi, int depth_limit, int axis)
|
||||
{
|
||||
int p;
|
||||
|
||||
while (hi-lo > size_threshold)
|
||||
while (hi - lo > size_threshold)
|
||||
{
|
||||
if (depth_limit == 0)
|
||||
{
|
||||
bvh_heapsort(a, lo, hi, axis);
|
||||
return;
|
||||
}
|
||||
depth_limit=depth_limit-1;
|
||||
p=bvh_partition(a, lo, hi, bvh_medianof3(a, lo, lo+((hi-lo)/2)+1, hi-1, axis), axis);
|
||||
depth_limit = depth_limit - 1;
|
||||
p = bvh_partition(a, lo, hi, bvh_medianof3(a, lo, lo + ((hi - lo) / 2) + 1, hi - 1, axis), axis);
|
||||
bvh_introsort_loop(a, p, hi, depth_limit, axis);
|
||||
hi=p;
|
||||
hi = p;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -329,8 +324,8 @@ static void sort(BVHNode **a0, int begin, int end, int axis)
|
||||
{
|
||||
if (begin < end)
|
||||
{
|
||||
BVHNode **a=a0;
|
||||
bvh_introsort_loop(a, begin, end, 2*floor_lg(end-begin), axis);
|
||||
BVHNode **a = a0;
|
||||
bvh_introsort_loop(a, begin, end, 2 * floor_lg(end - begin), axis);
|
||||
bvh_insertionsort(a, begin, end, axis);
|
||||
}
|
||||
}
|
||||
@@ -347,8 +342,8 @@ static void sort_along_axis(BVHTree *tree, int start, int end, int axis)
|
||||
static int partition_nth_element(BVHNode **a, int _begin, int _end, int n, int axis)
|
||||
{
|
||||
int begin = _begin, end = _end, cut;
|
||||
while (end-begin > 3) {
|
||||
cut = bvh_partition(a, begin, end, bvh_medianof3(a, begin, (begin+end)/2, end-1, axis), axis );
|
||||
while (end - begin > 3) {
|
||||
cut = bvh_partition(a, begin, end, bvh_medianof3(a, begin, (begin + end) / 2, end - 1, axis), axis);
|
||||
if (cut <= n)
|
||||
begin = cut;
|
||||
else
|
||||
@@ -368,7 +363,7 @@ static void build_skip_links(BVHTree *tree, BVHNode *node, BVHNode *left, BVHNod
|
||||
node->skip[1] = right;
|
||||
|
||||
for (i = 0; i < node->totnode; i++) {
|
||||
if (i+1 < node->totnode)
|
||||
if (i + 1 < node->totnode)
|
||||
build_skip_links(tree, node->children[i], left, node->children[i + 1]);
|
||||
else
|
||||
build_skip_links(tree, node->children[i], left, right);
|
||||
@@ -415,8 +410,8 @@ static void refit_kdop_hull(BVHTree *tree, BVHNode *node, int start, int end)
|
||||
|
||||
|
||||
for (i = tree->start_axis; i < tree->stop_axis; i++) {
|
||||
bv[2*i] = FLT_MAX;
|
||||
bv[2*i + 1] = -FLT_MAX;
|
||||
bv[2 * i] = FLT_MAX;
|
||||
bv[2 * i + 1] = -FLT_MAX;
|
||||
}
|
||||
|
||||
for (j = start; j < end; j++) {
|
||||
@@ -445,15 +440,15 @@ static char get_largest_axis(float *bv)
|
||||
middle_point[2] = (bv[5]) - (bv[4]); // z axis
|
||||
if (middle_point[0] > middle_point[1]) {
|
||||
if (middle_point[0] > middle_point[2])
|
||||
return 1; // max x axis
|
||||
return 1; // max x axis
|
||||
else
|
||||
return 5; // max z axis
|
||||
return 5; // max z axis
|
||||
}
|
||||
else {
|
||||
if (middle_point[1] > middle_point[2])
|
||||
return 3; // max y axis
|
||||
return 3; // max y axis
|
||||
else
|
||||
return 5; // max z axis
|
||||
return 5; // max z axis
|
||||
}
|
||||
}
|
||||
|
||||
@@ -464,8 +459,8 @@ static void node_join(BVHTree *tree, BVHNode *node)
|
||||
int i, j;
|
||||
|
||||
for (i = tree->start_axis; i < tree->stop_axis; i++) {
|
||||
node->bv[2*i] = FLT_MAX;
|
||||
node->bv[2*i + 1] = -FLT_MAX;
|
||||
node->bv[2 * i] = FLT_MAX;
|
||||
node->bv[2 * i + 1] = -FLT_MAX;
|
||||
}
|
||||
|
||||
for (i = 0; i < tree->tree_type; i++) {
|
||||
@@ -492,15 +487,15 @@ static void node_join(BVHTree *tree, BVHNode *node)
|
||||
static void bvhtree_print_tree(BVHTree *tree, BVHNode *node, int depth)
|
||||
{
|
||||
int i;
|
||||
for (i=0; i<depth; i++) printf(" ");
|
||||
for (i = 0; i < depth; i++) printf(" ");
|
||||
printf(" - %d (%ld): ", node->index, node - tree->nodearray);
|
||||
for (i=2*tree->start_axis; i<2*tree->stop_axis; i++)
|
||||
for (i = 2 * tree->start_axis; i < 2 * tree->stop_axis; i++)
|
||||
printf("%.3f ", node->bv[i]);
|
||||
printf("\n");
|
||||
|
||||
for (i=0; i<tree->tree_type; i++)
|
||||
for (i = 0; i < tree->tree_type; i++)
|
||||
if (node->children[i])
|
||||
bvhtree_print_tree(tree, node->children[i], depth+1);
|
||||
bvhtree_print_tree(tree, node->children[i], depth + 1);
|
||||
}
|
||||
|
||||
static void bvhtree_info(BVHTree *tree)
|
||||
@@ -508,15 +503,14 @@ static void bvhtree_info(BVHTree *tree)
|
||||
printf("BVHTree info\n");
|
||||
printf("tree_type = %d, axis = %d, epsilon = %f\n", tree->tree_type, tree->axis, tree->epsilon);
|
||||
printf("nodes = %d, branches = %d, leafs = %d\n", tree->totbranch + tree->totleaf, tree->totbranch, tree->totleaf);
|
||||
printf("Memory per node = %ldbytes\n", sizeof(BVHNode) + sizeof(BVHNode*)*tree->tree_type + sizeof(float)*tree->axis);
|
||||
printf("Memory per node = %ldbytes\n", sizeof(BVHNode) + sizeof(BVHNode *) * tree->tree_type + sizeof(float) * tree->axis);
|
||||
printf("BV memory = %dbytes\n", MEM_allocN_len(tree->nodebv));
|
||||
|
||||
printf("Total memory = %ldbytes\n", sizeof(BVHTree)
|
||||
+ MEM_allocN_len(tree->nodes)
|
||||
+ MEM_allocN_len(tree->nodearray)
|
||||
+ MEM_allocN_len(tree->nodechild)
|
||||
+ MEM_allocN_len(tree->nodebv)
|
||||
);
|
||||
printf("Total memory = %ldbytes\n", sizeof(BVHTree) +
|
||||
MEM_allocN_len(tree->nodes) +
|
||||
MEM_allocN_len(tree->nodearray) +
|
||||
MEM_allocN_len(tree->nodechild) +
|
||||
MEM_allocN_len(tree->nodebv));
|
||||
|
||||
// bvhtree_print_tree(tree, tree->nodes[tree->totleaf], 0);
|
||||
}
|
||||
@@ -532,10 +526,10 @@ static void verify_tree(BVHTree *tree)
|
||||
// check the pointer list
|
||||
for (i = 0; i < tree->totleaf; i++)
|
||||
{
|
||||
if (tree->nodes[i]->parent == NULL)
|
||||
if (tree->nodes[i]->parent == NULL) {
|
||||
printf("Leaf has no parent: %d\n", i);
|
||||
else
|
||||
{
|
||||
}
|
||||
else {
|
||||
for (j = 0; j < tree->tree_type; j++)
|
||||
{
|
||||
if (tree->nodes[i]->parent->children[j] == tree->nodes[i])
|
||||
@@ -552,10 +546,10 @@ static void verify_tree(BVHTree *tree)
|
||||
// check the leaf list
|
||||
for (i = 0; i < tree->totleaf; i++)
|
||||
{
|
||||
if (tree->nodearray[i].parent == NULL)
|
||||
if (tree->nodearray[i].parent == NULL) {
|
||||
printf("Leaf has no parent: %d\n", i);
|
||||
else
|
||||
{
|
||||
}
|
||||
else {
|
||||
for (j = 0; j < tree->tree_type; j++)
|
||||
{
|
||||
if (tree->nodearray[i].parent->children[j] == &tree->nodearray[i])
|
||||
@@ -575,15 +569,14 @@ static void verify_tree(BVHTree *tree)
|
||||
|
||||
//Helper data and structures to build a min-leaf generalized implicit tree
|
||||
//This code can be easily reduced (basicly this is only method to calculate pow(k, n) in O(1).. and stuff like that)
|
||||
typedef struct BVHBuildHelper
|
||||
{
|
||||
int tree_type; /* */
|
||||
int totleafs; /* */
|
||||
typedef struct BVHBuildHelper {
|
||||
int tree_type; /* */
|
||||
int totleafs; /* */
|
||||
|
||||
int leafs_per_child[32]; /* Min number of leafs that are archievable from a node at depth N */
|
||||
int branches_on_level[32]; /* Number of nodes at depth N (tree_type^N) */
|
||||
int leafs_per_child[32]; /* Min number of leafs that are archievable from a node at depth N */
|
||||
int branches_on_level[32]; /* Number of nodes at depth N (tree_type^N) */
|
||||
|
||||
int remain_leafs; /* Number of leafs that are placed on the level that is not 100% filled */
|
||||
int remain_leafs; /* Number of leafs that are placed on the level that is not 100% filled */
|
||||
|
||||
} BVHBuildHelper;
|
||||
|
||||
@@ -594,7 +587,7 @@ static void build_implicit_tree_helper(BVHTree *tree, BVHBuildHelper *data)
|
||||
int nnodes;
|
||||
|
||||
data->totleafs = tree->totleaf;
|
||||
data->tree_type= tree->tree_type;
|
||||
data->tree_type = tree->tree_type;
|
||||
|
||||
//Calculate the smallest tree_type^n such that tree_type^n >= num_leafs
|
||||
for (data->leafs_per_child[0] = 1;
|
||||
@@ -608,8 +601,8 @@ static void build_implicit_tree_helper(BVHTree *tree, BVHBuildHelper *data)
|
||||
|
||||
//We could stop the loop first (but I am lazy to find out when)
|
||||
for (depth = 1; depth < 32; depth++) {
|
||||
data->branches_on_level[depth] = data->branches_on_level[depth-1] * data->tree_type;
|
||||
data->leafs_per_child [depth] = data->leafs_per_child [depth-1] / data->tree_type;
|
||||
data->branches_on_level[depth] = data->branches_on_level[depth - 1] * data->tree_type;
|
||||
data->leafs_per_child[depth] = data->leafs_per_child[depth - 1] / data->tree_type;
|
||||
}
|
||||
|
||||
remain = data->totleafs - data->leafs_per_child[1];
|
||||
@@ -620,11 +613,11 @@ static void build_implicit_tree_helper(BVHTree *tree, BVHBuildHelper *data)
|
||||
// return the min index of all the leafs archivable with the given branch
|
||||
static int implicit_leafs_index(BVHBuildHelper *data, int depth, int child_index)
|
||||
{
|
||||
int min_leaf_index = child_index * data->leafs_per_child[depth-1];
|
||||
int min_leaf_index = child_index * data->leafs_per_child[depth - 1];
|
||||
if (min_leaf_index <= data->remain_leafs)
|
||||
return min_leaf_index;
|
||||
else if (data->leafs_per_child[depth])
|
||||
return data->totleafs - (data->branches_on_level[depth-1] - child_index) * data->leafs_per_child[depth];
|
||||
return data->totleafs - (data->branches_on_level[depth - 1] - child_index) * data->leafs_per_child[depth];
|
||||
else
|
||||
return data->remain_leafs;
|
||||
}
|
||||
@@ -660,7 +653,7 @@ static int implicit_leafs_index(BVHBuildHelper *data, int depth, int child_index
|
||||
// This functions returns the number of branches needed to have the requested number of leafs.
|
||||
static int implicit_needed_branches(int tree_type, int leafs)
|
||||
{
|
||||
return MAX2(1, (leafs + tree_type - 3) / (tree_type-1) );
|
||||
return MAX2(1, (leafs + tree_type - 3) / (tree_type - 1) );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -678,11 +671,11 @@ static int implicit_needed_branches(int tree_type, int leafs)
|
||||
static void split_leafs(BVHNode **leafs_array, int *nth, int partitions, int split_axis)
|
||||
{
|
||||
int i;
|
||||
for (i=0; i < partitions-1; i++) {
|
||||
for (i = 0; i < partitions - 1; i++) {
|
||||
if (nth[i] >= nth[partitions])
|
||||
break;
|
||||
|
||||
partition_nth_element(leafs_array, nth[i], nth[partitions], nth[i+1], split_axis);
|
||||
partition_nth_element(leafs_array, nth[i], nth[partitions], nth[i + 1], split_axis);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -708,19 +701,19 @@ static void non_recursive_bvh_div_nodes(BVHTree *tree, BVHNode *branches_array,
|
||||
|
||||
const int tree_type = tree->tree_type;
|
||||
const int tree_offset = 2 - tree->tree_type; //this value is 0 (on binary trees) and negative on the others
|
||||
const int num_branches= implicit_needed_branches(tree_type, num_leafs);
|
||||
const int num_branches = implicit_needed_branches(tree_type, num_leafs);
|
||||
|
||||
BVHBuildHelper data;
|
||||
int depth;
|
||||
|
||||
// set parent from root node to NULL
|
||||
BVHNode *tmp = branches_array+0;
|
||||
BVHNode *tmp = branches_array + 0;
|
||||
tmp->parent = NULL;
|
||||
|
||||
//Most of bvhtree code relies on 1-leaf trees having at least one branch
|
||||
//We handle that special case here
|
||||
if (num_leafs == 1) {
|
||||
BVHNode *root = branches_array+0;
|
||||
BVHNode *root = branches_array + 0;
|
||||
refit_kdop_hull(tree, root, 0, num_leafs);
|
||||
root->main_axis = get_largest_axis(root->bv) / 2;
|
||||
root->totnode = 1;
|
||||
@@ -729,27 +722,27 @@ static void non_recursive_bvh_div_nodes(BVHTree *tree, BVHNode *branches_array,
|
||||
return;
|
||||
}
|
||||
|
||||
branches_array--; //Implicit trees use 1-based indexs
|
||||
branches_array--; //Implicit trees use 1-based indexs
|
||||
|
||||
build_implicit_tree_helper(tree, &data);
|
||||
|
||||
//Loop tree levels (log N) loops
|
||||
for (i=1, depth = 1; i <= num_branches; i = i*tree_type + tree_offset, depth++) {
|
||||
const int first_of_next_level = i*tree_type + tree_offset;
|
||||
const int end_j = MIN2(first_of_next_level, num_branches + 1); //index of last branch on this level
|
||||
for (i = 1, depth = 1; i <= num_branches; i = i * tree_type + tree_offset, depth++) {
|
||||
const int first_of_next_level = i * tree_type + tree_offset;
|
||||
const int end_j = MIN2(first_of_next_level, num_branches + 1); //index of last branch on this level
|
||||
int j;
|
||||
|
||||
//Loop all branches on this level
|
||||
#pragma omp parallel for private(j) schedule(static)
|
||||
for (j = i; j < end_j; j++) {
|
||||
int k;
|
||||
const int parent_level_index= j-i;
|
||||
BVHNode* parent = branches_array + j;
|
||||
int nth_positions[ MAX_TREETYPE + 1];
|
||||
const int parent_level_index = j - i;
|
||||
BVHNode *parent = branches_array + j;
|
||||
int nth_positions[MAX_TREETYPE + 1];
|
||||
char split_axis;
|
||||
|
||||
int parent_leafs_begin = implicit_leafs_index(&data, depth, parent_level_index);
|
||||
int parent_leafs_end = implicit_leafs_index(&data, depth, parent_level_index+1);
|
||||
int parent_leafs_end = implicit_leafs_index(&data, depth, parent_level_index + 1);
|
||||
|
||||
//This calculates the bounding box of this branch
|
||||
//and chooses the largest axis as the axis to divide leafs
|
||||
@@ -763,12 +756,12 @@ static void non_recursive_bvh_div_nodes(BVHTree *tree, BVHNode *branches_array,
|
||||
//Only to assure that the elements are partioned on a way that each child takes the elements
|
||||
//it would take in case the whole array was sorted.
|
||||
//Split_leafs takes care of that "sort" problem.
|
||||
nth_positions[ 0] = parent_leafs_begin;
|
||||
nth_positions[0] = parent_leafs_begin;
|
||||
nth_positions[tree_type] = parent_leafs_end;
|
||||
for (k = 1; k < tree_type; k++) {
|
||||
int child_index = j * tree_type + tree_offset + k;
|
||||
int child_level_index = child_index - first_of_next_level; //child level index
|
||||
nth_positions[k] = implicit_leafs_index(&data, depth+1, child_level_index);
|
||||
nth_positions[k] = implicit_leafs_index(&data, depth + 1, child_level_index);
|
||||
}
|
||||
|
||||
split_leafs(leafs_array, nth_positions, tree_type, split_axis);
|
||||
@@ -780,22 +773,22 @@ static void non_recursive_bvh_div_nodes(BVHTree *tree, BVHNode *branches_array,
|
||||
int child_index = j * tree_type + tree_offset + k;
|
||||
int child_level_index = child_index - first_of_next_level; //child level index
|
||||
|
||||
int child_leafs_begin = implicit_leafs_index(&data, depth+1, child_level_index);
|
||||
int child_leafs_end = implicit_leafs_index(&data, depth+1, child_level_index+1);
|
||||
int child_leafs_begin = implicit_leafs_index(&data, depth + 1, child_level_index);
|
||||
int child_leafs_end = implicit_leafs_index(&data, depth + 1, child_level_index + 1);
|
||||
|
||||
if (child_leafs_end - child_leafs_begin > 1) {
|
||||
parent->children[k] = branches_array + child_index;
|
||||
parent->children[k]->parent = parent;
|
||||
}
|
||||
else if (child_leafs_end - child_leafs_begin == 1) {
|
||||
parent->children[k] = leafs_array[ child_leafs_begin ];
|
||||
parent->children[k] = leafs_array[child_leafs_begin];
|
||||
parent->children[k]->parent = parent;
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
|
||||
parent->totnode = k+1;
|
||||
parent->totnode = k + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -858,27 +851,27 @@ BVHTree *BLI_bvhtree_new(int maxsize, float epsilon, char tree_type, char axis)
|
||||
//Allocate arrays
|
||||
numnodes = maxsize + implicit_needed_branches(tree_type, maxsize) + tree_type;
|
||||
|
||||
tree->nodes = (BVHNode **)MEM_callocN(sizeof(BVHNode *)*numnodes, "BVHNodes");
|
||||
tree->nodes = (BVHNode **)MEM_callocN(sizeof(BVHNode *) * numnodes, "BVHNodes");
|
||||
|
||||
if (!tree->nodes) {
|
||||
MEM_freeN(tree);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
tree->nodebv = (float*)MEM_callocN(sizeof(float)* axis * numnodes, "BVHNodeBV");
|
||||
tree->nodebv = (float *)MEM_callocN(sizeof(float) * axis * numnodes, "BVHNodeBV");
|
||||
if (!tree->nodebv) {
|
||||
MEM_freeN(tree->nodes);
|
||||
MEM_freeN(tree);
|
||||
}
|
||||
|
||||
tree->nodechild = (BVHNode**)MEM_callocN(sizeof(BVHNode*) * tree_type * numnodes, "BVHNodeBV");
|
||||
tree->nodechild = (BVHNode **)MEM_callocN(sizeof(BVHNode *) * tree_type * numnodes, "BVHNodeBV");
|
||||
if (!tree->nodechild) {
|
||||
MEM_freeN(tree->nodebv);
|
||||
MEM_freeN(tree->nodes);
|
||||
MEM_freeN(tree);
|
||||
}
|
||||
|
||||
tree->nodearray = (BVHNode *)MEM_callocN(sizeof(BVHNode)* numnodes, "BVHNodeArray");
|
||||
tree->nodearray = (BVHNode *)MEM_callocN(sizeof(BVHNode) * numnodes, "BVHNodeArray");
|
||||
|
||||
if (!tree->nodearray) {
|
||||
MEM_freeN(tree->nodechild);
|
||||
@@ -889,7 +882,7 @@ BVHTree *BLI_bvhtree_new(int maxsize, float epsilon, char tree_type, char axis)
|
||||
}
|
||||
|
||||
//link the dynamic bv and child links
|
||||
for (i=0; i< numnodes; i++) {
|
||||
for (i = 0; i < numnodes; i++) {
|
||||
tree->nodearray[i].bv = tree->nodebv + i * axis;
|
||||
tree->nodearray[i].children = tree->nodechild + i * tree_type;
|
||||
}
|
||||
@@ -914,8 +907,8 @@ void BLI_bvhtree_balance(BVHTree *tree)
|
||||
{
|
||||
int i;
|
||||
|
||||
BVHNode* branches_array = tree->nodearray + tree->totleaf;
|
||||
BVHNode** leafs_array = tree->nodes;
|
||||
BVHNode *branches_array = tree->nodearray + tree->totleaf;
|
||||
BVHNode **leafs_array = tree->nodes;
|
||||
|
||||
//This function should only be called once (some big bug goes here if its being called more than once per tree)
|
||||
assert(tree->totbranch == 0);
|
||||
@@ -942,7 +935,7 @@ int BLI_bvhtree_insert(BVHTree *tree, int index, const float *co, int numpoints)
|
||||
if (tree->totbranch > 0)
|
||||
return 0;
|
||||
|
||||
if (tree->totleaf+1 >= MEM_allocN_len(tree->nodes)/sizeof(*(tree->nodes)))
|
||||
if (tree->totleaf + 1 >= MEM_allocN_len(tree->nodes) / sizeof(*(tree->nodes)))
|
||||
return 0;
|
||||
|
||||
// TODO check if have enough nodes in array
|
||||
@@ -951,7 +944,7 @@ int BLI_bvhtree_insert(BVHTree *tree, int index, const float *co, int numpoints)
|
||||
tree->totleaf++;
|
||||
|
||||
create_kdop_hull(tree, node, co, numpoints, 0);
|
||||
node->index= index;
|
||||
node->index = index;
|
||||
|
||||
// inflate the bv with some epsilon
|
||||
for (i = tree->start_axis; i < tree->stop_axis; i++) {
|
||||
@@ -967,7 +960,7 @@ int BLI_bvhtree_insert(BVHTree *tree, int index, const float *co, int numpoints)
|
||||
int BLI_bvhtree_update_node(BVHTree *tree, int index, const float *co, const float *co_moving, int numpoints)
|
||||
{
|
||||
int i;
|
||||
BVHNode *node= NULL;
|
||||
BVHNode *node = NULL;
|
||||
|
||||
// check if index exists
|
||||
if (index > tree->totleaf)
|
||||
@@ -996,8 +989,8 @@ void BLI_bvhtree_update_tree(BVHTree *tree)
|
||||
//TRICKY: the way we build the tree all the childs have an index greater than the parent
|
||||
//This allows us todo a bottom up update by starting on the biger numbered branch
|
||||
|
||||
BVHNode** root = tree->nodes + tree->totleaf;
|
||||
BVHNode** index = tree->nodes + tree->totleaf + tree->totbranch-1;
|
||||
BVHNode **root = tree->nodes + tree->totleaf;
|
||||
BVHNode **index = tree->nodes + tree->totleaf + tree->totbranch - 1;
|
||||
|
||||
for (; index >= root; index--)
|
||||
node_join(tree, *index);
|
||||
@@ -1018,13 +1011,13 @@ static int tree_overlap(BVHNode *node1, BVHNode *node2, int start_axis, int stop
|
||||
float *bv1 = node1->bv;
|
||||
float *bv2 = node2->bv;
|
||||
|
||||
float *bv1_end = bv1 + (stop_axis<<1);
|
||||
float *bv1_end = bv1 + (stop_axis << 1);
|
||||
|
||||
bv1 += start_axis<<1;
|
||||
bv2 += start_axis<<1;
|
||||
bv1 += start_axis << 1;
|
||||
bv2 += start_axis << 1;
|
||||
|
||||
// test all axis if min + max overlap
|
||||
for (; bv1 != bv1_end; bv1+=2, bv2+=2) {
|
||||
for (; bv1 != bv1_end; bv1 += 2, bv2 += 2) {
|
||||
if ((*(bv1) > *(bv2 + 1)) || (*(bv2) > *(bv1 + 1)))
|
||||
return 0;
|
||||
}
|
||||
@@ -1048,7 +1041,7 @@ static void traverse(BVHOverlapData *data, BVHNode *node1, BVHNode *node2)
|
||||
|
||||
if (data->i >= data->max_overlap) {
|
||||
// try to make alloc'ed memory bigger
|
||||
data->overlap = realloc(data->overlap, sizeof(BVHTreeOverlap)*data->max_overlap*2);
|
||||
data->overlap = realloc(data->overlap, sizeof(BVHTreeOverlap) * data->max_overlap * 2);
|
||||
|
||||
if (!data->overlap) {
|
||||
printf("Out of Memory in traverse\n");
|
||||
@@ -1095,19 +1088,19 @@ BVHTreeOverlap *BLI_bvhtree_overlap(BVHTree *tree1, BVHTree *tree2, unsigned int
|
||||
if (!tree_overlap(tree1->nodes[tree1->totleaf], tree2->nodes[tree2->totleaf], MIN2(tree1->start_axis, tree2->start_axis), MIN2(tree1->stop_axis, tree2->stop_axis)))
|
||||
return NULL;
|
||||
|
||||
data = MEM_callocN(sizeof(BVHOverlapData *)* tree1->tree_type, "BVHOverlapData_star");
|
||||
data = MEM_callocN(sizeof(BVHOverlapData *) * tree1->tree_type, "BVHOverlapData_star");
|
||||
|
||||
for (j = 0; j < tree1->tree_type; j++) {
|
||||
data[j] = (BVHOverlapData *)MEM_callocN(sizeof(BVHOverlapData), "BVHOverlapData");
|
||||
|
||||
// init BVHOverlapData
|
||||
data[j]->overlap = (BVHTreeOverlap *)malloc(sizeof(BVHTreeOverlap)*MAX2(tree1->totleaf, tree2->totleaf));
|
||||
data[j]->overlap = (BVHTreeOverlap *)malloc(sizeof(BVHTreeOverlap) * MAX2(tree1->totleaf, tree2->totleaf));
|
||||
data[j]->tree1 = tree1;
|
||||
data[j]->tree2 = tree2;
|
||||
data[j]->max_overlap = MAX2(tree1->totleaf, tree2->totleaf);
|
||||
data[j]->i = 0;
|
||||
data[j]->start_axis = MIN2(tree1->start_axis, tree2->start_axis);
|
||||
data[j]->stop_axis = MIN2(tree1->stop_axis, tree2->stop_axis );
|
||||
data[j]->stop_axis = MIN2(tree1->stop_axis, tree2->stop_axis);
|
||||
}
|
||||
|
||||
#pragma omp parallel for private(j) schedule(static)
|
||||
@@ -1118,11 +1111,11 @@ BVHTreeOverlap *BLI_bvhtree_overlap(BVHTree *tree1, BVHTree *tree2, unsigned int
|
||||
for (j = 0; j < tree1->tree_type; j++)
|
||||
total += data[j]->i;
|
||||
|
||||
to = overlap = (BVHTreeOverlap *)MEM_callocN(sizeof(BVHTreeOverlap)*total, "BVHTreeOverlap");
|
||||
to = overlap = (BVHTreeOverlap *)MEM_callocN(sizeof(BVHTreeOverlap) * total, "BVHTreeOverlap");
|
||||
|
||||
for (j = 0; j < tree1->tree_type; j++) {
|
||||
memcpy(to, data[j]->overlap, data[j]->i*sizeof(BVHTreeOverlap));
|
||||
to+=data[j]->i;
|
||||
memcpy(to, data[j]->overlap, data[j]->i * sizeof(BVHTreeOverlap));
|
||||
to += data[j]->i;
|
||||
}
|
||||
|
||||
for (j = 0; j < tree1->tree_type; j++) {
|
||||
@@ -1142,7 +1135,7 @@ static float calc_nearest_point(const float proj[3], BVHNode *node, float *neare
|
||||
const float *bv = node->bv;
|
||||
|
||||
//nearest on AABB hull
|
||||
for (i=0; i != 3; i++, bv += 2) {
|
||||
for (i = 0; i != 3; i++, bv += 2) {
|
||||
if (bv[0] > proj[i])
|
||||
nearest[i] = bv[0];
|
||||
else if (bv[1] < proj[i])
|
||||
@@ -1154,9 +1147,9 @@ static float calc_nearest_point(const float proj[3], BVHNode *node, float *neare
|
||||
#if 0
|
||||
//nearest on a general hull
|
||||
copy_v3_v3(nearest, data->co);
|
||||
for (i = data->tree->start_axis; i != data->tree->stop_axis; i++, bv+=2)
|
||||
for (i = data->tree->start_axis; i != data->tree->stop_axis; i++, bv += 2)
|
||||
{
|
||||
float proj = dot_v3v3( nearest, KDOP_AXES[i]);
|
||||
float proj = dot_v3v3(nearest, KDOP_AXES[i]);
|
||||
float dl = bv[0] - proj;
|
||||
float du = bv[1] - proj;
|
||||
|
||||
@@ -1173,14 +1166,13 @@ static float calc_nearest_point(const float proj[3], BVHNode *node, float *neare
|
||||
}
|
||||
|
||||
|
||||
typedef struct NodeDistance
|
||||
{
|
||||
typedef struct NodeDistance {
|
||||
BVHNode *node;
|
||||
float dist;
|
||||
|
||||
} NodeDistance;
|
||||
|
||||
#define NodeDistance_priority(a, b) ( (a).dist < (b).dist )
|
||||
#define NodeDistance_priority(a, b) ( (a).dist < (b).dist)
|
||||
|
||||
// TODO: use a priority queue to reduce the number of nodes looked on
|
||||
static void dfs_find_nearest_dfs(BVHNearestData *data, BVHNode *node)
|
||||
@@ -1189,8 +1181,8 @@ static void dfs_find_nearest_dfs(BVHNearestData *data, BVHNode *node)
|
||||
if (data->callback)
|
||||
data->callback(data->userdata, node->index, data->co, &data->nearest);
|
||||
else {
|
||||
data->nearest.index = node->index;
|
||||
data->nearest.dist = calc_nearest_point(data->proj, node, data->nearest.co);
|
||||
data->nearest.index = node->index;
|
||||
data->nearest.dist = calc_nearest_point(data->proj, node, data->nearest.co);
|
||||
}
|
||||
}
|
||||
else {
|
||||
@@ -1198,16 +1190,16 @@ static void dfs_find_nearest_dfs(BVHNearestData *data, BVHNode *node)
|
||||
int i;
|
||||
float nearest[3];
|
||||
|
||||
if (data->proj[ node->main_axis ] <= node->children[0]->bv[node->main_axis*2+1]) {
|
||||
if (data->proj[node->main_axis] <= node->children[0]->bv[node->main_axis * 2 + 1]) {
|
||||
|
||||
for (i=0; i != node->totnode; i++) {
|
||||
if ( calc_nearest_point(data->proj, node->children[i], nearest) >= data->nearest.dist) continue;
|
||||
for (i = 0; i != node->totnode; i++) {
|
||||
if (calc_nearest_point(data->proj, node->children[i], nearest) >= data->nearest.dist) continue;
|
||||
dfs_find_nearest_dfs(data, node->children[i]);
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (i=node->totnode-1; i >= 0 ; i--) {
|
||||
if ( calc_nearest_point(data->proj, node->children[i], nearest) >= data->nearest.dist) continue;
|
||||
for (i = node->totnode - 1; i >= 0; i--) {
|
||||
if (calc_nearest_point(data->proj, node->children[i], nearest) >= data->nearest.dist) continue;
|
||||
dfs_find_nearest_dfs(data, node->children[i]);
|
||||
}
|
||||
}
|
||||
@@ -1242,8 +1234,8 @@ static void bfs_find_nearest(BVHNearestData *data, BVHNode *node)
|
||||
{
|
||||
int i;
|
||||
NodeDistance default_heap[DEFAULT_FIND_NEAREST_HEAP_SIZE];
|
||||
NodeDistance *heap=default_heap, current;
|
||||
int heap_size = 0, max_heap_size = sizeof(default_heap)/sizeof(default_heap[0]);
|
||||
NodeDistance *heap = default_heap, current;
|
||||
int heap_size = 0, max_heap_size = sizeof(default_heap) / sizeof(default_heap[0]);
|
||||
float nearest[3];
|
||||
|
||||
int callbacks = 0, push_heaps = 0;
|
||||
@@ -1260,7 +1252,7 @@ static void bfs_find_nearest(BVHNearestData *data, BVHNode *node)
|
||||
while (current.dist < data->nearest.dist)
|
||||
{
|
||||
// printf("%f : %f\n", current.dist, data->nearest.dist);
|
||||
for (i=0; i< current.node->totnode; i++)
|
||||
for (i = 0; i < current.node->totnode; i++)
|
||||
{
|
||||
BVHNode *child = current.node->children[i];
|
||||
if (child->totnode == 0)
|
||||
@@ -1268,11 +1260,10 @@ static void bfs_find_nearest(BVHNearestData *data, BVHNode *node)
|
||||
callbacks++;
|
||||
dfs_find_nearest_dfs(data, child);
|
||||
}
|
||||
else
|
||||
{
|
||||
else {
|
||||
//adjust heap size
|
||||
if ((heap_size >= max_heap_size) &&
|
||||
ADJUST_MEMORY(default_heap, (void**)&heap, heap_size+1, &max_heap_size, sizeof(heap[0])) == FALSE)
|
||||
ADJUST_MEMORY(default_heap, (void **)&heap, heap_size + 1, &max_heap_size, sizeof(heap[0])) == FALSE)
|
||||
{
|
||||
printf("WARNING: bvh_find_nearest got out of memory\n");
|
||||
|
||||
@@ -1289,7 +1280,7 @@ static void bfs_find_nearest(BVHNearestData *data, BVHNode *node)
|
||||
heap_size++;
|
||||
|
||||
NodeDistance_push_heap(heap, heap_size);
|
||||
// PUSH_HEAP_BODY(NodeDistance, NodeDistance_priority, heap, heap_size);
|
||||
// PUSH_HEAP_BODY(NodeDistance, NodeDistance_priority, heap, heap_size);
|
||||
push_heaps++;
|
||||
}
|
||||
}
|
||||
@@ -1315,7 +1306,7 @@ int BLI_bvhtree_find_nearest(BVHTree *tree, const float co[3], BVHTreeNearest *n
|
||||
int i;
|
||||
|
||||
BVHNearestData data;
|
||||
BVHNode* root = tree->nodes[tree->totleaf];
|
||||
BVHNode *root = tree->nodes[tree->totleaf];
|
||||
|
||||
//init data to search
|
||||
data.tree = tree;
|
||||
@@ -1363,7 +1354,7 @@ static float ray_nearest_hit(BVHRayCastData *data, float *bv)
|
||||
|
||||
float low = 0, upper = data->hit.dist;
|
||||
|
||||
for (i=0; i != 3; i++, bv += 2) {
|
||||
for (i = 0; i != 3; i++, bv += 2) {
|
||||
if (data->ray_dot_axis[i] == 0.0f) {
|
||||
//axis aligned ray
|
||||
if (data->ray.origin[i] < bv[0] - data->ray.radius ||
|
||||
@@ -1377,11 +1368,11 @@ static float ray_nearest_hit(BVHRayCastData *data, float *bv)
|
||||
float lu = (bv[1] + data->ray.radius - data->ray.origin[i]) / data->ray_dot_axis[i];
|
||||
|
||||
if (data->ray_dot_axis[i] > 0.0f) {
|
||||
if (ll > low) low = ll;
|
||||
if (ll > low) low = ll;
|
||||
if (lu < upper) upper = lu;
|
||||
}
|
||||
else {
|
||||
if (lu > low) low = lu;
|
||||
if (lu > low) low = lu;
|
||||
if (ll < upper) upper = ll;
|
||||
}
|
||||
|
||||
@@ -1433,20 +1424,20 @@ static void dfs_raycast(BVHRayCastData *data, BVHNode *node)
|
||||
data->callback(data->userdata, node->index, &data->ray, &data->hit);
|
||||
}
|
||||
else {
|
||||
data->hit.index = node->index;
|
||||
data->hit.index = node->index;
|
||||
data->hit.dist = dist;
|
||||
madd_v3_v3v3fl(data->hit.co, data->ray.origin, data->ray.direction, dist);
|
||||
}
|
||||
}
|
||||
else {
|
||||
//pick loop direction to dive into the tree (based on ray direction and split axis)
|
||||
if (data->ray_dot_axis[ (int)node->main_axis ] > 0.0f) {
|
||||
for (i=0; i != node->totnode; i++) {
|
||||
if (data->ray_dot_axis[(int)node->main_axis] > 0.0f) {
|
||||
for (i = 0; i != node->totnode; i++) {
|
||||
dfs_raycast(data, node->children[i]);
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (i=node->totnode-1; i >= 0; i--) {
|
||||
for (i = node->totnode - 1; i >= 0; i--) {
|
||||
dfs_raycast(data, node->children[i]);
|
||||
}
|
||||
}
|
||||
@@ -1467,19 +1458,18 @@ static void iterative_raycast(BVHRayCastData *data, BVHNode *node)
|
||||
|
||||
if (node->totnode == 0)
|
||||
{
|
||||
if (data->callback)
|
||||
if (data->callback) {
|
||||
data->callback(data->userdata, node->index, &data->ray, &data->hit);
|
||||
else
|
||||
{
|
||||
data->hit.index = node->index;
|
||||
}
|
||||
else {
|
||||
data->hit.index = node->index;
|
||||
data->hit.dist = dist;
|
||||
madd_v3_v3v3fl(data->hit.co, data->ray.origin, data->ray.direction, dist);
|
||||
}
|
||||
|
||||
node = node->skip[1];
|
||||
}
|
||||
else
|
||||
{
|
||||
else {
|
||||
node = node->children[0];
|
||||
}
|
||||
}
|
||||
@@ -1490,7 +1480,7 @@ int BLI_bvhtree_ray_cast(BVHTree *tree, const float co[3], const float dir[3], f
|
||||
{
|
||||
int i;
|
||||
BVHRayCastData data;
|
||||
BVHNode * root = tree->nodes[tree->totleaf];
|
||||
BVHNode *root = tree->nodes[tree->totleaf];
|
||||
|
||||
data.tree = tree;
|
||||
|
||||
@@ -1503,17 +1493,17 @@ int BLI_bvhtree_ray_cast(BVHTree *tree, const float co[3], const float dir[3], f
|
||||
|
||||
normalize_v3(data.ray.direction);
|
||||
|
||||
for (i=0; i<3; i++) {
|
||||
for (i = 0; i < 3; i++) {
|
||||
data.ray_dot_axis[i] = dot_v3v3(data.ray.direction, KDOP_AXES[i]);
|
||||
data.idot_axis[i] = 1.0f / data.ray_dot_axis[i];
|
||||
|
||||
if (fabsf(data.ray_dot_axis[i]) < FLT_EPSILON) {
|
||||
data.ray_dot_axis[i] = 0.0;
|
||||
}
|
||||
data.index[2*i] = data.idot_axis[i] < 0.0f ? 1 : 0;
|
||||
data.index[2*i+1] = 1 - data.index[2*i];
|
||||
data.index[2*i] += 2*i;
|
||||
data.index[2*i+1] += 2*i;
|
||||
data.index[2 * i] = data.idot_axis[i] < 0.0f ? 1 : 0;
|
||||
data.index[2 * i + 1] = 1 - data.index[2 * i];
|
||||
data.index[2 * i] += 2 * i;
|
||||
data.index[2 * i + 1] += 2 * i;
|
||||
}
|
||||
|
||||
|
||||
@@ -1527,7 +1517,7 @@ int BLI_bvhtree_ray_cast(BVHTree *tree, const float co[3], const float dir[3], f
|
||||
if (root) {
|
||||
dfs_raycast(&data, root);
|
||||
// iterative_raycast(&data, root);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (hit)
|
||||
@@ -1572,11 +1562,10 @@ float BLI_bvhtree_bb_raycast(float *bv, const float light_start[3], const float
|
||||
* Allocs and fills an array with the indexs of node that are on the given spherical range (center, radius)
|
||||
* Returns the size of the array.
|
||||
*/
|
||||
typedef struct RangeQueryData
|
||||
{
|
||||
typedef struct RangeQueryData {
|
||||
BVHTree *tree;
|
||||
const float *center;
|
||||
float radius; //squared radius
|
||||
float radius; //squared radius
|
||||
|
||||
int hits;
|
||||
|
||||
@@ -1590,7 +1579,7 @@ typedef struct RangeQueryData
|
||||
static void dfs_range_query(RangeQueryData *data, BVHNode *node)
|
||||
{
|
||||
if (node->totnode == 0) {
|
||||
#if 0 /*UNUSED*/
|
||||
#if 0 /*UNUSED*/
|
||||
//Calculate the node min-coords (if the node was a point then this is the point coordinates)
|
||||
float co[3];
|
||||
co[0] = node->bv[0];
|
||||
@@ -1600,7 +1589,7 @@ static void dfs_range_query(RangeQueryData *data, BVHNode *node)
|
||||
}
|
||||
else {
|
||||
int i;
|
||||
for (i=0; i != node->totnode; i++) {
|
||||
for (i = 0; i != node->totnode; i++) {
|
||||
float nearest[3];
|
||||
float dist = calc_nearest_point(data->center, node->children[i], nearest);
|
||||
if (dist < data->radius) {
|
||||
@@ -1618,12 +1607,12 @@ static void dfs_range_query(RangeQueryData *data, BVHNode *node)
|
||||
|
||||
int BLI_bvhtree_range_query(BVHTree *tree, const float co[3], float radius, BVHTree_RangeQuery callback, void *userdata)
|
||||
{
|
||||
BVHNode * root = tree->nodes[tree->totleaf];
|
||||
BVHNode *root = tree->nodes[tree->totleaf];
|
||||
|
||||
RangeQueryData data;
|
||||
data.tree = tree;
|
||||
data.center = co;
|
||||
data.radius = radius*radius;
|
||||
data.radius = radius * radius;
|
||||
data.hits = 0;
|
||||
|
||||
data.callback = callback;
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
#include "BLI_kdtree.h"
|
||||
|
||||
#ifndef SWAP
|
||||
#define SWAP(type, a, b) { type sw_ap; sw_ap=(a); (a)=(b); (b)=sw_ap; }
|
||||
# define SWAP(type, a, b) { type sw_ap; sw_ap = (a); (a) = (b); (b) = sw_ap; }
|
||||
#endif
|
||||
|
||||
typedef struct KDTreeNode {
|
||||
@@ -58,9 +58,9 @@ KDTree *BLI_kdtree_new(int maxsize)
|
||||
{
|
||||
KDTree *tree;
|
||||
|
||||
tree= MEM_callocN(sizeof(KDTree), "KDTree");
|
||||
tree->nodes= MEM_callocN(sizeof(KDTreeNode)*maxsize, "KDTreeNode");
|
||||
tree->totnode= 0;
|
||||
tree = MEM_callocN(sizeof(KDTree), "KDTree");
|
||||
tree->nodes = MEM_callocN(sizeof(KDTreeNode) * maxsize, "KDTreeNode");
|
||||
tree->totnode = 0;
|
||||
|
||||
return tree;
|
||||
}
|
||||
@@ -75,9 +75,9 @@ void BLI_kdtree_free(KDTree *tree)
|
||||
|
||||
void BLI_kdtree_insert(KDTree *tree, int index, float *co, float *nor)
|
||||
{
|
||||
KDTreeNode *node= &tree->nodes[tree->totnode++];
|
||||
KDTreeNode *node = &tree->nodes[tree->totnode++];
|
||||
|
||||
node->index= index;
|
||||
node->index = index;
|
||||
copy_v3_v3(node->co, co);
|
||||
if (nor) copy_v3_v3(node->nor, nor);
|
||||
}
|
||||
@@ -94,18 +94,18 @@ static KDTreeNode *kdtree_balance(KDTreeNode *nodes, int totnode, int axis)
|
||||
return nodes;
|
||||
|
||||
/* quicksort style sorting around median */
|
||||
left= 0;
|
||||
right= totnode-1;
|
||||
median= totnode/2;
|
||||
left = 0;
|
||||
right = totnode - 1;
|
||||
median = totnode / 2;
|
||||
|
||||
while (right > left) {
|
||||
co= nodes[right].co[axis];
|
||||
i= left-1;
|
||||
j= right;
|
||||
co = nodes[right].co[axis];
|
||||
i = left - 1;
|
||||
j = right;
|
||||
|
||||
while (1) {
|
||||
while (nodes[++i].co[axis] < co);
|
||||
while (nodes[--j].co[axis] > co && j>left);
|
||||
while (nodes[++i].co[axis] < co) ;
|
||||
while (nodes[--j].co[axis] > co && j > left) ;
|
||||
|
||||
if (i >= j) break;
|
||||
SWAP(KDTreeNode, nodes[i], nodes[j]);
|
||||
@@ -113,32 +113,32 @@ static KDTreeNode *kdtree_balance(KDTreeNode *nodes, int totnode, int axis)
|
||||
|
||||
SWAP(KDTreeNode, nodes[i], nodes[right]);
|
||||
if (i >= median)
|
||||
right= i-1;
|
||||
right = i - 1;
|
||||
if (i <= median)
|
||||
left= i+1;
|
||||
left = i + 1;
|
||||
}
|
||||
|
||||
/* set node and sort subnodes */
|
||||
node= &nodes[median];
|
||||
node->d= axis;
|
||||
node->left= kdtree_balance(nodes, median, (axis+1)%3);
|
||||
node->right= kdtree_balance(nodes+median+1, (totnode-(median+1)), (axis+1)%3);
|
||||
node = &nodes[median];
|
||||
node->d = axis;
|
||||
node->left = kdtree_balance(nodes, median, (axis + 1) % 3);
|
||||
node->right = kdtree_balance(nodes + median + 1, (totnode - (median + 1)), (axis + 1) % 3);
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
void BLI_kdtree_balance(KDTree *tree)
|
||||
{
|
||||
tree->root= kdtree_balance(tree->nodes, tree->totnode, 0);
|
||||
tree->root = kdtree_balance(tree->nodes, tree->totnode, 0);
|
||||
}
|
||||
|
||||
static float squared_distance(const float v2[3], const float v1[3], float *UNUSED(n1), float *n2)
|
||||
{
|
||||
float d[3], dist;
|
||||
|
||||
d[0]= v2[0]-v1[0];
|
||||
d[1]= v2[1]-v1[1];
|
||||
d[2]= v2[2]-v1[2];
|
||||
d[0] = v2[0] - v1[0];
|
||||
d[1] = v2[1] - v1[1];
|
||||
d[2] = v2[2] - v1[2];
|
||||
|
||||
dist = dot_v3v3(d, d);
|
||||
|
||||
@@ -152,84 +152,84 @@ static float squared_distance(const float v2[3], const float v1[3], float *UNUSE
|
||||
return dist;
|
||||
}
|
||||
|
||||
int BLI_kdtree_find_nearest(KDTree *tree, float *co, float *nor, KDTreeNearest *nearest)
|
||||
int BLI_kdtree_find_nearest(KDTree *tree, float *co, float *nor, KDTreeNearest *nearest)
|
||||
{
|
||||
KDTreeNode *root, *node, *min_node;
|
||||
KDTreeNode **stack, *defaultstack[100];
|
||||
float min_dist, cur_dist;
|
||||
int totstack, cur=0;
|
||||
int totstack, cur = 0;
|
||||
|
||||
if (!tree->root)
|
||||
return -1;
|
||||
|
||||
stack= defaultstack;
|
||||
totstack= 100;
|
||||
stack = defaultstack;
|
||||
totstack = 100;
|
||||
|
||||
root= tree->root;
|
||||
min_node= root;
|
||||
min_dist= squared_distance(root->co, co, root->nor, nor);
|
||||
root = tree->root;
|
||||
min_node = root;
|
||||
min_dist = squared_distance(root->co, co, root->nor, nor);
|
||||
|
||||
if (co[root->d] < root->co[root->d]) {
|
||||
if (root->right)
|
||||
stack[cur++]=root->right;
|
||||
stack[cur++] = root->right;
|
||||
if (root->left)
|
||||
stack[cur++]=root->left;
|
||||
stack[cur++] = root->left;
|
||||
}
|
||||
else {
|
||||
if (root->left)
|
||||
stack[cur++]=root->left;
|
||||
stack[cur++] = root->left;
|
||||
if (root->right)
|
||||
stack[cur++]=root->right;
|
||||
stack[cur++] = root->right;
|
||||
}
|
||||
|
||||
while (cur--) {
|
||||
node=stack[cur];
|
||||
node = stack[cur];
|
||||
|
||||
cur_dist = node->co[node->d] - co[node->d];
|
||||
|
||||
if (cur_dist<0.0f) {
|
||||
cur_dist= -cur_dist*cur_dist;
|
||||
if (cur_dist < 0.0f) {
|
||||
cur_dist = -cur_dist * cur_dist;
|
||||
|
||||
if (-cur_dist<min_dist) {
|
||||
cur_dist=squared_distance(node->co, co, node->nor, nor);
|
||||
if (cur_dist<min_dist) {
|
||||
min_dist=cur_dist;
|
||||
min_node=node;
|
||||
if (-cur_dist < min_dist) {
|
||||
cur_dist = squared_distance(node->co, co, node->nor, nor);
|
||||
if (cur_dist < min_dist) {
|
||||
min_dist = cur_dist;
|
||||
min_node = node;
|
||||
}
|
||||
if (node->left)
|
||||
stack[cur++]=node->left;
|
||||
stack[cur++] = node->left;
|
||||
}
|
||||
if (node->right)
|
||||
stack[cur++]=node->right;
|
||||
stack[cur++] = node->right;
|
||||
}
|
||||
else {
|
||||
cur_dist= cur_dist*cur_dist;
|
||||
cur_dist = cur_dist * cur_dist;
|
||||
|
||||
if (cur_dist<min_dist) {
|
||||
cur_dist=squared_distance(node->co, co, node->nor, nor);
|
||||
if (cur_dist<min_dist) {
|
||||
min_dist=cur_dist;
|
||||
min_node=node;
|
||||
if (cur_dist < min_dist) {
|
||||
cur_dist = squared_distance(node->co, co, node->nor, nor);
|
||||
if (cur_dist < min_dist) {
|
||||
min_dist = cur_dist;
|
||||
min_node = node;
|
||||
}
|
||||
if (node->right)
|
||||
stack[cur++]=node->right;
|
||||
stack[cur++] = node->right;
|
||||
}
|
||||
if (node->left)
|
||||
stack[cur++]=node->left;
|
||||
stack[cur++] = node->left;
|
||||
}
|
||||
if (cur+3 > totstack) {
|
||||
KDTreeNode **temp=MEM_callocN((totstack+100)*sizeof(KDTreeNode*), "psys_treestack");
|
||||
memcpy(temp, stack, totstack*sizeof(KDTreeNode*));
|
||||
if (cur + 3 > totstack) {
|
||||
KDTreeNode **temp = MEM_callocN((totstack + 100) * sizeof(KDTreeNode *), "psys_treestack");
|
||||
memcpy(temp, stack, totstack * sizeof(KDTreeNode *));
|
||||
if (stack != defaultstack)
|
||||
MEM_freeN(stack);
|
||||
stack=temp;
|
||||
totstack+=100;
|
||||
stack = temp;
|
||||
totstack += 100;
|
||||
}
|
||||
}
|
||||
|
||||
if (nearest) {
|
||||
nearest->index= min_node->index;
|
||||
nearest->dist= sqrt(min_dist);
|
||||
nearest->index = min_node->index;
|
||||
nearest->dist = sqrt(min_dist);
|
||||
copy_v3_v3(nearest->co, min_node->co);
|
||||
}
|
||||
|
||||
@@ -243,98 +243,98 @@ static void add_nearest(KDTreeNearest *ptn, int *found, int n, int index, float
|
||||
{
|
||||
int i;
|
||||
|
||||
if (*found<n) (*found)++;
|
||||
if (*found < n) (*found)++;
|
||||
|
||||
for (i=*found-1; i>0; i--) {
|
||||
if (dist >= ptn[i-1].dist)
|
||||
for (i = *found - 1; i > 0; i--) {
|
||||
if (dist >= ptn[i - 1].dist)
|
||||
break;
|
||||
else
|
||||
ptn[i]= ptn[i-1];
|
||||
ptn[i] = ptn[i - 1];
|
||||
}
|
||||
|
||||
ptn[i].index= index;
|
||||
ptn[i].dist= dist;
|
||||
ptn[i].index = index;
|
||||
ptn[i].dist = dist;
|
||||
copy_v3_v3(ptn[i].co, co);
|
||||
}
|
||||
|
||||
/* finds the nearest n entries in tree to specified coordinates */
|
||||
int BLI_kdtree_find_n_nearest(KDTree *tree, int n, float *co, float *nor, KDTreeNearest *nearest)
|
||||
int BLI_kdtree_find_n_nearest(KDTree *tree, int n, float *co, float *nor, KDTreeNearest *nearest)
|
||||
{
|
||||
KDTreeNode *root, *node= NULL;
|
||||
KDTreeNode *root, *node = NULL;
|
||||
KDTreeNode **stack, *defaultstack[100];
|
||||
float cur_dist;
|
||||
int i, totstack, cur=0, found=0;
|
||||
int i, totstack, cur = 0, found = 0;
|
||||
|
||||
if (!tree->root)
|
||||
return 0;
|
||||
|
||||
stack= defaultstack;
|
||||
totstack= 100;
|
||||
stack = defaultstack;
|
||||
totstack = 100;
|
||||
|
||||
root= tree->root;
|
||||
root = tree->root;
|
||||
|
||||
cur_dist= squared_distance(root->co, co, root->nor, nor);
|
||||
cur_dist = squared_distance(root->co, co, root->nor, nor);
|
||||
add_nearest(nearest, &found, n, root->index, cur_dist, root->co);
|
||||
|
||||
if (co[root->d] < root->co[root->d]) {
|
||||
if (root->right)
|
||||
stack[cur++]=root->right;
|
||||
stack[cur++] = root->right;
|
||||
if (root->left)
|
||||
stack[cur++]=root->left;
|
||||
stack[cur++] = root->left;
|
||||
}
|
||||
else {
|
||||
if (root->left)
|
||||
stack[cur++]=root->left;
|
||||
stack[cur++] = root->left;
|
||||
if (root->right)
|
||||
stack[cur++]=root->right;
|
||||
stack[cur++] = root->right;
|
||||
}
|
||||
|
||||
while (cur--) {
|
||||
node=stack[cur];
|
||||
node = stack[cur];
|
||||
|
||||
cur_dist = node->co[node->d] - co[node->d];
|
||||
|
||||
if (cur_dist<0.0f) {
|
||||
cur_dist= -cur_dist*cur_dist;
|
||||
if (cur_dist < 0.0f) {
|
||||
cur_dist = -cur_dist * cur_dist;
|
||||
|
||||
if (found<n || -cur_dist<nearest[found-1].dist) {
|
||||
cur_dist=squared_distance(node->co, co, node->nor, nor);
|
||||
if (found < n || -cur_dist < nearest[found - 1].dist) {
|
||||
cur_dist = squared_distance(node->co, co, node->nor, nor);
|
||||
|
||||
if (found<n || cur_dist<nearest[found-1].dist)
|
||||
if (found < n || cur_dist < nearest[found - 1].dist)
|
||||
add_nearest(nearest, &found, n, node->index, cur_dist, node->co);
|
||||
|
||||
if (node->left)
|
||||
stack[cur++]=node->left;
|
||||
stack[cur++] = node->left;
|
||||
}
|
||||
if (node->right)
|
||||
stack[cur++]=node->right;
|
||||
stack[cur++] = node->right;
|
||||
}
|
||||
else {
|
||||
cur_dist= cur_dist*cur_dist;
|
||||
cur_dist = cur_dist * cur_dist;
|
||||
|
||||
if (found<n || cur_dist<nearest[found-1].dist) {
|
||||
cur_dist=squared_distance(node->co, co, node->nor, nor);
|
||||
if (found<n || cur_dist<nearest[found-1].dist)
|
||||
if (found < n || cur_dist < nearest[found - 1].dist) {
|
||||
cur_dist = squared_distance(node->co, co, node->nor, nor);
|
||||
if (found < n || cur_dist < nearest[found - 1].dist)
|
||||
add_nearest(nearest, &found, n, node->index, cur_dist, node->co);
|
||||
|
||||
if (node->right)
|
||||
stack[cur++]=node->right;
|
||||
stack[cur++] = node->right;
|
||||
}
|
||||
if (node->left)
|
||||
stack[cur++]=node->left;
|
||||
stack[cur++] = node->left;
|
||||
}
|
||||
if (cur+3 > totstack) {
|
||||
KDTreeNode **temp=MEM_callocN((totstack+100)*sizeof(KDTreeNode*), "psys_treestack");
|
||||
memcpy(temp, stack, totstack * sizeof(KDTreeNode*));
|
||||
if (cur + 3 > totstack) {
|
||||
KDTreeNode **temp = MEM_callocN((totstack + 100) * sizeof(KDTreeNode *), "psys_treestack");
|
||||
memcpy(temp, stack, totstack * sizeof(KDTreeNode *));
|
||||
if (stack != defaultstack)
|
||||
MEM_freeN(stack);
|
||||
stack=temp;
|
||||
totstack+=100;
|
||||
stack = temp;
|
||||
totstack += 100;
|
||||
}
|
||||
}
|
||||
|
||||
for (i=0; i<found; i++)
|
||||
nearest[i].dist= sqrt(nearest[i].dist);
|
||||
for (i = 0; i < found; i++)
|
||||
nearest[i].dist = sqrt(nearest[i].dist);
|
||||
|
||||
if (stack != defaultstack)
|
||||
MEM_freeN(stack);
|
||||
@@ -342,7 +342,7 @@ int BLI_kdtree_find_n_nearest(KDTree *tree, int n, float *co, float *nor, KDTree
|
||||
return found;
|
||||
}
|
||||
|
||||
static int range_compare(const void * a, const void * b)
|
||||
static int range_compare(const void *a, const void *b)
|
||||
{
|
||||
const KDTreeNearest *kda = a;
|
||||
const KDTreeNearest *kdb = b;
|
||||
@@ -358,13 +358,13 @@ static void add_in_range(KDTreeNearest **ptn, int found, int *totfoundstack, int
|
||||
{
|
||||
KDTreeNearest *to;
|
||||
|
||||
if (found+1 > *totfoundstack) {
|
||||
KDTreeNearest *temp=MEM_callocN((*totfoundstack+50)*sizeof(KDTreeNode), "psys_treefoundstack");
|
||||
if (found + 1 > *totfoundstack) {
|
||||
KDTreeNearest *temp = MEM_callocN((*totfoundstack + 50) * sizeof(KDTreeNode), "psys_treefoundstack");
|
||||
memcpy(temp, *ptn, *totfoundstack * sizeof(KDTreeNearest));
|
||||
if (*ptn)
|
||||
MEM_freeN(*ptn);
|
||||
*ptn = temp;
|
||||
*totfoundstack+=50;
|
||||
*totfoundstack += 50;
|
||||
}
|
||||
|
||||
to = (*ptn) + found;
|
||||
@@ -375,27 +375,27 @@ static void add_in_range(KDTreeNearest **ptn, int found, int *totfoundstack, int
|
||||
}
|
||||
int BLI_kdtree_range_search(KDTree *tree, float range, float *co, float *nor, KDTreeNearest **nearest)
|
||||
{
|
||||
KDTreeNode *root, *node= NULL;
|
||||
KDTreeNode *root, *node = NULL;
|
||||
KDTreeNode **stack, *defaultstack[100];
|
||||
KDTreeNearest *foundstack=NULL;
|
||||
float range2 = range*range, dist2;
|
||||
int totstack, cur=0, found=0, totfoundstack=0;
|
||||
KDTreeNearest *foundstack = NULL;
|
||||
float range2 = range * range, dist2;
|
||||
int totstack, cur = 0, found = 0, totfoundstack = 0;
|
||||
|
||||
if (!tree || !tree->root)
|
||||
return 0;
|
||||
|
||||
stack= defaultstack;
|
||||
totstack= 100;
|
||||
stack = defaultstack;
|
||||
totstack = 100;
|
||||
|
||||
root= tree->root;
|
||||
root = tree->root;
|
||||
|
||||
if (co[root->d] + range < root->co[root->d]) {
|
||||
if (root->left)
|
||||
stack[cur++]=root->left;
|
||||
stack[cur++] = root->left;
|
||||
}
|
||||
else if (co[root->d] - range > root->co[root->d]) {
|
||||
if (root->right)
|
||||
stack[cur++]=root->right;
|
||||
stack[cur++] = root->right;
|
||||
}
|
||||
else {
|
||||
dist2 = squared_distance(root->co, co, root->nor, nor);
|
||||
@@ -403,21 +403,21 @@ int BLI_kdtree_range_search(KDTree *tree, float range, float *co, float *nor, KD
|
||||
add_in_range(&foundstack, found++, &totfoundstack, root->index, dist2, root->co);
|
||||
|
||||
if (root->left)
|
||||
stack[cur++]=root->left;
|
||||
stack[cur++] = root->left;
|
||||
if (root->right)
|
||||
stack[cur++]=root->right;
|
||||
stack[cur++] = root->right;
|
||||
}
|
||||
|
||||
while (cur--) {
|
||||
node=stack[cur];
|
||||
node = stack[cur];
|
||||
|
||||
if (co[node->d] + range < node->co[node->d]) {
|
||||
if (node->left)
|
||||
stack[cur++]=node->left;
|
||||
stack[cur++] = node->left;
|
||||
}
|
||||
else if (co[node->d] - range > node->co[node->d]) {
|
||||
if (node->right)
|
||||
stack[cur++]=node->right;
|
||||
stack[cur++] = node->right;
|
||||
}
|
||||
else {
|
||||
dist2 = squared_distance(node->co, co, node->nor, nor);
|
||||
@@ -425,18 +425,18 @@ int BLI_kdtree_range_search(KDTree *tree, float range, float *co, float *nor, KD
|
||||
add_in_range(&foundstack, found++, &totfoundstack, node->index, dist2, node->co);
|
||||
|
||||
if (node->left)
|
||||
stack[cur++]=node->left;
|
||||
stack[cur++] = node->left;
|
||||
if (node->right)
|
||||
stack[cur++]=node->right;
|
||||
stack[cur++] = node->right;
|
||||
}
|
||||
|
||||
if (cur+3 > totstack) {
|
||||
KDTreeNode **temp=MEM_callocN((totstack+100)*sizeof(KDTreeNode*), "psys_treestack");
|
||||
memcpy(temp, stack, totstack*sizeof(KDTreeNode*));
|
||||
if (cur + 3 > totstack) {
|
||||
KDTreeNode **temp = MEM_callocN((totstack + 100) * sizeof(KDTreeNode *), "psys_treestack");
|
||||
memcpy(temp, stack, totstack * sizeof(KDTreeNode *));
|
||||
if (stack != defaultstack)
|
||||
MEM_freeN(stack);
|
||||
stack=temp;
|
||||
totstack+=100;
|
||||
stack = temp;
|
||||
totstack += 100;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -38,12 +38,12 @@
|
||||
int BLI_linklist_length(LinkNode *list)
|
||||
{
|
||||
if (0) {
|
||||
return list?(1+BLI_linklist_length(list->next)):0;
|
||||
return list ? (1 + BLI_linklist_length(list->next)) : 0;
|
||||
}
|
||||
else {
|
||||
int len;
|
||||
|
||||
for (len=0; list; list= list->next)
|
||||
for (len = 0; list; list = list->next)
|
||||
len++;
|
||||
|
||||
return len;
|
||||
@@ -54,7 +54,7 @@ int BLI_linklist_index(LinkNode *list, void *ptr)
|
||||
{
|
||||
int index;
|
||||
|
||||
for (index = 0; list; list= list->next, index++)
|
||||
for (index = 0; list; list = list->next, index++)
|
||||
if (list->link == ptr)
|
||||
return index;
|
||||
|
||||
@@ -65,7 +65,7 @@ LinkNode *BLI_linklist_find(LinkNode *list, int index)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; list; list= list->next, i++)
|
||||
for (i = 0; list; list = list->next, i++)
|
||||
if (i == index)
|
||||
return list;
|
||||
|
||||
@@ -74,32 +74,32 @@ LinkNode *BLI_linklist_find(LinkNode *list, int index)
|
||||
|
||||
void BLI_linklist_reverse(LinkNode **listp)
|
||||
{
|
||||
LinkNode *rhead= NULL, *cur= *listp;
|
||||
LinkNode *rhead = NULL, *cur = *listp;
|
||||
|
||||
while (cur) {
|
||||
LinkNode *next= cur->next;
|
||||
LinkNode *next = cur->next;
|
||||
|
||||
cur->next= rhead;
|
||||
rhead= cur;
|
||||
cur->next = rhead;
|
||||
rhead = cur;
|
||||
|
||||
cur= next;
|
||||
cur = next;
|
||||
}
|
||||
|
||||
*listp= rhead;
|
||||
*listp = rhead;
|
||||
}
|
||||
|
||||
void BLI_linklist_prepend(LinkNode **listp, void *ptr)
|
||||
{
|
||||
LinkNode *nlink= MEM_mallocN(sizeof(*nlink), "nlink");
|
||||
nlink->link= ptr;
|
||||
LinkNode *nlink = MEM_mallocN(sizeof(*nlink), "nlink");
|
||||
nlink->link = ptr;
|
||||
|
||||
nlink->next= *listp;
|
||||
*listp= nlink;
|
||||
nlink->next = *listp;
|
||||
*listp = nlink;
|
||||
}
|
||||
|
||||
void BLI_linklist_append(LinkNode **listp, void *ptr)
|
||||
{
|
||||
LinkNode *nlink= MEM_mallocN(sizeof(*nlink), "nlink");
|
||||
LinkNode *nlink = MEM_mallocN(sizeof(*nlink), "nlink");
|
||||
LinkNode *node = *listp;
|
||||
|
||||
nlink->link = ptr;
|
||||
@@ -118,16 +118,16 @@ void BLI_linklist_append(LinkNode **listp, void *ptr)
|
||||
|
||||
void BLI_linklist_prepend_arena(LinkNode **listp, void *ptr, MemArena *ma)
|
||||
{
|
||||
LinkNode *nlink= BLI_memarena_alloc(ma, sizeof(*nlink));
|
||||
nlink->link= ptr;
|
||||
LinkNode *nlink = BLI_memarena_alloc(ma, sizeof(*nlink));
|
||||
nlink->link = ptr;
|
||||
|
||||
nlink->next= *listp;
|
||||
*listp= nlink;
|
||||
nlink->next = *listp;
|
||||
*listp = nlink;
|
||||
}
|
||||
|
||||
void BLI_linklist_insert_after(LinkNode **listp, void *ptr)
|
||||
{
|
||||
LinkNode *nlink= MEM_mallocN(sizeof(*nlink), "nlink");
|
||||
LinkNode *nlink = MEM_mallocN(sizeof(*nlink), "nlink");
|
||||
LinkNode *node = *listp;
|
||||
|
||||
nlink->link = ptr;
|
||||
@@ -145,18 +145,18 @@ void BLI_linklist_insert_after(LinkNode **listp, void *ptr)
|
||||
void BLI_linklist_free(LinkNode *list, LinkNodeFreeFP freefunc)
|
||||
{
|
||||
while (list) {
|
||||
LinkNode *next= list->next;
|
||||
LinkNode *next = list->next;
|
||||
|
||||
if (freefunc)
|
||||
freefunc(list->link);
|
||||
MEM_freeN(list);
|
||||
|
||||
list= next;
|
||||
list = next;
|
||||
}
|
||||
}
|
||||
|
||||
void BLI_linklist_apply(LinkNode *list, LinkNodeApplyFP applyfunc, void *userdata)
|
||||
{
|
||||
for (; list; list= list->next)
|
||||
for (; list; list = list->next)
|
||||
applyfunc(list->link, userdata);
|
||||
}
|
||||
|
||||
@@ -74,12 +74,12 @@ void BLI_memarena_use_align(struct MemArena *ma, int align)
|
||||
|
||||
void BLI_memarena_free(MemArena *ma)
|
||||
{
|
||||
BLI_linklist_free(ma->bufs, (void(*)(void *))MEM_freeN);
|
||||
BLI_linklist_free(ma->bufs, (void (*)(void *))MEM_freeN);
|
||||
MEM_freeN(ma);
|
||||
}
|
||||
|
||||
/* amt must be power of two */
|
||||
#define PADUP(num, amt) ((num + (amt - 1)) &~ (amt-1))
|
||||
#define PADUP(num, amt) ((num + (amt - 1)) & ~(amt - 1))
|
||||
|
||||
void *BLI_memarena_alloc(MemArena *ma, int size)
|
||||
{
|
||||
@@ -93,7 +93,7 @@ void *BLI_memarena_alloc(MemArena *ma, int size)
|
||||
unsigned char *tmp;
|
||||
|
||||
if (size > ma->bufsize - (ma->align - 1)) {
|
||||
ma->cursize = PADUP(size+1, ma->align);
|
||||
ma->cursize = PADUP(size + 1, ma->align);
|
||||
}
|
||||
else
|
||||
ma->cursize = ma->bufsize;
|
||||
@@ -106,7 +106,7 @@ void *BLI_memarena_alloc(MemArena *ma, int size)
|
||||
BLI_linklist_prepend(&ma->bufs, ma->curbuf);
|
||||
|
||||
/* align alloc'ed memory (needed if align > 8) */
|
||||
tmp = (unsigned char*)PADUP( (intptr_t) ma->curbuf, ma->align);
|
||||
tmp = (unsigned char *)PADUP( (intptr_t) ma->curbuf, ma->align);
|
||||
ma->cursize -= (tmp - ma->curbuf);
|
||||
ma->curbuf = tmp;
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
/* Tree API */
|
||||
|
||||
/* Create a new tree, and initialize as necessary */
|
||||
DLRBT_Tree *BLI_dlrbTree_new (void)
|
||||
DLRBT_Tree *BLI_dlrbTree_new(void)
|
||||
{
|
||||
/* just allocate for now */
|
||||
return MEM_callocN(sizeof(DLRBT_Tree), "DLRBT_Tree");
|
||||
@@ -49,11 +49,11 @@ void BLI_dlrbTree_init(DLRBT_Tree *tree)
|
||||
if (tree == NULL)
|
||||
return;
|
||||
|
||||
tree->first= tree->last= tree->root= NULL;
|
||||
tree->first = tree->last = tree->root = NULL;
|
||||
}
|
||||
|
||||
/* Helper for traversing tree and freeing sub-nodes */
|
||||
static void recursive_tree_free_nodes (DLRBT_Node *node)
|
||||
static void recursive_tree_free_nodes(DLRBT_Node *node)
|
||||
{
|
||||
/* sanity check */
|
||||
if (node == NULL)
|
||||
@@ -86,13 +86,13 @@ void BLI_dlrbTree_free(DLRBT_Tree *tree)
|
||||
}
|
||||
|
||||
/* clear pointers */
|
||||
tree->first= tree->last= tree->root= NULL;
|
||||
tree->first = tree->last = tree->root = NULL;
|
||||
}
|
||||
|
||||
/* ------- */
|
||||
|
||||
/* Helper function - used for traversing down the tree from the root to add nodes in order */
|
||||
static void linkedlist_sync_add_node (DLRBT_Tree *tree, DLRBT_Node *node)
|
||||
static void linkedlist_sync_add_node(DLRBT_Tree *tree, DLRBT_Node *node)
|
||||
{
|
||||
/* sanity checks */
|
||||
if ((tree == NULL) || (node == NULL))
|
||||
@@ -105,7 +105,7 @@ static void linkedlist_sync_add_node (DLRBT_Tree *tree, DLRBT_Node *node)
|
||||
* - must remove detach from other links first
|
||||
* (for now, only clear own pointers)
|
||||
*/
|
||||
node->prev= node->next= NULL;
|
||||
node->prev = node->next = NULL;
|
||||
BLI_addtail((ListBase *)tree, (Link *)node);
|
||||
|
||||
/* finally, add right node (and its subtree) */
|
||||
@@ -120,7 +120,7 @@ void BLI_dlrbTree_linkedlist_sync(DLRBT_Tree *tree)
|
||||
return;
|
||||
|
||||
/* clear list-base pointers so that the new list can be added properly */
|
||||
tree->first= tree->last= NULL;
|
||||
tree->first = tree->last = NULL;
|
||||
|
||||
/* start adding items from the root */
|
||||
linkedlist_sync_add_node(tree, tree->root);
|
||||
@@ -130,10 +130,10 @@ void BLI_dlrbTree_linkedlist_sync(DLRBT_Tree *tree)
|
||||
/* Tree Search Utilities */
|
||||
|
||||
/* Find the node which matches or is the closest to the requested node */
|
||||
DLRBT_Node *BLI_dlrbTree_search (DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_cb, void *search_data)
|
||||
DLRBT_Node *BLI_dlrbTree_search(DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_cb, void *search_data)
|
||||
{
|
||||
DLRBT_Node *node = (tree) ? tree->root : NULL;
|
||||
short found= 0;
|
||||
short found = 0;
|
||||
|
||||
/* check that there is a comparator to use */
|
||||
// TODO: if no comparator is supplied, try using the one supplied with the tree...
|
||||
@@ -146,22 +146,22 @@ DLRBT_Node *BLI_dlrbTree_search (DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_cb, v
|
||||
* NOTE: it is assumed that the values will be unit values only
|
||||
*/
|
||||
switch (cmp_cb(node, search_data)) {
|
||||
case -1: /* data less than node */
|
||||
case -1: /* data less than node */
|
||||
if (node->left)
|
||||
node= node->left;
|
||||
node = node->left;
|
||||
else
|
||||
found= 1;
|
||||
found = 1;
|
||||
break;
|
||||
|
||||
case 1: /* data greater than node */
|
||||
case 1: /* data greater than node */
|
||||
if (node->right)
|
||||
node= node->right;
|
||||
node = node->right;
|
||||
else
|
||||
found= 1;
|
||||
found = 1;
|
||||
break;
|
||||
|
||||
default: /* data equals node */
|
||||
found= 1;
|
||||
default: /* data equals node */
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -171,10 +171,10 @@ DLRBT_Node *BLI_dlrbTree_search (DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_cb, v
|
||||
}
|
||||
|
||||
/* Find the node which exactly matches the required data */
|
||||
DLRBT_Node *BLI_dlrbTree_search_exact (DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_cb, void *search_data)
|
||||
DLRBT_Node *BLI_dlrbTree_search_exact(DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_cb, void *search_data)
|
||||
{
|
||||
DLRBT_Node *node = (tree) ? tree->root : NULL;
|
||||
short found= 0;
|
||||
short found = 0;
|
||||
|
||||
/* check that there is a comparator to use */
|
||||
// TODO: if no comparator is supplied, try using the one supplied with the tree...
|
||||
@@ -182,27 +182,27 @@ DLRBT_Node *BLI_dlrbTree_search_exact (DLRBT_Tree *tree, DLRBT_Comparator_FP cmp
|
||||
return NULL;
|
||||
|
||||
/* iteratively perform this search */
|
||||
while (node && found==0) {
|
||||
while (node && found == 0) {
|
||||
/* check if traverse further or not
|
||||
* NOTE: it is assumed that the values will be unit values only
|
||||
*/
|
||||
switch (cmp_cb(node, search_data)) {
|
||||
case -1: /* data less than node */
|
||||
case -1: /* data less than node */
|
||||
if (node->left)
|
||||
node= node->left;
|
||||
node = node->left;
|
||||
else
|
||||
found= -1;
|
||||
found = -1;
|
||||
break;
|
||||
|
||||
case 1: /* data greater than node */
|
||||
case 1: /* data greater than node */
|
||||
if (node->right)
|
||||
node= node->right;
|
||||
node = node->right;
|
||||
else
|
||||
found= -1;
|
||||
found = -1;
|
||||
break;
|
||||
|
||||
default: /* data equals node */
|
||||
found= 1;
|
||||
default: /* data equals node */
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -212,7 +212,7 @@ DLRBT_Node *BLI_dlrbTree_search_exact (DLRBT_Tree *tree, DLRBT_Comparator_FP cmp
|
||||
}
|
||||
|
||||
/* Find the node which occurs immediately before the best matching node */
|
||||
DLRBT_Node *BLI_dlrbTree_search_prev (DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_cb, void *search_data)
|
||||
DLRBT_Node *BLI_dlrbTree_search_prev(DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_cb, void *search_data)
|
||||
{
|
||||
DLRBT_Node *node;
|
||||
|
||||
@@ -222,7 +222,7 @@ DLRBT_Node *BLI_dlrbTree_search_prev (DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_
|
||||
return NULL;
|
||||
|
||||
/* get the node which best matches this description */
|
||||
node= BLI_dlrbTree_search(tree, cmp_cb, search_data);
|
||||
node = BLI_dlrbTree_search(tree, cmp_cb, search_data);
|
||||
|
||||
if (node) {
|
||||
/* if the item we're searching for is greater than the node found, we've found the match */
|
||||
@@ -239,7 +239,7 @@ DLRBT_Node *BLI_dlrbTree_search_prev (DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_
|
||||
}
|
||||
|
||||
/* Find the node which occurs immediately after the best matching node */
|
||||
DLRBT_Node *BLI_dlrbTree_search_next (DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_cb, void *search_data)
|
||||
DLRBT_Node *BLI_dlrbTree_search_next(DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_cb, void *search_data)
|
||||
{
|
||||
DLRBT_Node *node;
|
||||
|
||||
@@ -249,7 +249,7 @@ DLRBT_Node *BLI_dlrbTree_search_next (DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_
|
||||
return NULL;
|
||||
|
||||
/* get the node which best matches this description */
|
||||
node= BLI_dlrbTree_search(tree, cmp_cb, search_data);
|
||||
node = BLI_dlrbTree_search(tree, cmp_cb, search_data);
|
||||
|
||||
if (node) {
|
||||
/* if the item we're searching for is less than the node found, we've found the match */
|
||||
@@ -277,7 +277,7 @@ short BLI_dlrbTree_contains(DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_cb, void *
|
||||
/* Tree Relationships Utilities */
|
||||
|
||||
/* get the 'grandparent' - the parent of the parent - of the given node */
|
||||
static DLRBT_Node *get_grandparent (DLRBT_Node *node)
|
||||
static DLRBT_Node *get_grandparent(DLRBT_Node *node)
|
||||
{
|
||||
if (node && node->parent)
|
||||
return node->parent->parent;
|
||||
@@ -300,7 +300,7 @@ static DLRBT_Node *get_sibling(DLRBT_Node *node)
|
||||
}
|
||||
|
||||
/* get the 'uncle' - the sibling of the parent - of the given node */
|
||||
static DLRBT_Node *get_uncle (DLRBT_Node *node)
|
||||
static DLRBT_Node *get_uncle(DLRBT_Node *node)
|
||||
{
|
||||
if (node)
|
||||
/* return the child of the grandparent which isn't the node's parent */
|
||||
@@ -314,71 +314,71 @@ static DLRBT_Node *get_uncle (DLRBT_Node *node)
|
||||
/* Tree Rotation Utilities */
|
||||
|
||||
/* make right child of 'root' the new root */
|
||||
static void rotate_left (DLRBT_Tree *tree, DLRBT_Node *root)
|
||||
static void rotate_left(DLRBT_Tree *tree, DLRBT_Node *root)
|
||||
{
|
||||
DLRBT_Node **root_slot, *pivot;
|
||||
|
||||
/* pivot is simply the root's right child, to become the root's parent */
|
||||
pivot= root->right;
|
||||
pivot = root->right;
|
||||
if (pivot == NULL)
|
||||
return;
|
||||
|
||||
if (root->parent) {
|
||||
if (root == root->parent->left)
|
||||
root_slot= &root->parent->left;
|
||||
root_slot = &root->parent->left;
|
||||
else
|
||||
root_slot= &root->parent->right;
|
||||
root_slot = &root->parent->right;
|
||||
}
|
||||
else
|
||||
root_slot= ((DLRBT_Node**)&tree->root);//&((DLRBT_Node*)tree->root);
|
||||
root_slot = ((DLRBT_Node **)&tree->root); //&((DLRBT_Node*)tree->root);
|
||||
|
||||
/* - pivot's left child becomes root's right child
|
||||
* - root now becomes pivot's left child
|
||||
*/
|
||||
root->right= pivot->left;
|
||||
if (pivot->left) pivot->left->parent= root;
|
||||
root->right = pivot->left;
|
||||
if (pivot->left) pivot->left->parent = root;
|
||||
|
||||
pivot->left= root;
|
||||
pivot->parent= root->parent;
|
||||
root->parent= pivot;
|
||||
pivot->left = root;
|
||||
pivot->parent = root->parent;
|
||||
root->parent = pivot;
|
||||
|
||||
/* make the pivot the new root */
|
||||
if (root_slot)
|
||||
*root_slot= pivot;
|
||||
*root_slot = pivot;
|
||||
}
|
||||
|
||||
/* make the left child of the 'root' the new root */
|
||||
static void rotate_right (DLRBT_Tree *tree, DLRBT_Node *root)
|
||||
static void rotate_right(DLRBT_Tree *tree, DLRBT_Node *root)
|
||||
{
|
||||
DLRBT_Node **root_slot, *pivot;
|
||||
|
||||
/* pivot is simply the root's left child, to become the root's parent */
|
||||
pivot= root->left;
|
||||
pivot = root->left;
|
||||
if (pivot == NULL)
|
||||
return;
|
||||
|
||||
if (root->parent) {
|
||||
if (root == root->parent->left)
|
||||
root_slot= &root->parent->left;
|
||||
root_slot = &root->parent->left;
|
||||
else
|
||||
root_slot= &root->parent->right;
|
||||
root_slot = &root->parent->right;
|
||||
}
|
||||
else
|
||||
root_slot= ((DLRBT_Node**)&tree->root);//&((DLRBT_Node*)tree->root);
|
||||
root_slot = ((DLRBT_Node **)&tree->root); //&((DLRBT_Node*)tree->root);
|
||||
|
||||
/* - pivot's right child becomes root's left child
|
||||
* - root now becomes pivot's right child
|
||||
*/
|
||||
root->left= pivot->right;
|
||||
if (pivot->right) pivot->right->parent= root;
|
||||
root->left = pivot->right;
|
||||
if (pivot->right) pivot->right->parent = root;
|
||||
|
||||
pivot->right= root;
|
||||
pivot->parent= root->parent;
|
||||
root->parent= pivot;
|
||||
pivot->right = root;
|
||||
pivot->parent = root->parent;
|
||||
root->parent = pivot;
|
||||
|
||||
/* make the pivot the new root */
|
||||
if (root_slot)
|
||||
*root_slot= pivot;
|
||||
*root_slot = pivot;
|
||||
}
|
||||
|
||||
/* *********************************************** */
|
||||
@@ -392,41 +392,41 @@ static void insert_check_3(DLRBT_Tree *tree, DLRBT_Node *node);
|
||||
/* ----- */
|
||||
|
||||
/* W. 1) Root must be black (so that the 2nd-generation can have a black parent) */
|
||||
static void insert_check_1 (DLRBT_Tree *tree, DLRBT_Node *node)
|
||||
static void insert_check_1(DLRBT_Tree *tree, DLRBT_Node *node)
|
||||
{
|
||||
if (node) {
|
||||
/* if this is the root, just ensure that it is black */
|
||||
if (node->parent == NULL)
|
||||
node->tree_col= DLRBT_BLACK;
|
||||
node->tree_col = DLRBT_BLACK;
|
||||
else
|
||||
insert_check_2(tree, node);
|
||||
}
|
||||
}
|
||||
|
||||
/* W. 2+3) Parent of node must be black, otherwise recolor and flush */
|
||||
static void insert_check_2 (DLRBT_Tree *tree, DLRBT_Node *node)
|
||||
static void insert_check_2(DLRBT_Tree *tree, DLRBT_Node *node)
|
||||
{
|
||||
/* if the parent is not black, we need to change that... */
|
||||
if (node && node->parent && node->parent->tree_col) {
|
||||
DLRBT_Node *unc= get_uncle(node);
|
||||
DLRBT_Node *unc = get_uncle(node);
|
||||
|
||||
/* if uncle and parent are both red, need to change them to black and make
|
||||
* the parent black in order to satisfy the criteria of each node having the
|
||||
* same number of black nodes to its leaves
|
||||
*/
|
||||
if (unc && unc->tree_col) {
|
||||
DLRBT_Node *gp= get_grandparent(node);
|
||||
DLRBT_Node *gp = get_grandparent(node);
|
||||
|
||||
/* make the n-1 generation nodes black */
|
||||
node->parent->tree_col= unc->tree_col= DLRBT_BLACK;
|
||||
node->parent->tree_col = unc->tree_col = DLRBT_BLACK;
|
||||
|
||||
/* - make the grandparent red, so that we maintain alternating red/black property
|
||||
* (it must exist, so no need to check for NULL here),
|
||||
* - as the grandparent may now cause inconsistencies with the rest of the tree,
|
||||
* we must flush up the tree and perform checks/rebalancing/repainting, using the
|
||||
* grandparent as the node of interest
|
||||
* grandparent as the node of interest
|
||||
*/
|
||||
gp->tree_col= DLRBT_RED;
|
||||
gp->tree_col = DLRBT_RED;
|
||||
insert_check_1(tree, gp);
|
||||
}
|
||||
else {
|
||||
@@ -439,9 +439,9 @@ static void insert_check_2 (DLRBT_Tree *tree, DLRBT_Node *node)
|
||||
}
|
||||
|
||||
/* W. 4+5) Perform rotation on sub-tree containing the 'new' node, then do any */
|
||||
static void insert_check_3 (DLRBT_Tree *tree, DLRBT_Node *node)
|
||||
static void insert_check_3(DLRBT_Tree *tree, DLRBT_Node *node)
|
||||
{
|
||||
DLRBT_Node *gp= get_grandparent(node);
|
||||
DLRBT_Node *gp = get_grandparent(node);
|
||||
|
||||
/* check that grandparent and node->parent exist (jut in case... really shouldn't happen on a good tree) */
|
||||
if (node && node->parent && gp) {
|
||||
@@ -451,11 +451,11 @@ static void insert_check_3 (DLRBT_Tree *tree, DLRBT_Node *node)
|
||||
*/
|
||||
if ((node == node->parent->right) && (node->parent == gp->left)) {
|
||||
rotate_left(tree, node);
|
||||
node= node->left;
|
||||
node = node->left;
|
||||
}
|
||||
else if ((node == node->parent->left) && (node->parent == gp->right)) {
|
||||
rotate_right(tree, node);
|
||||
node= node->right;
|
||||
node = node->right;
|
||||
}
|
||||
|
||||
/* fix old parent's color-tagging, and perform rotation on the old parent in the
|
||||
@@ -464,11 +464,11 @@ static void insert_check_3 (DLRBT_Tree *tree, DLRBT_Node *node)
|
||||
*/
|
||||
if (node) {
|
||||
/* get 'new' grandparent (i.e. grandparent for old-parent (node)) */
|
||||
gp= get_grandparent(node);
|
||||
gp = get_grandparent(node);
|
||||
|
||||
/* modify the coloring of the grandparent and parent so that they still satisfy the constraints */
|
||||
node->parent->tree_col= DLRBT_BLACK;
|
||||
gp->tree_col= DLRBT_RED;
|
||||
node->parent->tree_col = DLRBT_BLACK;
|
||||
gp->tree_col = DLRBT_RED;
|
||||
|
||||
/* if there are several nodes that all form a left chain, do a right rotation to correct this
|
||||
* (or a rotation in the opposite direction if they all form a right chain)
|
||||
@@ -493,7 +493,7 @@ void BLI_dlrbTree_insert(DLRBT_Tree *tree, DLRBT_Node *node)
|
||||
return;
|
||||
|
||||
/* firstly, the node we just added should be red by default */
|
||||
node->tree_col= DLRBT_RED;
|
||||
node->tree_col = DLRBT_RED;
|
||||
|
||||
/* start from case 1, an trek through the tail-recursive insertion checks */
|
||||
insert_check_1(tree, node);
|
||||
@@ -504,9 +504,9 @@ void BLI_dlrbTree_insert(DLRBT_Tree *tree, DLRBT_Node *node)
|
||||
/* Add the given data to the tree, and return the node added */
|
||||
// NOTE: for duplicates, the update_cb is called (if available), and the existing node is returned
|
||||
DLRBT_Node *BLI_dlrbTree_add(DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_cb,
|
||||
DLRBT_NAlloc_FP new_cb, DLRBT_NUpdate_FP update_cb, void *data)
|
||||
DLRBT_NAlloc_FP new_cb, DLRBT_NUpdate_FP update_cb, void *data)
|
||||
{
|
||||
DLRBT_Node *parNode, *node=NULL;
|
||||
DLRBT_Node *parNode, *node = NULL;
|
||||
short new_node = 0;
|
||||
|
||||
/* sanity checks */
|
||||
@@ -522,7 +522,7 @@ DLRBT_Node *BLI_dlrbTree_add(DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_cb,
|
||||
// TODO: if no updater is supplied, try using the one supplied with the tree...
|
||||
|
||||
/* try to find the nearest node to this one */
|
||||
parNode= BLI_dlrbTree_search(tree, cmp_cb, data);
|
||||
parNode = BLI_dlrbTree_search(tree, cmp_cb, data);
|
||||
|
||||
/* add new node to the BST in the 'standard way' as appropriate
|
||||
* NOTE: we do not support duplicates in our tree...
|
||||
@@ -532,49 +532,49 @@ DLRBT_Node *BLI_dlrbTree_add(DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_cb,
|
||||
* NOTE: it is assumed that the values will be unit values only
|
||||
*/
|
||||
switch (cmp_cb(parNode, data)) {
|
||||
case -1: /* add new node as left child */
|
||||
case -1: /* add new node as left child */
|
||||
{
|
||||
node= new_cb(data);
|
||||
new_node= 1;
|
||||
node = new_cb(data);
|
||||
new_node = 1;
|
||||
|
||||
parNode->left= node;
|
||||
node->parent= parNode;
|
||||
parNode->left = node;
|
||||
node->parent = parNode;
|
||||
}
|
||||
break;
|
||||
break;
|
||||
|
||||
case 1: /* add new node as right child */
|
||||
case 1: /* add new node as right child */
|
||||
{
|
||||
node= new_cb(data);
|
||||
new_node= 1;
|
||||
node = new_cb(data);
|
||||
new_node = 1;
|
||||
|
||||
parNode->right= node;
|
||||
node->parent= parNode;
|
||||
parNode->right = node;
|
||||
node->parent = parNode;
|
||||
}
|
||||
break;
|
||||
break;
|
||||
|
||||
default: /* update the duplicate node as appropriate */
|
||||
default: /* update the duplicate node as appropriate */
|
||||
{
|
||||
if (update_cb)
|
||||
update_cb(parNode, data);
|
||||
}
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* no nodes in the tree yet... add a new node as the root */
|
||||
node= new_cb(data);
|
||||
new_node= 1;
|
||||
node = new_cb(data);
|
||||
new_node = 1;
|
||||
|
||||
tree->root= node;
|
||||
tree->root = node;
|
||||
}
|
||||
|
||||
/* if a new node was added, it should be tagged as red, and then balanced as appropriate */
|
||||
if (new_node) {
|
||||
/* tag this new node as being 'red' */
|
||||
node->tree_col= DLRBT_RED;
|
||||
node->tree_col = DLRBT_RED;
|
||||
|
||||
/* perform BST balancing steps:
|
||||
* start from case 1, an trek through the tail-recursive insertion checks
|
||||
* start from case 1, an trek through the tail-recursive insertion checks
|
||||
*/
|
||||
insert_check_1(tree, node);
|
||||
}
|
||||
|
||||
@@ -221,7 +221,7 @@ static int findFileRecursive(char *filename_new,
|
||||
return found;
|
||||
|
||||
if (*filesize == -1)
|
||||
*filesize = 0; /* dir opened fine */
|
||||
*filesize = 0; /* dir opened fine */
|
||||
|
||||
while ((de = readdir(dir)) != NULL) {
|
||||
|
||||
@@ -231,7 +231,7 @@ static int findFileRecursive(char *filename_new,
|
||||
BLI_join_dirfile(path, sizeof(path), dirname, de->d_name);
|
||||
|
||||
if (stat(path, &status) != 0)
|
||||
continue; /* cant stat, don't bother with this file, could print debug info here */
|
||||
continue; /* cant stat, don't bother with this file, could print debug info here */
|
||||
|
||||
if (S_ISREG(status.st_mode)) { /* is file */
|
||||
if (strncmp(filename, de->d_name, FILE_MAX) == 0) { /* name matches */
|
||||
@@ -388,29 +388,29 @@ void BLI_bpath_traverse_id(Main *bmain, ID *id, BPathVisitor visit_cb, const int
|
||||
}
|
||||
|
||||
switch (GS(id->name)) {
|
||||
case ID_IM:
|
||||
ima= (Image *)id;
|
||||
if (ima->packedfile == NULL || (flag & BLI_BPATH_TRAVERSE_SKIP_PACKED) == 0) {
|
||||
if (ELEM3(ima->source, IMA_SRC_FILE, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) {
|
||||
rewrite_path_fixed(ima->name, visit_cb, absbase, bpath_user_data);
|
||||
case ID_IM:
|
||||
ima = (Image *)id;
|
||||
if (ima->packedfile == NULL || (flag & BLI_BPATH_TRAVERSE_SKIP_PACKED) == 0) {
|
||||
if (ELEM3(ima->source, IMA_SRC_FILE, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) {
|
||||
rewrite_path_fixed(ima->name, visit_cb, absbase, bpath_user_data);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ID_BR:
|
||||
break;
|
||||
case ID_BR:
|
||||
{
|
||||
Brush *brush= (Brush *)id;
|
||||
Brush *brush = (Brush *)id;
|
||||
if (brush->icon_filepath[0]) {
|
||||
rewrite_path_fixed(brush->icon_filepath, visit_cb, absbase, bpath_user_data);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ID_OB:
|
||||
case ID_OB:
|
||||
|
||||
#define BPATH_TRAVERSE_POINTCACHE(ptcaches) \
|
||||
{ \
|
||||
PointCache *cache; \
|
||||
for (cache= (ptcaches).first; cache; cache= cache->next) { \
|
||||
if (cache->flag & PTCACHE_DISK_CACHE) { \
|
||||
for (cache = (ptcaches).first; cache; cache = cache->next) { \
|
||||
if (cache->flag & PTCACHE_DISK_CACHE) { \
|
||||
rewrite_path_fixed(cache->path, \
|
||||
visit_cb, \
|
||||
absbase, \
|
||||
@@ -420,69 +420,69 @@ void BLI_bpath_traverse_id(Main *bmain, ID *id, BPathVisitor visit_cb, const int
|
||||
} \
|
||||
|
||||
|
||||
{
|
||||
Object *ob= (Object *)id;
|
||||
ModifierData *md;
|
||||
ParticleSystem *psys;
|
||||
{
|
||||
Object *ob = (Object *)id;
|
||||
ModifierData *md;
|
||||
ParticleSystem *psys;
|
||||
|
||||
/* do via modifiers instead */
|
||||
/* do via modifiers instead */
|
||||
#if 0
|
||||
if (ob->fluidsimSettings) {
|
||||
rewrite_path_fixed(ob->fluidsimSettings->surfdataPath, visit_cb, absbase, bpath_user_data);
|
||||
}
|
||||
if (ob->fluidsimSettings) {
|
||||
rewrite_path_fixed(ob->fluidsimSettings->surfdataPath, visit_cb, absbase, bpath_user_data);
|
||||
}
|
||||
#endif
|
||||
|
||||
for (md= ob->modifiers.first; md; md= md->next) {
|
||||
if (md->type == eModifierType_Fluidsim) {
|
||||
FluidsimModifierData *fluidmd= (FluidsimModifierData *)md;
|
||||
if (fluidmd->fss) {
|
||||
rewrite_path_fixed(fluidmd->fss->surfdataPath, visit_cb, absbase, bpath_user_data);
|
||||
for (md = ob->modifiers.first; md; md = md->next) {
|
||||
if (md->type == eModifierType_Fluidsim) {
|
||||
FluidsimModifierData *fluidmd = (FluidsimModifierData *)md;
|
||||
if (fluidmd->fss) {
|
||||
rewrite_path_fixed(fluidmd->fss->surfdataPath, visit_cb, absbase, bpath_user_data);
|
||||
}
|
||||
}
|
||||
else if (md->type == eModifierType_Smoke) {
|
||||
SmokeModifierData *smd = (SmokeModifierData *)md;
|
||||
if (smd->type & MOD_SMOKE_TYPE_DOMAIN) {
|
||||
BPATH_TRAVERSE_POINTCACHE(smd->domain->ptcaches[0]);
|
||||
}
|
||||
}
|
||||
else if (md->type == eModifierType_Cloth) {
|
||||
ClothModifierData *clmd = (ClothModifierData *) md;
|
||||
BPATH_TRAVERSE_POINTCACHE(clmd->ptcaches);
|
||||
}
|
||||
else if (md->type == eModifierType_Ocean) {
|
||||
OceanModifierData *omd = (OceanModifierData *) md;
|
||||
rewrite_path_fixed(omd->cachepath, visit_cb, absbase, bpath_user_data);
|
||||
}
|
||||
}
|
||||
else if (md->type == eModifierType_Smoke) {
|
||||
SmokeModifierData *smd= (SmokeModifierData *)md;
|
||||
if (smd->type & MOD_SMOKE_TYPE_DOMAIN) {
|
||||
BPATH_TRAVERSE_POINTCACHE(smd->domain->ptcaches[0]);
|
||||
}
|
||||
}
|
||||
else if (md->type==eModifierType_Cloth) {
|
||||
ClothModifierData *clmd= (ClothModifierData*) md;
|
||||
BPATH_TRAVERSE_POINTCACHE(clmd->ptcaches);
|
||||
}
|
||||
else if (md->type==eModifierType_Ocean) {
|
||||
OceanModifierData *omd= (OceanModifierData*) md;
|
||||
rewrite_path_fixed(omd->cachepath, visit_cb, absbase, bpath_user_data);
|
||||
}
|
||||
}
|
||||
|
||||
if (ob->soft) {
|
||||
BPATH_TRAVERSE_POINTCACHE(ob->soft->ptcaches);
|
||||
}
|
||||
if (ob->soft) {
|
||||
BPATH_TRAVERSE_POINTCACHE(ob->soft->ptcaches);
|
||||
}
|
||||
|
||||
for (psys= ob->particlesystem.first; psys; psys= psys->next) {
|
||||
BPATH_TRAVERSE_POINTCACHE(psys->ptcaches);
|
||||
for (psys = ob->particlesystem.first; psys; psys = psys->next) {
|
||||
BPATH_TRAVERSE_POINTCACHE(psys->ptcaches);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#undef BPATH_TRAVERSE_POINTCACHE
|
||||
|
||||
break;
|
||||
case ID_SO:
|
||||
break;
|
||||
case ID_SO:
|
||||
{
|
||||
bSound *sound= (bSound *)id;
|
||||
bSound *sound = (bSound *)id;
|
||||
if (sound->packedfile == NULL || (flag & BLI_BPATH_TRAVERSE_SKIP_PACKED) == 0) {
|
||||
rewrite_path_fixed(sound->name, visit_cb, absbase, bpath_user_data);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ID_TXT:
|
||||
if (((Text*)id)->name) {
|
||||
rewrite_path_alloc(&((Text *)id)->name, visit_cb, absbase, bpath_user_data);
|
||||
}
|
||||
break;
|
||||
case ID_VF:
|
||||
case ID_TXT:
|
||||
if (((Text *)id)->name) {
|
||||
rewrite_path_alloc(&((Text *)id)->name, visit_cb, absbase, bpath_user_data);
|
||||
}
|
||||
break;
|
||||
case ID_VF:
|
||||
{
|
||||
VFont *vf= (VFont *)id;
|
||||
VFont *vf = (VFont *)id;
|
||||
if (vf->packedfile == NULL || (flag & BLI_BPATH_TRAVERSE_SKIP_PACKED) == 0) {
|
||||
if (strcmp(vf->name, FO_BUILTIN_NAME) != 0) {
|
||||
rewrite_path_fixed(((VFont *)id)->name, visit_cb, absbase, bpath_user_data);
|
||||
@@ -490,7 +490,7 @@ void BLI_bpath_traverse_id(Main *bmain, ID *id, BPathVisitor visit_cb, const int
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ID_TE:
|
||||
case ID_TE:
|
||||
{
|
||||
Tex *tex = (Tex *)id;
|
||||
if (tex->plugin) {
|
||||
@@ -504,13 +504,13 @@ void BLI_bpath_traverse_id(Main *bmain, ID *id, BPathVisitor visit_cb, const int
|
||||
}
|
||||
break;
|
||||
|
||||
case ID_SCE:
|
||||
case ID_SCE:
|
||||
{
|
||||
Scene *scene= (Scene *)id;
|
||||
Scene *scene = (Scene *)id;
|
||||
if (scene->ed) {
|
||||
Sequence *seq;
|
||||
|
||||
SEQ_BEGIN (scene->ed, seq)
|
||||
SEQ_BEGIN(scene->ed, seq)
|
||||
{
|
||||
if (SEQ_HAS_PATH(seq)) {
|
||||
if (ELEM(seq->type, SEQ_MOVIE, SEQ_SOUND)) {
|
||||
@@ -519,16 +519,16 @@ void BLI_bpath_traverse_id(Main *bmain, ID *id, BPathVisitor visit_cb, const int
|
||||
}
|
||||
else if (seq->type == SEQ_IMAGE) {
|
||||
/* might want an option not to loop over all strips */
|
||||
StripElem *se= seq->strip->stripdata;
|
||||
int len= MEM_allocN_len(se) / sizeof(*se);
|
||||
StripElem *se = seq->strip->stripdata;
|
||||
int len = MEM_allocN_len(se) / sizeof(*se);
|
||||
int i;
|
||||
|
||||
if (flag & BLI_BPATH_TRAVERSE_SKIP_MULTIFILE) {
|
||||
/* only operate on one path */
|
||||
len= MIN2(1, len);
|
||||
len = MIN2(1, len);
|
||||
}
|
||||
|
||||
for (i= 0; i < len; i++, se++) {
|
||||
for (i = 0; i < len; i++, se++) {
|
||||
rewrite_path_fixed_dirfile(seq->strip->dir, se->name,
|
||||
visit_cb, absbase, bpath_user_data);
|
||||
}
|
||||
@@ -547,31 +547,31 @@ void BLI_bpath_traverse_id(Main *bmain, ID *id, BPathVisitor visit_cb, const int
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ID_ME:
|
||||
case ID_ME:
|
||||
{
|
||||
Mesh *me= (Mesh *)id;
|
||||
Mesh *me = (Mesh *)id;
|
||||
if (me->fdata.external) {
|
||||
rewrite_path_fixed(me->fdata.external->filename, visit_cb, absbase, bpath_user_data);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ID_LI:
|
||||
case ID_LI:
|
||||
{
|
||||
Library *lib= (Library *)id;
|
||||
Library *lib = (Library *)id;
|
||||
if (rewrite_path_fixed(lib->name, visit_cb, absbase, bpath_user_data)) {
|
||||
BKE_library_filepath_set(lib, lib->name);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ID_MC:
|
||||
case ID_MC:
|
||||
{
|
||||
MovieClip *clip= (MovieClip *)id;
|
||||
MovieClip *clip = (MovieClip *)id;
|
||||
rewrite_path_fixed(clip->name, visit_cb, absbase, bpath_user_data);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
/* Nothing to do for other IDs that don't contain file paths. */
|
||||
break;
|
||||
default:
|
||||
/* Nothing to do for other IDs that don't contain file paths. */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -41,14 +41,14 @@
|
||||
#include "BLI_mempool.h"
|
||||
|
||||
/**************inlined code************/
|
||||
static unsigned int _ehash_hashsizes[]= {
|
||||
static unsigned int _ehash_hashsizes[] = {
|
||||
1, 3, 5, 11, 17, 37, 67, 131, 257, 521, 1031, 2053, 4099, 8209,
|
||||
16411, 32771, 65537, 131101, 262147, 524309, 1048583, 2097169,
|
||||
4194319, 8388617, 16777259, 33554467, 67108879, 134217757,
|
||||
268435459
|
||||
};
|
||||
|
||||
#define EDGE_HASH(v0, v1) ((v0 * 39)^(v1 * 31))
|
||||
#define EDGE_HASH(v0, v1) ((v0 * 39) ^ (v1 * 31))
|
||||
|
||||
/* ensure v0 is smaller */
|
||||
#define EDGE_ORD(v0, v1) \
|
||||
@@ -105,9 +105,9 @@ void BLI_edgehash_insert(EdgeHash *eh, unsigned int v0, unsigned int v1, void *v
|
||||
e->v1 = v1;
|
||||
e->val = val;
|
||||
e->next = eh->buckets[hash];
|
||||
eh->buckets[hash]= e;
|
||||
eh->buckets[hash] = e;
|
||||
|
||||
if (++eh->nentries>eh->nbuckets * 3) {
|
||||
if (++eh->nentries > eh->nbuckets * 3) {
|
||||
EdgeEntry *e, **old = eh->buckets;
|
||||
int i, nold = eh->nbuckets;
|
||||
|
||||
@@ -116,12 +116,12 @@ void BLI_edgehash_insert(EdgeHash *eh, unsigned int v0, unsigned int v1, void *v
|
||||
memset(eh->buckets, 0, eh->nbuckets * sizeof(*eh->buckets));
|
||||
|
||||
for (i = 0; i < nold; i++) {
|
||||
for (e = old[i]; e;) {
|
||||
for (e = old[i]; e; ) {
|
||||
EdgeEntry *n = e->next;
|
||||
|
||||
hash = EDGE_HASH(e->v0, e->v1) % eh->nbuckets;
|
||||
e->next = eh->buckets[hash];
|
||||
eh->buckets[hash]= e;
|
||||
eh->buckets[hash] = e;
|
||||
|
||||
e = n;
|
||||
}
|
||||
@@ -150,7 +150,7 @@ void *BLI_edgehash_lookup(EdgeHash *eh, unsigned int v0, unsigned int v1)
|
||||
{
|
||||
void **value_p = BLI_edgehash_lookup_p(eh, v0, v1);
|
||||
|
||||
return value_p?*value_p:NULL;
|
||||
return value_p ? *value_p : NULL;
|
||||
}
|
||||
|
||||
int BLI_edgehash_haskey(EdgeHash *eh, unsigned int v0, unsigned int v1)
|
||||
@@ -167,7 +167,7 @@ void BLI_edgehash_clear(EdgeHash *eh, EdgeHashFreeFP valfreefp)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i<eh->nbuckets; i++) {
|
||||
for (i = 0; i < eh->nbuckets; i++) {
|
||||
EdgeEntry *e;
|
||||
|
||||
for (e = eh->buckets[i]; e; ) {
|
||||
@@ -231,7 +231,7 @@ void BLI_edgehashIterator_getKey(EdgeHashIterator *ehi, unsigned int *v0_r, unsi
|
||||
}
|
||||
void *BLI_edgehashIterator_getValue(EdgeHashIterator *ehi)
|
||||
{
|
||||
return ehi->curEntry?ehi->curEntry->val:NULL;
|
||||
return ehi->curEntry ? ehi->curEntry->val : NULL;
|
||||
}
|
||||
|
||||
void BLI_edgehashIterator_setValue(EdgeHashIterator *ehi, void *val)
|
||||
|
||||
@@ -74,7 +74,7 @@ int BLI_file_gzip(const char *from, const char *to)
|
||||
char buffer[10240];
|
||||
int file;
|
||||
int readsize = 0;
|
||||
int rval= 0, err;
|
||||
int rval = 0, err;
|
||||
gzFile gzfile;
|
||||
|
||||
/* level 1 is very close to 3 (the default) in terms of file size,
|
||||
@@ -82,7 +82,7 @@ int BLI_file_gzip(const char *from, const char *to)
|
||||
gzfile = BLI_gzopen(to, "wb1");
|
||||
if (gzfile == NULL)
|
||||
return -1;
|
||||
file = BLI_open(from, O_BINARY|O_RDONLY, 0);
|
||||
file = BLI_open(from, O_BINARY | O_RDONLY, 0);
|
||||
if (file < 0)
|
||||
return -2;
|
||||
|
||||
@@ -90,15 +90,15 @@ int BLI_file_gzip(const char *from, const char *to)
|
||||
readsize = read(file, buffer, sizeof(buffer));
|
||||
|
||||
if (readsize < 0) {
|
||||
rval= -2; /* error happened in reading */
|
||||
rval = -2; /* error happened in reading */
|
||||
fprintf(stderr, "Error reading file %s: %s.\n", from, strerror(errno));
|
||||
break;
|
||||
}
|
||||
else if (readsize == 0)
|
||||
break; /* done reading */
|
||||
break; /* done reading */
|
||||
|
||||
if (gzwrite(gzfile, buffer, readsize) <= 0) {
|
||||
rval= -1; /* error happened in writing */
|
||||
rval = -1; /* error happened in writing */
|
||||
fprintf(stderr, "Error writing gz file %s: %s.\n", to, gzerror(gzfile, &err));
|
||||
break;
|
||||
}
|
||||
@@ -116,38 +116,38 @@ int BLI_file_gzip(const char *from, const char *to)
|
||||
char *BLI_file_ungzip_to_mem(const char *from_file, int *size_r)
|
||||
{
|
||||
gzFile gzfile;
|
||||
int readsize, size, alloc_size=0;
|
||||
char *mem= NULL;
|
||||
const int chunk_size= 512*1024;
|
||||
int readsize, size, alloc_size = 0;
|
||||
char *mem = NULL;
|
||||
const int chunk_size = 512 * 1024;
|
||||
|
||||
size= 0;
|
||||
size = 0;
|
||||
|
||||
gzfile = BLI_gzopen( from_file, "rb" );
|
||||
for (;;) {
|
||||
if (mem==NULL) {
|
||||
mem= MEM_callocN(chunk_size, "BLI_ungzip_to_mem");
|
||||
alloc_size= chunk_size;
|
||||
gzfile = BLI_gzopen(from_file, "rb");
|
||||
for (;; ) {
|
||||
if (mem == NULL) {
|
||||
mem = MEM_callocN(chunk_size, "BLI_ungzip_to_mem");
|
||||
alloc_size = chunk_size;
|
||||
}
|
||||
else {
|
||||
mem= MEM_reallocN(mem, size+chunk_size);
|
||||
alloc_size+= chunk_size;
|
||||
mem = MEM_reallocN(mem, size + chunk_size);
|
||||
alloc_size += chunk_size;
|
||||
}
|
||||
|
||||
readsize= gzread(gzfile, mem+size, chunk_size);
|
||||
if (readsize>0) {
|
||||
size+= readsize;
|
||||
readsize = gzread(gzfile, mem + size, chunk_size);
|
||||
if (readsize > 0) {
|
||||
size += readsize;
|
||||
}
|
||||
else break;
|
||||
}
|
||||
|
||||
if (size==0) {
|
||||
if (size == 0) {
|
||||
MEM_freeN(mem);
|
||||
mem= NULL;
|
||||
mem = NULL;
|
||||
}
|
||||
else if (alloc_size!=size)
|
||||
mem= MEM_reallocN(mem, size);
|
||||
else if (alloc_size != size)
|
||||
mem = MEM_reallocN(mem, size);
|
||||
|
||||
*size_r= size;
|
||||
*size_r = size;
|
||||
|
||||
return mem;
|
||||
}
|
||||
@@ -254,14 +254,14 @@ int BLI_delete(const char *file, int dir, int recursive)
|
||||
|
||||
if (recursive) {
|
||||
callLocalErrorCallBack("Recursive delete is unsupported on Windows");
|
||||
err= 1;
|
||||
err = 1;
|
||||
}
|
||||
else if (dir) {
|
||||
err= !RemoveDirectoryW(file_16);
|
||||
if (err) printf ("Unable to remove directory");
|
||||
err = !RemoveDirectoryW(file_16);
|
||||
if (err) printf("Unable to remove directory");
|
||||
}
|
||||
else {
|
||||
err= !DeleteFileW(file_16);
|
||||
err = !DeleteFileW(file_16);
|
||||
if (err) callLocalErrorCallBack("Unable to delete file");
|
||||
}
|
||||
|
||||
@@ -288,7 +288,7 @@ int BLI_move(const char *file, const char *to)
|
||||
|
||||
UTF16_ENCODE(file);
|
||||
UTF16_ENCODE(str);
|
||||
err= !MoveFileW(file_16, str_16);
|
||||
err = !MoveFileW(file_16, str_16);
|
||||
UTF16_UN_ENCODE(str);
|
||||
UTF16_UN_ENCODE(file);
|
||||
|
||||
@@ -350,7 +350,7 @@ void BLI_dir_create_recursive(const char *dirname)
|
||||
* blah1/blah2 (without slash) */
|
||||
|
||||
BLI_strncpy(tmp, dirname, sizeof(tmp));
|
||||
lslash= BLI_last_slash(tmp);
|
||||
lslash = BLI_last_slash(tmp);
|
||||
|
||||
if (lslash == tmp + strlen(tmp) - 1) {
|
||||
*lslash = 0;
|
||||
@@ -358,7 +358,7 @@ void BLI_dir_create_recursive(const char *dirname)
|
||||
|
||||
if (BLI_exists(tmp)) return;
|
||||
|
||||
lslash= BLI_last_slash(tmp);
|
||||
lslash = BLI_last_slash(tmp);
|
||||
if (lslash) {
|
||||
/* Split about the last slash and recurse */
|
||||
*lslash = 0;
|
||||
@@ -366,7 +366,7 @@ void BLI_dir_create_recursive(const char *dirname)
|
||||
}
|
||||
|
||||
if (dirname[0]) /* patch, this recursive loop tries to create a nameless directory */
|
||||
if (umkdir(dirname)==-1)
|
||||
if (umkdir(dirname) == -1)
|
||||
printf("Unable to create directory %s\n", dirname);
|
||||
}
|
||||
|
||||
@@ -394,7 +394,7 @@ enum {
|
||||
recursiveOp_Callback_Error = 2
|
||||
} recuresiveOp_Callback_Result;
|
||||
|
||||
typedef int (*recursiveOp_Callback) (const char *from, const char *to);
|
||||
typedef int (*recursiveOp_Callback)(const char *from, const char *to);
|
||||
|
||||
/* appending of filename to dir (ensures for buffer size before appending) */
|
||||
static void join_dirfile_alloc(char **dst, size_t *alloc_len, const char *dir, const char *file)
|
||||
@@ -680,11 +680,11 @@ static int copy_single_file(const char *from, const char *to)
|
||||
need_free = 0;
|
||||
}
|
||||
else {
|
||||
link_buffer = MEM_callocN(st.st_size+2, "copy_single_file link_buffer");
|
||||
link_buffer = MEM_callocN(st.st_size + 2, "copy_single_file link_buffer");
|
||||
need_free = 1;
|
||||
}
|
||||
|
||||
link_len = readlink(from, link_buffer, st.st_size+1);
|
||||
link_len = readlink(from, link_buffer, st.st_size + 1);
|
||||
if (link_len < 0) {
|
||||
perror("readlink");
|
||||
|
||||
@@ -706,10 +706,10 @@ static int copy_single_file(const char *from, const char *to)
|
||||
|
||||
return recursiveOp_Callback_OK;
|
||||
}
|
||||
else if (S_ISCHR (st.st_mode) ||
|
||||
S_ISBLK (st.st_mode) ||
|
||||
S_ISFIFO (st.st_mode) ||
|
||||
S_ISSOCK (st.st_mode))
|
||||
else if (S_ISCHR(st.st_mode) ||
|
||||
S_ISBLK(st.st_mode) ||
|
||||
S_ISFIFO(st.st_mode) ||
|
||||
S_ISSOCK(st.st_mode))
|
||||
{
|
||||
/* copy special type of file */
|
||||
if (mknod(to, st.st_mode, st.st_rdev)) {
|
||||
@@ -798,7 +798,7 @@ static char *check_destination(const char *file, const char *to)
|
||||
|
||||
if (!filename) {
|
||||
MEM_freeN(str);
|
||||
return (char*)to;
|
||||
return (char *)to;
|
||||
}
|
||||
|
||||
/* skip slash */
|
||||
@@ -814,7 +814,7 @@ static char *check_destination(const char *file, const char *to)
|
||||
}
|
||||
}
|
||||
|
||||
return (char*)to;
|
||||
return (char *)to;
|
||||
}
|
||||
|
||||
int BLI_copy(const char *file, const char *to)
|
||||
@@ -824,7 +824,7 @@ int BLI_copy(const char *file, const char *to)
|
||||
|
||||
ret = recursive_operation(file, actual_to, copy_callback_pre, copy_single_file, NULL);
|
||||
|
||||
if (actual_to!=to)
|
||||
if (actual_to != to)
|
||||
MEM_freeN(actual_to);
|
||||
|
||||
return ret;
|
||||
@@ -852,16 +852,16 @@ void BLI_dir_create_recursive(const char *dirname)
|
||||
tmp = static_buf;
|
||||
needs_free = 0;
|
||||
#else
|
||||
size = strlen(dirname)+1;
|
||||
size = strlen(dirname) + 1;
|
||||
tmp = MEM_callocN(size, "BLI_dir_create_recursive tmp");
|
||||
needs_free = 1;
|
||||
#endif
|
||||
|
||||
BLI_strncpy(tmp, dirname, size);
|
||||
|
||||
lslash= BLI_last_slash(tmp);
|
||||
lslash = BLI_last_slash(tmp);
|
||||
if (lslash) {
|
||||
/* Split about the last slash and recurse */
|
||||
/* Split about the last slash and recurse */
|
||||
*lslash = 0;
|
||||
BLI_dir_create_recursive(tmp);
|
||||
}
|
||||
|
||||
@@ -43,41 +43,41 @@ void BLI_jitterate1(float *jit1, float *jit2, int num, float rad1)
|
||||
int i, j, k;
|
||||
float vecx, vecy, dvecx, dvecy, x, y, len;
|
||||
|
||||
for (i = 2*num-2; i>=0 ; i-=2) {
|
||||
for (i = 2 * num - 2; i >= 0; i -= 2) {
|
||||
dvecx = dvecy = 0.0;
|
||||
x = jit1[i];
|
||||
y = jit1[i+1];
|
||||
for (j = 2*num-2; j>=0 ; j-=2) {
|
||||
y = jit1[i + 1];
|
||||
for (j = 2 * num - 2; j >= 0; j -= 2) {
|
||||
if (i != j) {
|
||||
vecx = jit1[j] - x - 1.0f;
|
||||
vecy = jit1[j+1] - y - 1.0f;
|
||||
for (k = 3; k>0 ; k--) {
|
||||
if ( fabsf(vecx)<rad1 && fabsf(vecy)<rad1) {
|
||||
len= sqrt(vecx*vecx + vecy*vecy);
|
||||
if (len>0 && len<rad1) {
|
||||
len= len/rad1;
|
||||
dvecx += vecx/len;
|
||||
dvecy += vecy/len;
|
||||
vecy = jit1[j + 1] - y - 1.0f;
|
||||
for (k = 3; k > 0; k--) {
|
||||
if (fabsf(vecx) < rad1 && fabsf(vecy) < rad1) {
|
||||
len = sqrt(vecx * vecx + vecy * vecy);
|
||||
if (len > 0 && len < rad1) {
|
||||
len = len / rad1;
|
||||
dvecx += vecx / len;
|
||||
dvecy += vecy / len;
|
||||
}
|
||||
}
|
||||
vecx += 1.0f;
|
||||
|
||||
if ( fabsf(vecx)<rad1 && fabsf(vecy)<rad1) {
|
||||
len= sqrt(vecx*vecx + vecy*vecy);
|
||||
if (len>0 && len<rad1) {
|
||||
len= len/rad1;
|
||||
dvecx += vecx/len;
|
||||
dvecy += vecy/len;
|
||||
if (fabsf(vecx) < rad1 && fabsf(vecy) < rad1) {
|
||||
len = sqrt(vecx * vecx + vecy * vecy);
|
||||
if (len > 0 && len < rad1) {
|
||||
len = len / rad1;
|
||||
dvecx += vecx / len;
|
||||
dvecy += vecy / len;
|
||||
}
|
||||
}
|
||||
vecx += 1.0f;
|
||||
|
||||
if ( fabsf(vecx)<rad1 && fabsf(vecy)<rad1) {
|
||||
len= sqrt(vecx*vecx + vecy*vecy);
|
||||
if (len>0 && len<rad1) {
|
||||
len= len/rad1;
|
||||
dvecx += vecx/len;
|
||||
dvecy += vecy/len;
|
||||
if (fabsf(vecx) < rad1 && fabsf(vecy) < rad1) {
|
||||
len = sqrt(vecx * vecx + vecy * vecy);
|
||||
if (len > 0 && len < rad1) {
|
||||
len = len / rad1;
|
||||
dvecx += vecx / len;
|
||||
dvecy += vecy / len;
|
||||
}
|
||||
}
|
||||
vecx -= 2.0f;
|
||||
@@ -86,12 +86,12 @@ void BLI_jitterate1(float *jit1, float *jit2, int num, float rad1)
|
||||
}
|
||||
}
|
||||
|
||||
x -= dvecx/18.0f;
|
||||
y -= dvecy/18.0f;
|
||||
x -= dvecx / 18.0f;
|
||||
y -= dvecy / 18.0f;
|
||||
x -= floorf(x);
|
||||
y -= floorf(y);
|
||||
jit2[i] = x;
|
||||
jit2[i+1] = y;
|
||||
jit2[i + 1] = y;
|
||||
}
|
||||
memcpy(jit1, jit2, 2 * num * sizeof(float));
|
||||
}
|
||||
@@ -101,36 +101,36 @@ void BLI_jitterate2(float *jit1, float *jit2, int num, float rad2)
|
||||
int i, j;
|
||||
float vecx, vecy, dvecx, dvecy, x, y;
|
||||
|
||||
for (i=2*num -2; i>= 0 ; i-=2) {
|
||||
for (i = 2 * num - 2; i >= 0; i -= 2) {
|
||||
dvecx = dvecy = 0.0;
|
||||
x = jit1[i];
|
||||
y = jit1[i+1];
|
||||
for (j =2*num -2; j>= 0 ; j-=2) {
|
||||
y = jit1[i + 1];
|
||||
for (j = 2 * num - 2; j >= 0; j -= 2) {
|
||||
if (i != j) {
|
||||
vecx = jit1[j] - x - 1.0f;
|
||||
vecy = jit1[j+1] - y - 1.0f;
|
||||
vecy = jit1[j + 1] - y - 1.0f;
|
||||
|
||||
if ( fabsf(vecx)<rad2) dvecx+= vecx*rad2;
|
||||
if (fabsf(vecx) < rad2) dvecx += vecx * rad2;
|
||||
vecx += 1.0f;
|
||||
if ( fabsf(vecx)<rad2) dvecx+= vecx*rad2;
|
||||
if (fabsf(vecx) < rad2) dvecx += vecx * rad2;
|
||||
vecx += 1.0f;
|
||||
if ( fabsf(vecx)<rad2) dvecx+= vecx*rad2;
|
||||
if (fabsf(vecx) < rad2) dvecx += vecx * rad2;
|
||||
|
||||
if ( fabsf(vecy)<rad2) dvecy+= vecy*rad2;
|
||||
if (fabsf(vecy) < rad2) dvecy += vecy * rad2;
|
||||
vecy += 1.0f;
|
||||
if ( fabsf(vecy)<rad2) dvecy+= vecy*rad2;
|
||||
if (fabsf(vecy) < rad2) dvecy += vecy * rad2;
|
||||
vecy += 1.0f;
|
||||
if ( fabsf(vecy)<rad2) dvecy+= vecy*rad2;
|
||||
if (fabsf(vecy) < rad2) dvecy += vecy * rad2;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
x -= dvecx/2.0f;
|
||||
y -= dvecy/2.0f;
|
||||
x -= dvecx / 2.0f;
|
||||
y -= dvecy / 2.0f;
|
||||
x -= floorf(x);
|
||||
y -= floorf(y);
|
||||
jit2[i] = x;
|
||||
jit2[i+1] = y;
|
||||
jit2[i + 1] = y;
|
||||
}
|
||||
memcpy(jit1, jit2, 2 * num * sizeof(float));
|
||||
}
|
||||
@@ -141,23 +141,23 @@ void BLI_jitter_init(float *jitarr, int num)
|
||||
float *jit2, x, rad1, rad2, rad3;
|
||||
int i;
|
||||
|
||||
if (num==0) return;
|
||||
if (num == 0) return;
|
||||
|
||||
jit2= MEM_mallocN(12 + 2*sizeof(float)*num, "initjit");
|
||||
rad1= 1.0f/sqrtf((float)num);
|
||||
rad2= 1.0f/((float)num);
|
||||
rad3= sqrtf((float)num)/((float)num);
|
||||
jit2 = MEM_mallocN(12 + 2 * sizeof(float) * num, "initjit");
|
||||
rad1 = 1.0f / sqrtf((float)num);
|
||||
rad2 = 1.0f / ((float)num);
|
||||
rad3 = sqrtf((float)num) / ((float)num);
|
||||
|
||||
BLI_srand(31415926 + num);
|
||||
x= 0;
|
||||
for (i=0; i<2*num; i+=2) {
|
||||
jitarr[i]= x+ rad1*(float)(0.5-BLI_drand());
|
||||
jitarr[i+1]= ((float)i/2)/num +rad1*(float)(0.5-BLI_drand());
|
||||
x+= rad3;
|
||||
x = 0;
|
||||
for (i = 0; i < 2 * num; i += 2) {
|
||||
jitarr[i] = x + rad1 * (float)(0.5 - BLI_drand());
|
||||
jitarr[i + 1] = ((float)i / 2) / num + rad1 * (float)(0.5 - BLI_drand());
|
||||
x += rad3;
|
||||
x -= floorf(x);
|
||||
}
|
||||
|
||||
for (i=0 ; i<24 ; i++) {
|
||||
for (i = 0; i < 24; i++) {
|
||||
BLI_jitterate1(jitarr, jit2, num, rad1);
|
||||
BLI_jitterate1(jitarr, jit2, num, rad1);
|
||||
BLI_jitterate2(jitarr, jit2, num, rad2);
|
||||
@@ -166,9 +166,9 @@ void BLI_jitter_init(float *jitarr, int num)
|
||||
MEM_freeN(jit2);
|
||||
|
||||
/* finally, move jittertab to be centered around (0,0) */
|
||||
for (i=0; i<2*num; i+=2) {
|
||||
for (i = 0; i < 2 * num; i += 2) {
|
||||
jitarr[i] -= 0.5f;
|
||||
jitarr[i+1] -= 0.5f;
|
||||
jitarr[i + 1] -= 0.5f;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -429,23 +429,23 @@ int isect_line_sphere_v3(const float l1[3], const float l2[3],
|
||||
*/
|
||||
|
||||
const float ldir[3] = {
|
||||
l2[0] - l1[0],
|
||||
l2[1] - l1[1],
|
||||
l2[2] - l1[2]
|
||||
l2[0] - l1[0],
|
||||
l2[1] - l1[1],
|
||||
l2[2] - l1[2]
|
||||
};
|
||||
|
||||
const float a = dot_v3v3(ldir, ldir);
|
||||
|
||||
const float b = 2.0f *
|
||||
(ldir[0] * (l1[0] - sp[0]) +
|
||||
ldir[1] * (l1[1] - sp[1]) +
|
||||
ldir[2] * (l1[2] - sp[2]));
|
||||
(ldir[0] * (l1[0] - sp[0]) +
|
||||
ldir[1] * (l1[1] - sp[1]) +
|
||||
ldir[2] * (l1[2] - sp[2]));
|
||||
|
||||
const float c =
|
||||
dot_v3v3(sp, sp) +
|
||||
dot_v3v3(l1, l1) -
|
||||
(2.0f * dot_v3v3(sp, l1)) -
|
||||
(r * r);
|
||||
dot_v3v3(sp, sp) +
|
||||
dot_v3v3(l1, l1) -
|
||||
(2.0f * dot_v3v3(sp, l1)) -
|
||||
(r * r);
|
||||
|
||||
const float i = b * b - 4.0f * a * c;
|
||||
|
||||
@@ -490,14 +490,14 @@ int isect_line_sphere_v2(const float l1[2], const float l2[2],
|
||||
const float a = dot_v2v2(ldir, ldir);
|
||||
|
||||
const float b = 2.0f *
|
||||
(ldir[0] * (l1[0] - sp[0]) +
|
||||
ldir[1] * (l1[1] - sp[1]));
|
||||
(ldir[0] * (l1[0] - sp[0]) +
|
||||
ldir[1] * (l1[1] - sp[1]));
|
||||
|
||||
const float c =
|
||||
dot_v2v2(sp, sp) +
|
||||
dot_v2v2(l1, l1) -
|
||||
(2.0f * dot_v2v2(sp, l1)) -
|
||||
(r * r);
|
||||
dot_v2v2(sp, sp) +
|
||||
dot_v2v2(l1, l1) -
|
||||
(2.0f * dot_v2v2(sp, l1)) -
|
||||
(r * r);
|
||||
|
||||
const float i = b * b - 4.0f * a * c;
|
||||
|
||||
@@ -1738,9 +1738,9 @@ void axis_dominant_v3(int *axis_a, int *axis_b, const float axis[3])
|
||||
const float yn = fabsf(axis[1]);
|
||||
const float zn = fabsf(axis[2]);
|
||||
|
||||
if (zn >= xn && zn >= yn) { *axis_a= 0; *axis_b = 1; }
|
||||
else if (yn >= xn && yn >= zn) { *axis_a= 0; *axis_b = 2; }
|
||||
else { *axis_a= 1; *axis_b = 2; }
|
||||
if (zn >= xn && zn >= yn) { *axis_a = 0; *axis_b = 1; }
|
||||
else if (yn >= xn && yn >= zn) { *axis_a = 0; *axis_b = 2; }
|
||||
else { *axis_a = 1; *axis_b = 2; }
|
||||
}
|
||||
|
||||
static float tri_signed_area(const float v1[3], const float v2[3], const float v3[3], const int i, const int j)
|
||||
|
||||
@@ -1691,12 +1691,13 @@ void quat_apply_track(float quat[4], short axis, short upflag)
|
||||
{
|
||||
/* rotations are hard coded to match vec_to_quat */
|
||||
const float quat_track[][4] = {
|
||||
{0.70710676908493, 0.0, -0.70710676908493, 0.0}, /* pos-y90 */
|
||||
{0.5, 0.5, 0.5, 0.5}, /* Quaternion((1,0,0), radians(90)) * Quaternion((0,1,0), radians(90)) */
|
||||
{0.70710676908493, 0.0, 0.0, 0.70710676908493}, /* pos-z90 */
|
||||
{0.70710676908493, 0.0, 0.70710676908493, 0.0}, /* neg-y90 */
|
||||
{0.5, -0.5, -0.5, 0.5}, /* Quaternion((1,0,0), radians(-90)) * Quaternion((0,1,0), radians(-90)) */
|
||||
{-3.0908619663705394e-08, 0.70710676908493, 0.70710676908493, 3.0908619663705394e-08}}; /* no rotation */
|
||||
{0.70710676908493, 0.0, -0.70710676908493, 0.0}, /* pos-y90 */
|
||||
{0.5, 0.5, 0.5, 0.5}, /* Quaternion((1,0,0), radians(90)) * Quaternion((0,1,0), radians(90)) */
|
||||
{0.70710676908493, 0.0, 0.0, 0.70710676908493}, /* pos-z90 */
|
||||
{0.70710676908493, 0.0, 0.70710676908493, 0.0}, /* neg-y90 */
|
||||
{0.5, -0.5, -0.5, 0.5}, /* Quaternion((1,0,0), radians(-90)) * Quaternion((0,1,0), radians(-90)) */
|
||||
{-3.0908619663705394e-08, 0.70710676908493, 0.70710676908493, 3.0908619663705394e-08} /* no rotation */
|
||||
};
|
||||
|
||||
assert(axis >= 0 && axis <= 5);
|
||||
assert(upflag >= 0 && upflag <= 2);
|
||||
|
||||
@@ -45,10 +45,10 @@ static float noise3_perlin(float vec[3]);
|
||||
//static float turbulence_perlin(float *point, float lofreq, float hifreq);
|
||||
//static float turbulencep(float noisesize, float x, float y, float z, int nr);
|
||||
|
||||
#define HASHVEC(x, y, z) hashvectf + 3 * hash[ (hash[ (hash[(z) & 255] + (y)) & 255] + (x)) & 255]
|
||||
#define HASHVEC(x, y, z) hashvectf + 3 * hash[(hash[(hash[(z) & 255] + (y)) & 255] + (x)) & 255]
|
||||
|
||||
/* needed for voronoi */
|
||||
#define HASHPNT(x, y, z) hashpntf + 3 * hash[ (hash[ (hash[(z) & 255] + (y)) & 255] + (x)) & 255]
|
||||
#define HASHPNT(x, y, z) hashpntf + 3 * hash[(hash[(hash[(z) & 255] + (y)) & 255] + (x)) & 255]
|
||||
static float hashpntf[768] = {
|
||||
0.536902, 0.020915, 0.501445, 0.216316, 0.517036, 0.822466, 0.965315,
|
||||
0.377313, 0.678764, 0.744545, 0.097731, 0.396357, 0.247202, 0.520897,
|
||||
@@ -162,7 +162,7 @@ static float hashpntf[768] = {
|
||||
0.114246, 0.905043, 0.713870, 0.555261, 0.951333
|
||||
};
|
||||
|
||||
unsigned char hash[512]= {
|
||||
unsigned char hash[512] = {
|
||||
0xA2, 0xA0, 0x19, 0x3B, 0xF8, 0xEB, 0xAA, 0xEE, 0xF3, 0x1C, 0x67, 0x28, 0x1D, 0xED, 0x0, 0xDE, 0x95, 0x2E, 0xDC,
|
||||
0x3F, 0x3A, 0x82, 0x35, 0x4D, 0x6C, 0xBA, 0x36, 0xD0, 0xF6, 0xC, 0x79, 0x32, 0xD1, 0x59, 0xF4, 0x8, 0x8B, 0x63,
|
||||
0x89, 0x2F, 0xB8, 0xB4, 0x97, 0x83, 0xF2, 0x8F, 0x18, 0xC7, 0x51, 0x14, 0x65, 0x87, 0x48, 0x20, 0x42, 0xA8, 0x80,
|
||||
@@ -193,7 +193,7 @@ unsigned char hash[512]= {
|
||||
};
|
||||
|
||||
|
||||
float hashvectf[768]= {
|
||||
float hashvectf[768] = {
|
||||
0.33783, 0.715698, -0.611206, -0.944031, -0.326599, -0.045624, -0.101074, -0.416443, -0.903503, 0.799286, 0.49411,
|
||||
-0.341949, -0.854645, 0.518036, 0.033936, 0.42514, -0.437866, -0.792114, -0.358948, 0.597046, 0.717377, -0.985413,
|
||||
0.144714, 0.089294, -0.601776, -0.33728, -0.723907, -0.449921, 0.594513, 0.666382, 0.208313, -0.10791, 0.972076,
|
||||
@@ -263,7 +263,7 @@ float hashvectf[768]= {
|
||||
0.196045, -0.982941, 0.164307, -0.082245, 0.233734, -0.97226, -0.005005, -0.747253, -0.611328, 0.260437, 0.645599,
|
||||
0.592773, 0.481384, 0.117706, -0.949524, -0.29068, -0.535004, -0.791901, -0.294312, -0.627167, -0.214447, 0.748718,
|
||||
-0.047974, -0.813477, -0.57959, -0.175537, 0.477264, -0.860992, 0.738556, -0.414246, -0.53183, 0.562561, -0.704071,
|
||||
0.433289, -0.754944, 0.64801, -0.100586, 0.114716, 0.044525, -0.992371, 0.966003, 0.244873, -0.082764,
|
||||
0.433289, -0.754944, 0.64801, -0.100586, 0.114716, 0.044525, -0.992371, 0.966003, 0.244873, -0.082764,
|
||||
};
|
||||
|
||||
/**************************/
|
||||
@@ -272,28 +272,28 @@ float hashvectf[768]= {
|
||||
|
||||
static float lerp(float t, float a, float b)
|
||||
{
|
||||
return (a+t*(b-a));
|
||||
return (a + t * (b - a));
|
||||
}
|
||||
|
||||
static float npfade(float t)
|
||||
{
|
||||
return (t*t*t*(t*(t*6.0f-15.0f)+10.0f));
|
||||
return (t * t * t * (t * (t * 6.0f - 15.0f) + 10.0f));
|
||||
}
|
||||
|
||||
static float grad(int hash, float x, float y, float z)
|
||||
{
|
||||
int h = hash & 15; // CONVERT LO 4 BITS OF HASH CODE
|
||||
float u = h<8 ? x : y, // INTO 12 GRADIENT DIRECTIONS.
|
||||
v = h<4 ? y : h==12||h==14 ? x : z;
|
||||
return ((h&1) == 0 ? u : -u) + ((h&2) == 0 ? v : -v);
|
||||
float u = h < 8 ? x : y, // INTO 12 GRADIENT DIRECTIONS.
|
||||
v = h < 4 ? y : h == 12 || h == 14 ? x : z;
|
||||
return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v);
|
||||
}
|
||||
|
||||
/* instead of adding another permutation array, just use hash table defined above */
|
||||
static float newPerlin(float x, float y, float z)
|
||||
{
|
||||
int A, AA, AB, B, BA, BB;
|
||||
float u=floor(x), v=floor(y), w=floor(z);
|
||||
int X=((int)u) & 255, Y=((int)v) & 255, Z=((int)w) & 255; // FIND UNIT CUBE THAT CONTAINS POINT
|
||||
float u = floor(x), v = floor(y), w = floor(z);
|
||||
int X = ((int)u) & 255, Y = ((int)v) & 255, Z = ((int)w) & 255; // FIND UNIT CUBE THAT CONTAINS POINT
|
||||
x -= u; // FIND RELATIVE X,Y,Z
|
||||
y -= v; // OF POINT IN CUBE.
|
||||
z -= w;
|
||||
@@ -315,7 +315,7 @@ static float newPerlin(float x, float y, float z)
|
||||
/* for use with BLI_gNoise()/BLI_gTurbulence(), returns unsigned improved perlin noise */
|
||||
static float newPerlinU(float x, float y, float z)
|
||||
{
|
||||
return (0.5f+0.5f*newPerlin(x, y, z));
|
||||
return (0.5f + 0.5f * newPerlin(x, y, z));
|
||||
}
|
||||
|
||||
|
||||
@@ -328,92 +328,92 @@ static float orgBlenderNoise(float x, float y, float z)
|
||||
{
|
||||
register float cn1, cn2, cn3, cn4, cn5, cn6, i, *h;
|
||||
float fx, fy, fz, ox, oy, oz, jx, jy, jz;
|
||||
float n= 0.5;
|
||||
float n = 0.5;
|
||||
int ix, iy, iz, b00, b01, b10, b11, b20, b21;
|
||||
|
||||
fx= floor(x);
|
||||
fy= floor(y);
|
||||
fz= floor(z);
|
||||
fx = floor(x);
|
||||
fy = floor(y);
|
||||
fz = floor(z);
|
||||
|
||||
ox= x- fx;
|
||||
oy= y- fy;
|
||||
oz= z- fz;
|
||||
ox = x - fx;
|
||||
oy = y - fy;
|
||||
oz = z - fz;
|
||||
|
||||
ix= (int)fx;
|
||||
iy= (int)fy;
|
||||
iz= (int)fz;
|
||||
ix = (int)fx;
|
||||
iy = (int)fy;
|
||||
iz = (int)fz;
|
||||
|
||||
jx= ox-1;
|
||||
jy= oy-1;
|
||||
jz= oz-1;
|
||||
jx = ox - 1;
|
||||
jy = oy - 1;
|
||||
jz = oz - 1;
|
||||
|
||||
cn1=ox*ox; cn2=oy*oy; cn3=oz*oz;
|
||||
cn4=jx*jx; cn5=jy*jy; cn6=jz*jz;
|
||||
cn1 = ox * ox; cn2 = oy * oy; cn3 = oz * oz;
|
||||
cn4 = jx * jx; cn5 = jy * jy; cn6 = jz * jz;
|
||||
|
||||
cn1= 1.0f-3.0f*cn1+2.0f*cn1*ox;
|
||||
cn2= 1.0f-3.0f*cn2+2.0f*cn2*oy;
|
||||
cn3= 1.0f-3.0f*cn3+2.0f*cn3*oz;
|
||||
cn4= 1.0f-3.0f*cn4-2.0f*cn4*jx;
|
||||
cn5= 1.0f-3.0f*cn5-2.0f*cn5*jy;
|
||||
cn6= 1.0f-3.0f*cn6-2.0f*cn6*jz;
|
||||
cn1 = 1.0f - 3.0f * cn1 + 2.0f * cn1 * ox;
|
||||
cn2 = 1.0f - 3.0f * cn2 + 2.0f * cn2 * oy;
|
||||
cn3 = 1.0f - 3.0f * cn3 + 2.0f * cn3 * oz;
|
||||
cn4 = 1.0f - 3.0f * cn4 - 2.0f * cn4 * jx;
|
||||
cn5 = 1.0f - 3.0f * cn5 - 2.0f * cn5 * jy;
|
||||
cn6 = 1.0f - 3.0f * cn6 - 2.0f * cn6 * jz;
|
||||
|
||||
b00= hash[ hash[ix & 255]+(iy & 255)];
|
||||
b10= hash[ hash[(ix+1) & 255]+(iy & 255)];
|
||||
b01= hash[ hash[ix & 255]+((iy+1) & 255)];
|
||||
b11= hash[ hash[(ix+1) & 255]+((iy+1) & 255)];
|
||||
b00 = hash[hash[ix & 255] + (iy & 255)];
|
||||
b10 = hash[hash[(ix + 1) & 255] + (iy & 255)];
|
||||
b01 = hash[hash[ix & 255] + ((iy + 1) & 255)];
|
||||
b11 = hash[hash[(ix + 1) & 255] + ((iy + 1) & 255)];
|
||||
|
||||
b20=iz & 255; b21= (iz+1) & 255;
|
||||
b20 = iz & 255; b21 = (iz + 1) & 255;
|
||||
|
||||
/* 0 */
|
||||
i= (cn1*cn2*cn3);
|
||||
h=hashvectf+ 3*hash[b20+b00];
|
||||
n+= i*(h[0]*ox+h[1]*oy+h[2]*oz);
|
||||
/* 1 */
|
||||
i= (cn1*cn2*cn6);
|
||||
h=hashvectf+ 3*hash[b21+b00];
|
||||
n+= i*(h[0]*ox+h[1]*oy+h[2]*jz);
|
||||
/* 2 */
|
||||
i= (cn1*cn5*cn3);
|
||||
h=hashvectf+ 3*hash[b20+b01];
|
||||
n+= i*(h[0]*ox+h[1]*jy+h[2]*oz);
|
||||
/* 3 */
|
||||
i= (cn1*cn5*cn6);
|
||||
h=hashvectf+ 3*hash[b21+b01];
|
||||
n+= i*(h[0]*ox+h[1]*jy+h[2]*jz);
|
||||
/* 4 */
|
||||
i= cn4*cn2*cn3;
|
||||
h=hashvectf+ 3*hash[b20+b10];
|
||||
n+= i*(h[0]*jx+h[1]*oy+h[2]*oz);
|
||||
/* 5 */
|
||||
i= cn4*cn2*cn6;
|
||||
h=hashvectf+ 3*hash[b21+b10];
|
||||
n+= i*(h[0]*jx+h[1]*oy+h[2]*jz);
|
||||
/* 6 */
|
||||
i= cn4*cn5*cn3;
|
||||
h=hashvectf+ 3*hash[b20+b11];
|
||||
n+= i*(h[0]*jx+h[1]*jy+h[2]*oz);
|
||||
/* 7 */
|
||||
i= (cn4*cn5*cn6);
|
||||
h=hashvectf+ 3*hash[b21+b11];
|
||||
n+= i*(h[0]*jx+h[1]*jy+h[2]*jz);
|
||||
/* 0 */
|
||||
i = (cn1 * cn2 * cn3);
|
||||
h = hashvectf + 3 * hash[b20 + b00];
|
||||
n += i * (h[0] * ox + h[1] * oy + h[2] * oz);
|
||||
/* 1 */
|
||||
i = (cn1 * cn2 * cn6);
|
||||
h = hashvectf + 3 * hash[b21 + b00];
|
||||
n += i * (h[0] * ox + h[1] * oy + h[2] * jz);
|
||||
/* 2 */
|
||||
i = (cn1 * cn5 * cn3);
|
||||
h = hashvectf + 3 * hash[b20 + b01];
|
||||
n += i * (h[0] * ox + h[1] * jy + h[2] * oz);
|
||||
/* 3 */
|
||||
i = (cn1 * cn5 * cn6);
|
||||
h = hashvectf + 3 * hash[b21 + b01];
|
||||
n += i * (h[0] * ox + h[1] * jy + h[2] * jz);
|
||||
/* 4 */
|
||||
i = cn4 * cn2 * cn3;
|
||||
h = hashvectf + 3 * hash[b20 + b10];
|
||||
n += i * (h[0] * jx + h[1] * oy + h[2] * oz);
|
||||
/* 5 */
|
||||
i = cn4 * cn2 * cn6;
|
||||
h = hashvectf + 3 * hash[b21 + b10];
|
||||
n += i * (h[0] * jx + h[1] * oy + h[2] * jz);
|
||||
/* 6 */
|
||||
i = cn4 * cn5 * cn3;
|
||||
h = hashvectf + 3 * hash[b20 + b11];
|
||||
n += i * (h[0] * jx + h[1] * jy + h[2] * oz);
|
||||
/* 7 */
|
||||
i = (cn4 * cn5 * cn6);
|
||||
h = hashvectf + 3 * hash[b21 + b11];
|
||||
n += i * (h[0] * jx + h[1] * jy + h[2] * jz);
|
||||
|
||||
if (n<0.0f) n=0.0f; else if (n>1.0f) n=1.0f;
|
||||
if (n < 0.0f) n = 0.0f; else if (n > 1.0f) n = 1.0f;
|
||||
return n;
|
||||
}
|
||||
|
||||
/* as orgBlenderNoise(), returning signed noise */
|
||||
static float orgBlenderNoiseS(float x, float y, float z)
|
||||
{
|
||||
return (2.0f*orgBlenderNoise(x, y, z)-1.0f);
|
||||
return (2.0f * orgBlenderNoise(x, y, z) - 1.0f);
|
||||
}
|
||||
|
||||
/* separated from orgBlenderNoise above, with scaling */
|
||||
float BLI_hnoise(float noisesize, float x, float y, float z)
|
||||
{
|
||||
if (noisesize==0.0f) return 0.0f;
|
||||
x= (1.0f+x)/noisesize;
|
||||
y= (1.0f+y)/noisesize;
|
||||
z= (1.0f+z)/noisesize;
|
||||
if (noisesize == 0.0f) return 0.0f;
|
||||
x = (1.0f + x) / noisesize;
|
||||
y = (1.0f + y) / noisesize;
|
||||
z = (1.0f + z) / noisesize;
|
||||
return orgBlenderNoise(x, y, z);
|
||||
}
|
||||
|
||||
@@ -421,53 +421,54 @@ float BLI_hnoise(float noisesize, float x, float y, float z)
|
||||
/* original turbulence functions */
|
||||
float BLI_turbulence(float noisesize, float x, float y, float z, int nr)
|
||||
{
|
||||
float s, d= 0.5, div=1.0;
|
||||
float s, d = 0.5, div = 1.0;
|
||||
|
||||
s= BLI_hnoise(noisesize, x, y, z);
|
||||
s = BLI_hnoise(noisesize, x, y, z);
|
||||
|
||||
while (nr>0) {
|
||||
while (nr > 0) {
|
||||
|
||||
s+= d*BLI_hnoise(noisesize*d, x, y, z);
|
||||
div+= d;
|
||||
d*= 0.5f;
|
||||
s += d * BLI_hnoise(noisesize * d, x, y, z);
|
||||
div += d;
|
||||
d *= 0.5f;
|
||||
|
||||
nr--;
|
||||
}
|
||||
return s/div;
|
||||
return s / div;
|
||||
}
|
||||
|
||||
float BLI_turbulence1(float noisesize, float x, float y, float z, int nr)
|
||||
{
|
||||
float s, d= 0.5, div=1.0;
|
||||
float s, d = 0.5, div = 1.0;
|
||||
|
||||
s= fabsf((-1.0f + 2.0f * BLI_hnoise(noisesize, x, y, z)));
|
||||
s = fabsf((-1.0f + 2.0f * BLI_hnoise(noisesize, x, y, z)));
|
||||
|
||||
while (nr>0) {
|
||||
while (nr > 0) {
|
||||
|
||||
s+= fabsf(d* (-1.0f+2.0f*BLI_hnoise(noisesize*d, x, y, z)));
|
||||
div+= d;
|
||||
d*= 0.5f;
|
||||
s += fabsf(d * (-1.0f + 2.0f * BLI_hnoise(noisesize * d, x, y, z)));
|
||||
div += d;
|
||||
d *= 0.5f;
|
||||
|
||||
nr--;
|
||||
}
|
||||
return s/div;
|
||||
return s / div;
|
||||
}
|
||||
|
||||
/* ********************* FROM PERLIN HIMSELF: ******************** */
|
||||
|
||||
static char p[512+2]= {
|
||||
0xA2,0xA0,0x19,0x3B,0xF8,0xEB,0xAA,0xEE,0xF3,0x1C,0x67,0x28,0x1D,0xED,0x0,0xDE,0x95,0x2E,0xDC,0x3F,0x3A,0x82,0x35,0x4D,0x6C,0xBA,0x36,0xD0,0xF6,0xC,0x79,0x32,0xD1,0x59,0xF4,0x8,0x8B,0x63,0x89,0x2F,0xB8,0xB4,0x97,0x83,0xF2,0x8F,0x18,0xC7,0x51,0x14,0x65,0x87,0x48,0x20,0x42,0xA8,0x80,0xB5,0x40,0x13,0xB2,0x22,0x7E,0x57,
|
||||
0xBC,0x7F,0x6B,0x9D,0x86,0x4C,0xC8,0xDB,0x7C,0xD5,0x25,0x4E,0x5A,0x55,0x74,0x50,0xCD,0xB3,0x7A,0xBB,0xC3,0xCB,0xB6,0xE2,0xE4,0xEC,0xFD,0x98,0xB,0x96,0xD3,0x9E,0x5C,0xA1,0x64,0xF1,0x81,0x61,0xE1,0xC4,0x24,0x72,0x49,0x8C,0x90,0x4B,0x84,0x34,0x38,0xAB,0x78,0xCA,0x1F,0x1,0xD7,0x93,0x11,0xC1,0x58,0xA9,0x31,0xF9,0x44,0x6D,
|
||||
0xBF,0x33,0x9C,0x5F,0x9,0x94,0xA3,0x85,0x6,0xC6,0x9A,0x1E,0x7B,0x46,0x15,0x30,0x27,0x2B,0x1B,0x71,0x3C,0x5B,0xD6,0x6F,0x62,0xAC,0x4F,0xC2,0xC0,0xE,0xB1,0x23,0xA7,0xDF,0x47,0xB0,0x77,0x69,0x5,0xE9,0xE6,0xE7,0x76,0x73,0xF,0xFE,0x6E,0x9B,0x56,0xEF,0x12,0xA5,0x37,0xFC,0xAE,0xD9,0x3,0x8E,0xDD,0x10,0xB9,0xCE,0xC9,0x8D,
|
||||
0xDA,0x2A,0xBD,0x68,0x17,0x9F,0xBE,0xD4,0xA,0xCC,0xD2,0xE8,0x43,0x3D,0x70,0xB7,0x2,0x7D,0x99,0xD8,0xD,0x60,0x8A,0x4,0x2C,0x3E,0x92,0xE5,0xAF,0x53,0x7,0xE0,0x29,0xA6,0xC5,0xE3,0xF5,0xF7,0x4A,0x41,0x26,0x6A,0x16,0x5E,0x52,0x2D,0x21,0xAD,0xF0,0x91,0xFF,0xEA,0x54,0xFA,0x66,0x1A,0x45,0x39,0xCF,0x75,0xA4,0x88,0xFB,0x5D,
|
||||
0xA2,0xA0,0x19,0x3B,0xF8,0xEB,0xAA,0xEE,0xF3,0x1C,0x67,0x28,0x1D,0xED,0x0,0xDE,0x95,0x2E,0xDC,0x3F,0x3A,0x82,0x35,0x4D,0x6C,0xBA,0x36,0xD0,0xF6,0xC,0x79,0x32,0xD1,0x59,0xF4,0x8,0x8B,0x63,0x89,0x2F,0xB8,0xB4,0x97,0x83,0xF2,0x8F,0x18,0xC7,0x51,0x14,0x65,0x87,0x48,0x20,0x42,0xA8,0x80,0xB5,0x40,0x13,0xB2,0x22,0x7E,0x57,
|
||||
0xBC,0x7F,0x6B,0x9D,0x86,0x4C,0xC8,0xDB,0x7C,0xD5,0x25,0x4E,0x5A,0x55,0x74,0x50,0xCD,0xB3,0x7A,0xBB,0xC3,0xCB,0xB6,0xE2,0xE4,0xEC,0xFD,0x98,0xB,0x96,0xD3,0x9E,0x5C,0xA1,0x64,0xF1,0x81,0x61,0xE1,0xC4,0x24,0x72,0x49,0x8C,0x90,0x4B,0x84,0x34,0x38,0xAB,0x78,0xCA,0x1F,0x1,0xD7,0x93,0x11,0xC1,0x58,0xA9,0x31,0xF9,0x44,0x6D,
|
||||
0xBF,0x33,0x9C,0x5F,0x9,0x94,0xA3,0x85,0x6,0xC6,0x9A,0x1E,0x7B,0x46,0x15,0x30,0x27,0x2B,0x1B,0x71,0x3C,0x5B,0xD6,0x6F,0x62,0xAC,0x4F,0xC2,0xC0,0xE,0xB1,0x23,0xA7,0xDF,0x47,0xB0,0x77,0x69,0x5,0xE9,0xE6,0xE7,0x76,0x73,0xF,0xFE,0x6E,0x9B,0x56,0xEF,0x12,0xA5,0x37,0xFC,0xAE,0xD9,0x3,0x8E,0xDD,0x10,0xB9,0xCE,0xC9,0x8D,
|
||||
0xDA,0x2A,0xBD,0x68,0x17,0x9F,0xBE,0xD4,0xA,0xCC,0xD2,0xE8,0x43,0x3D,0x70,0xB7,0x2,0x7D,0x99,0xD8,0xD,0x60,0x8A,0x4,0x2C,0x3E,0x92,0xE5,0xAF,0x53,0x7,0xE0,0x29,0xA6,0xC5,0xE3,0xF5,0xF7,0x4A,0x41,0x26,0x6A,0x16,0x5E,0x52,0x2D,0x21,0xAD,0xF0,0x91,0xFF,0xEA,0x54,0xFA,0x66,0x1A,0x45,0x39,0xCF,0x75,0xA4,0x88,0xFB,0x5D,
|
||||
0xA2,0xA0};
|
||||
static char p[512 + 2] = {
|
||||
0xA2, 0xA0, 0x19, 0x3B, 0xF8, 0xEB, 0xAA, 0xEE, 0xF3, 0x1C, 0x67, 0x28, 0x1D, 0xED, 0x0, 0xDE, 0x95, 0x2E, 0xDC, 0x3F, 0x3A, 0x82, 0x35, 0x4D, 0x6C, 0xBA, 0x36, 0xD0, 0xF6, 0xC, 0x79, 0x32, 0xD1, 0x59, 0xF4, 0x8, 0x8B, 0x63, 0x89, 0x2F, 0xB8, 0xB4, 0x97, 0x83, 0xF2, 0x8F, 0x18, 0xC7, 0x51, 0x14, 0x65, 0x87, 0x48, 0x20, 0x42, 0xA8, 0x80, 0xB5, 0x40, 0x13, 0xB2, 0x22, 0x7E, 0x57,
|
||||
0xBC, 0x7F, 0x6B, 0x9D, 0x86, 0x4C, 0xC8, 0xDB, 0x7C, 0xD5, 0x25, 0x4E, 0x5A, 0x55, 0x74, 0x50, 0xCD, 0xB3, 0x7A, 0xBB, 0xC3, 0xCB, 0xB6, 0xE2, 0xE4, 0xEC, 0xFD, 0x98, 0xB, 0x96, 0xD3, 0x9E, 0x5C, 0xA1, 0x64, 0xF1, 0x81, 0x61, 0xE1, 0xC4, 0x24, 0x72, 0x49, 0x8C, 0x90, 0x4B, 0x84, 0x34, 0x38, 0xAB, 0x78, 0xCA, 0x1F, 0x1, 0xD7, 0x93, 0x11, 0xC1, 0x58, 0xA9, 0x31, 0xF9, 0x44, 0x6D,
|
||||
0xBF, 0x33, 0x9C, 0x5F, 0x9, 0x94, 0xA3, 0x85, 0x6, 0xC6, 0x9A, 0x1E, 0x7B, 0x46, 0x15, 0x30, 0x27, 0x2B, 0x1B, 0x71, 0x3C, 0x5B, 0xD6, 0x6F, 0x62, 0xAC, 0x4F, 0xC2, 0xC0, 0xE, 0xB1, 0x23, 0xA7, 0xDF, 0x47, 0xB0, 0x77, 0x69, 0x5, 0xE9, 0xE6, 0xE7, 0x76, 0x73, 0xF, 0xFE, 0x6E, 0x9B, 0x56, 0xEF, 0x12, 0xA5, 0x37, 0xFC, 0xAE, 0xD9, 0x3, 0x8E, 0xDD, 0x10, 0xB9, 0xCE, 0xC9, 0x8D,
|
||||
0xDA, 0x2A, 0xBD, 0x68, 0x17, 0x9F, 0xBE, 0xD4, 0xA, 0xCC, 0xD2, 0xE8, 0x43, 0x3D, 0x70, 0xB7, 0x2, 0x7D, 0x99, 0xD8, 0xD, 0x60, 0x8A, 0x4, 0x2C, 0x3E, 0x92, 0xE5, 0xAF, 0x53, 0x7, 0xE0, 0x29, 0xA6, 0xC5, 0xE3, 0xF5, 0xF7, 0x4A, 0x41, 0x26, 0x6A, 0x16, 0x5E, 0x52, 0x2D, 0x21, 0xAD, 0xF0, 0x91, 0xFF, 0xEA, 0x54, 0xFA, 0x66, 0x1A, 0x45, 0x39, 0xCF, 0x75, 0xA4, 0x88, 0xFB, 0x5D,
|
||||
0xA2, 0xA0, 0x19, 0x3B, 0xF8, 0xEB, 0xAA, 0xEE, 0xF3, 0x1C, 0x67, 0x28, 0x1D, 0xED, 0x0, 0xDE, 0x95, 0x2E, 0xDC, 0x3F, 0x3A, 0x82, 0x35, 0x4D, 0x6C, 0xBA, 0x36, 0xD0, 0xF6, 0xC, 0x79, 0x32, 0xD1, 0x59, 0xF4, 0x8, 0x8B, 0x63, 0x89, 0x2F, 0xB8, 0xB4, 0x97, 0x83, 0xF2, 0x8F, 0x18, 0xC7, 0x51, 0x14, 0x65, 0x87, 0x48, 0x20, 0x42, 0xA8, 0x80, 0xB5, 0x40, 0x13, 0xB2, 0x22, 0x7E, 0x57,
|
||||
0xBC, 0x7F, 0x6B, 0x9D, 0x86, 0x4C, 0xC8, 0xDB, 0x7C, 0xD5, 0x25, 0x4E, 0x5A, 0x55, 0x74, 0x50, 0xCD, 0xB3, 0x7A, 0xBB, 0xC3, 0xCB, 0xB6, 0xE2, 0xE4, 0xEC, 0xFD, 0x98, 0xB, 0x96, 0xD3, 0x9E, 0x5C, 0xA1, 0x64, 0xF1, 0x81, 0x61, 0xE1, 0xC4, 0x24, 0x72, 0x49, 0x8C, 0x90, 0x4B, 0x84, 0x34, 0x38, 0xAB, 0x78, 0xCA, 0x1F, 0x1, 0xD7, 0x93, 0x11, 0xC1, 0x58, 0xA9, 0x31, 0xF9, 0x44, 0x6D,
|
||||
0xBF, 0x33, 0x9C, 0x5F, 0x9, 0x94, 0xA3, 0x85, 0x6, 0xC6, 0x9A, 0x1E, 0x7B, 0x46, 0x15, 0x30, 0x27, 0x2B, 0x1B, 0x71, 0x3C, 0x5B, 0xD6, 0x6F, 0x62, 0xAC, 0x4F, 0xC2, 0xC0, 0xE, 0xB1, 0x23, 0xA7, 0xDF, 0x47, 0xB0, 0x77, 0x69, 0x5, 0xE9, 0xE6, 0xE7, 0x76, 0x73, 0xF, 0xFE, 0x6E, 0x9B, 0x56, 0xEF, 0x12, 0xA5, 0x37, 0xFC, 0xAE, 0xD9, 0x3, 0x8E, 0xDD, 0x10, 0xB9, 0xCE, 0xC9, 0x8D,
|
||||
0xDA, 0x2A, 0xBD, 0x68, 0x17, 0x9F, 0xBE, 0xD4, 0xA, 0xCC, 0xD2, 0xE8, 0x43, 0x3D, 0x70, 0xB7, 0x2, 0x7D, 0x99, 0xD8, 0xD, 0x60, 0x8A, 0x4, 0x2C, 0x3E, 0x92, 0xE5, 0xAF, 0x53, 0x7, 0xE0, 0x29, 0xA6, 0xC5, 0xE3, 0xF5, 0xF7, 0x4A, 0x41, 0x26, 0x6A, 0x16, 0x5E, 0x52, 0x2D, 0x21, 0xAD, 0xF0, 0x91, 0xFF, 0xEA, 0x54, 0xFA, 0x66, 0x1A, 0x45, 0x39, 0xCF, 0x75, 0xA4, 0x88, 0xFB, 0x5D,
|
||||
0xA2, 0xA0
|
||||
};
|
||||
|
||||
|
||||
static float g[512+2][3]= {
|
||||
static float g[512 + 2][3] = {
|
||||
{0.33783, 0.715698, -0.611206},
|
||||
{-0.944031, -0.326599, -0.045624},
|
||||
{-0.101074, -0.416443, -0.903503},
|
||||
@@ -1005,15 +1006,15 @@ static float noise3_perlin(float vec[3])
|
||||
SETUP(vec[1], by0, by1, ry0, ry1);
|
||||
SETUP(vec[2], bz0, bz1, rz0, rz1);
|
||||
|
||||
i = p[ bx0 ];
|
||||
j = p[ bx1 ];
|
||||
i = p[bx0];
|
||||
j = p[bx1];
|
||||
|
||||
b00 = p[ i + by0 ];
|
||||
b10 = p[ j + by0 ];
|
||||
b01 = p[ i + by1 ];
|
||||
b11 = p[ j + by1 ];
|
||||
b00 = p[i + by0];
|
||||
b10 = p[j + by0];
|
||||
b01 = p[i + by1];
|
||||
b11 = p[j + by1];
|
||||
|
||||
#define VALUE_AT(rx,ry,rz) (rx * q[0] + ry * q[1] + rz * q[2])
|
||||
#define VALUE_AT(rx, ry, rz) (rx * q[0] + ry * q[1] + rz * q[2])
|
||||
#define SURVE(t) (t * t * (3.0f - 2.0f * t))
|
||||
|
||||
/* lerp moved to improved perlin above */
|
||||
@@ -1023,30 +1024,30 @@ static float noise3_perlin(float vec[3])
|
||||
sz = SURVE(rz0);
|
||||
|
||||
|
||||
q = g[ b00 + bz0 ];
|
||||
u = VALUE_AT(rx0,ry0,rz0);
|
||||
q = g[ b10 + bz0 ];
|
||||
v = VALUE_AT(rx1,ry0,rz0);
|
||||
q = g[b00 + bz0];
|
||||
u = VALUE_AT(rx0, ry0, rz0);
|
||||
q = g[b10 + bz0];
|
||||
v = VALUE_AT(rx1, ry0, rz0);
|
||||
a = lerp(sx, u, v);
|
||||
|
||||
q = g[ b01 + bz0 ];
|
||||
u = VALUE_AT(rx0,ry1,rz0);
|
||||
q = g[ b11 + bz0 ];
|
||||
v = VALUE_AT(rx1,ry1,rz0);
|
||||
q = g[b01 + bz0];
|
||||
u = VALUE_AT(rx0, ry1, rz0);
|
||||
q = g[b11 + bz0];
|
||||
v = VALUE_AT(rx1, ry1, rz0);
|
||||
b = lerp(sx, u, v);
|
||||
|
||||
c = lerp(sy, a, b); /* interpolate in y at lo x */
|
||||
|
||||
q = g[ b00 + bz1 ];
|
||||
u = VALUE_AT(rx0,ry0,rz1);
|
||||
q = g[ b10 + bz1 ];
|
||||
v = VALUE_AT(rx1,ry0,rz1);
|
||||
q = g[b00 + bz1];
|
||||
u = VALUE_AT(rx0, ry0, rz1);
|
||||
q = g[b10 + bz1];
|
||||
v = VALUE_AT(rx1, ry0, rz1);
|
||||
a = lerp(sx, u, v);
|
||||
|
||||
q = g[ b01 + bz1 ];
|
||||
u = VALUE_AT(rx0,ry1,rz1);
|
||||
q = g[ b11 + bz1 ];
|
||||
v = VALUE_AT(rx1,ry1,rz1);
|
||||
q = g[b01 + bz1];
|
||||
u = VALUE_AT(rx0, ry1, rz1);
|
||||
q = g[b11 + bz1];
|
||||
v = VALUE_AT(rx1, ry1, rz1);
|
||||
b = lerp(sx, u, v);
|
||||
|
||||
d = lerp(sy, a, b); /* interpolate in y at hi x */
|
||||
@@ -1067,7 +1068,7 @@ static float turbulence_perlin(float *point, float lofreq, float hifreq)
|
||||
p[2] = point[2];
|
||||
|
||||
t = 0;
|
||||
for (freq = lofreq ; freq < hifreq ; freq *= 2.0) {
|
||||
for (freq = lofreq; freq < hifreq; freq *= 2.0) {
|
||||
t += fabsf(noise3_perlin(p)) / freq;
|
||||
p[0] *= 2.0f;
|
||||
p[1] *= 2.0f;
|
||||
@@ -1096,7 +1097,7 @@ static float orgPerlinNoiseU(float x, float y, float z)
|
||||
v[0] = x;
|
||||
v[1] = y;
|
||||
v[2] = z;
|
||||
return (0.5f+0.5f*noise3_perlin(v));
|
||||
return (0.5f + 0.5f * noise3_perlin(v));
|
||||
}
|
||||
|
||||
/* *************** CALL AS: *************** */
|
||||
@@ -1105,9 +1106,9 @@ float BLI_hnoisep(float noisesize, float x, float y, float z)
|
||||
{
|
||||
float vec[3];
|
||||
|
||||
vec[0]= x/noisesize;
|
||||
vec[1]= y/noisesize;
|
||||
vec[2]= z/noisesize;
|
||||
vec[0] = x / noisesize;
|
||||
vec[1] = y / noisesize;
|
||||
vec[2] = z / noisesize;
|
||||
|
||||
return noise3_perlin(vec);
|
||||
}
|
||||
@@ -1117,11 +1118,11 @@ static float turbulencep(float noisesize, float x, float y, float z, int nr)
|
||||
{
|
||||
float vec[3];
|
||||
|
||||
vec[0]= x/noisesize;
|
||||
vec[1]= y/noisesize;
|
||||
vec[2]= z/noisesize;
|
||||
vec[0] = x / noisesize;
|
||||
vec[1] = y / noisesize;
|
||||
vec[2] = z / noisesize;
|
||||
nr++;
|
||||
return turbulence_perlin(vec, 1.0, (float)(1<<nr));
|
||||
return turbulence_perlin(vec, 1.0, (float)(1 << nr));
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1133,11 +1134,17 @@ static float turbulencep(float noisesize, float x, float y, float z, int nr)
|
||||
/* Camberra omitted, didn't seem useful */
|
||||
|
||||
/* distance squared */
|
||||
static float dist_Squared(float x, float y, float z, float e) { (void)e; return (x*x + y*y + z*z); }
|
||||
static float dist_Squared(float x, float y, float z, float e) {
|
||||
(void)e; return (x * x + y * y + z * z);
|
||||
}
|
||||
/* real distance */
|
||||
static float dist_Real(float x, float y, float z, float e) { (void)e; return sqrtf(x*x + y*y + z*z); }
|
||||
static float dist_Real(float x, float y, float z, float e) {
|
||||
(void)e; return sqrtf(x * x + y * y + z * z);
|
||||
}
|
||||
/* manhattan/taxicab/cityblock distance */
|
||||
static float dist_Manhattan(float x, float y, float z, float e) { (void)e; return (fabsf(x) + fabsf(y) + fabsf(z)); }
|
||||
static float dist_Manhattan(float x, float y, float z, float e) {
|
||||
(void)e; return (fabsf(x) + fabsf(y) + fabsf(z));
|
||||
}
|
||||
/* Chebychev */
|
||||
static float dist_Chebychev(float x, float y, float z, float e)
|
||||
{
|
||||
@@ -1147,8 +1154,8 @@ static float dist_Chebychev(float x, float y, float z, float e)
|
||||
x = fabsf(x);
|
||||
y = fabsf(y);
|
||||
z = fabsf(z);
|
||||
t = (x>y)?x:y;
|
||||
return ((z>t)?z:t);
|
||||
t = (x > y) ? x : y;
|
||||
return ((z > t) ? z : t);
|
||||
}
|
||||
|
||||
/* minkovsky preset exponent 0.5 */
|
||||
@@ -1156,7 +1163,7 @@ static float dist_MinkovskyH(float x, float y, float z, float e)
|
||||
{
|
||||
float d = sqrtf(fabsf(x)) + sqrtf(fabsf(y)) + sqrtf(fabsf(z));
|
||||
(void)e;
|
||||
return (d*d);
|
||||
return (d * d);
|
||||
}
|
||||
|
||||
/* minkovsky preset exponent 4 */
|
||||
@@ -1166,19 +1173,19 @@ static float dist_Minkovsky4(float x, float y, float z, float e)
|
||||
x *= x;
|
||||
y *= y;
|
||||
z *= z;
|
||||
return sqrtf(sqrtf(x*x + y*y + z*z));
|
||||
return sqrtf(sqrtf(x * x + y * y + z * z));
|
||||
}
|
||||
|
||||
/* Minkovsky, general case, slow, maybe too slow to be useful */
|
||||
static float dist_Minkovsky(float x, float y, float z, float e)
|
||||
{
|
||||
return powf(powf(fabsf(x), e) + powf(fabsf(y), e) + powf(fabsf(z), e), 1.0f/e);
|
||||
return powf(powf(fabsf(x), e) + powf(fabsf(y), e) + powf(fabsf(z), e), 1.0f / e);
|
||||
}
|
||||
|
||||
|
||||
/* Not 'pure' Worley, but the results are virtually the same.
|
||||
* Returns distances in da and point coords in pa */
|
||||
void voronoi(float x, float y, float z, float* da, float* pa, float me, int dtype)
|
||||
void voronoi(float x, float y, float z, float *da, float *pa, float me, int dtype)
|
||||
{
|
||||
int xx, yy, zz, xi, yi, zi;
|
||||
float xd, yd, zd, d, *p;
|
||||
@@ -1212,35 +1219,35 @@ void voronoi(float x, float y, float z, float* da, float* pa, float me, int dtyp
|
||||
yi = (int)(floor(y));
|
||||
zi = (int)(floor(z));
|
||||
da[0] = da[1] = da[2] = da[3] = 1e10f;
|
||||
for (xx=xi-1;xx<=xi+1;xx++) {
|
||||
for (yy=yi-1;yy<=yi+1;yy++) {
|
||||
for (zz=zi-1;zz<=zi+1;zz++) {
|
||||
for (xx = xi - 1; xx <= xi + 1; xx++) {
|
||||
for (yy = yi - 1; yy <= yi + 1; yy++) {
|
||||
for (zz = zi - 1; zz <= zi + 1; zz++) {
|
||||
p = HASHPNT(xx, yy, zz);
|
||||
xd = x - (p[0] + xx);
|
||||
yd = y - (p[1] + yy);
|
||||
zd = z - (p[2] + zz);
|
||||
d = distfunc(xd, yd, zd, me);
|
||||
if (d<da[0]) {
|
||||
da[3]=da[2]; da[2]=da[1]; da[1]=da[0]; da[0]=d;
|
||||
pa[9]=pa[6]; pa[10]=pa[7]; pa[11]=pa[8];
|
||||
pa[6]=pa[3]; pa[7]=pa[4]; pa[8]=pa[5];
|
||||
pa[3]=pa[0]; pa[4]=pa[1]; pa[5]=pa[2];
|
||||
pa[0]=p[0]+xx; pa[1]=p[1]+yy; pa[2]=p[2]+zz;
|
||||
if (d < da[0]) {
|
||||
da[3] = da[2]; da[2] = da[1]; da[1] = da[0]; da[0] = d;
|
||||
pa[9] = pa[6]; pa[10] = pa[7]; pa[11] = pa[8];
|
||||
pa[6] = pa[3]; pa[7] = pa[4]; pa[8] = pa[5];
|
||||
pa[3] = pa[0]; pa[4] = pa[1]; pa[5] = pa[2];
|
||||
pa[0] = p[0] + xx; pa[1] = p[1] + yy; pa[2] = p[2] + zz;
|
||||
}
|
||||
else if (d<da[1]) {
|
||||
da[3]=da[2]; da[2]=da[1]; da[1]=d;
|
||||
pa[9]=pa[6]; pa[10]=pa[7]; pa[11]=pa[8];
|
||||
pa[6]=pa[3]; pa[7]=pa[4]; pa[8]=pa[5];
|
||||
pa[3]=p[0]+xx; pa[4]=p[1]+yy; pa[5]=p[2]+zz;
|
||||
else if (d < da[1]) {
|
||||
da[3] = da[2]; da[2] = da[1]; da[1] = d;
|
||||
pa[9] = pa[6]; pa[10] = pa[7]; pa[11] = pa[8];
|
||||
pa[6] = pa[3]; pa[7] = pa[4]; pa[8] = pa[5];
|
||||
pa[3] = p[0] + xx; pa[4] = p[1] + yy; pa[5] = p[2] + zz;
|
||||
}
|
||||
else if (d<da[2]) {
|
||||
da[3]=da[2]; da[2]=d;
|
||||
pa[9]=pa[6]; pa[10]=pa[7]; pa[11]=pa[8];
|
||||
pa[6]=p[0]+xx; pa[7]=p[1]+yy; pa[8]=p[2]+zz;
|
||||
else if (d < da[2]) {
|
||||
da[3] = da[2]; da[2] = d;
|
||||
pa[9] = pa[6]; pa[10] = pa[7]; pa[11] = pa[8];
|
||||
pa[6] = p[0] + xx; pa[7] = p[1] + yy; pa[8] = p[2] + zz;
|
||||
}
|
||||
else if (d<da[3]) {
|
||||
da[3]=d;
|
||||
pa[9]=p[0]+xx; pa[10]=p[1]+yy; pa[11]=p[2]+zz;
|
||||
else if (d < da[3]) {
|
||||
da[3] = d;
|
||||
pa[9] = p[0] + xx; pa[10] = p[1] + yy; pa[11] = p[2] + zz;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1280,14 +1287,14 @@ static float voronoi_F1F2(float x, float y, float z)
|
||||
{
|
||||
float da[4], pa[12];
|
||||
voronoi(x, y, z, da, pa, 1, 0);
|
||||
return (da[1]-da[0]);
|
||||
return (da[1] - da[0]);
|
||||
}
|
||||
|
||||
/* Crackle type pattern, just a scale/clamp of F2-F1 */
|
||||
static float voronoi_Cr(float x, float y, float z)
|
||||
{
|
||||
float t = 10*voronoi_F1F2(x, y, z);
|
||||
if (t>1.f) return 1.f;
|
||||
float t = 10 * voronoi_F1F2(x, y, z);
|
||||
if (t > 1.f) return 1.f;
|
||||
return t;
|
||||
}
|
||||
|
||||
@@ -1298,43 +1305,43 @@ static float voronoi_F1S(float x, float y, float z)
|
||||
{
|
||||
float da[4], pa[12];
|
||||
voronoi(x, y, z, da, pa, 1, 0);
|
||||
return (2.0f*da[0]-1.0f);
|
||||
return (2.0f * da[0] - 1.0f);
|
||||
}
|
||||
|
||||
static float voronoi_F2S(float x, float y, float z)
|
||||
{
|
||||
float da[4], pa[12];
|
||||
voronoi(x, y, z, da, pa, 1, 0);
|
||||
return (2.0f*da[1]-1.0f);
|
||||
return (2.0f * da[1] - 1.0f);
|
||||
}
|
||||
|
||||
static float voronoi_F3S(float x, float y, float z)
|
||||
{
|
||||
float da[4], pa[12];
|
||||
voronoi(x, y, z, da, pa, 1, 0);
|
||||
return (2.0f*da[2]-1.0f);
|
||||
return (2.0f * da[2] - 1.0f);
|
||||
}
|
||||
|
||||
static float voronoi_F4S(float x, float y, float z)
|
||||
{
|
||||
float da[4], pa[12];
|
||||
voronoi(x, y, z, da, pa, 1, 0);
|
||||
return (2.0f*da[3]-1.0f);
|
||||
return (2.0f * da[3] - 1.0f);
|
||||
}
|
||||
|
||||
static float voronoi_F1F2S(float x, float y, float z)
|
||||
{
|
||||
float da[4], pa[12];
|
||||
voronoi(x, y, z, da, pa, 1, 0);
|
||||
return (2.0f*(da[1]-da[0])-1.0f);
|
||||
return (2.0f * (da[1] - da[0]) - 1.0f);
|
||||
}
|
||||
|
||||
/* Crackle type pattern, just a scale/clamp of F2-F1 */
|
||||
static float voronoi_CrS(float x, float y, float z)
|
||||
{
|
||||
float t = 10*voronoi_F1F2(x, y, z);
|
||||
if (t>1.f) return 1.f;
|
||||
return (2.0f*t-1.0f);
|
||||
float t = 10 * voronoi_F1F2(x, y, z);
|
||||
if (t > 1.f) return 1.f;
|
||||
return (2.0f * t - 1.0f);
|
||||
}
|
||||
|
||||
|
||||
@@ -1352,15 +1359,15 @@ static float cellNoiseU(float x, float y, float z)
|
||||
int xi = (int)(floor(x));
|
||||
int yi = (int)(floor(y));
|
||||
int zi = (int)(floor(z));
|
||||
unsigned int n = xi + yi*1301 + zi*314159;
|
||||
n ^= (n<<13);
|
||||
return ((float)(n*(n*n*15731 + 789221) + 1376312589) / 4294967296.0f);
|
||||
unsigned int n = xi + yi * 1301 + zi * 314159;
|
||||
n ^= (n << 13);
|
||||
return ((float)(n * (n * n * 15731 + 789221) + 1376312589) / 4294967296.0f);
|
||||
}
|
||||
|
||||
/* idem, signed */
|
||||
float cellNoise(float x, float y, float z)
|
||||
{
|
||||
return (2.0f*cellNoiseU(x, y, z)-1.0f);
|
||||
return (2.0f * cellNoiseU(x, y, z) - 1.0f);
|
||||
}
|
||||
|
||||
/* returns a vector/point/color in ca, using point hasharray directly */
|
||||
@@ -1423,14 +1430,14 @@ float BLI_gNoise(float noisesize, float x, float y, float z, int hard, int noise
|
||||
}
|
||||
}
|
||||
|
||||
if (noisesize!=0.0f) {
|
||||
noisesize = 1.0f/noisesize;
|
||||
if (noisesize != 0.0f) {
|
||||
noisesize = 1.0f / noisesize;
|
||||
x *= noisesize;
|
||||
y *= noisesize;
|
||||
z *= noisesize;
|
||||
}
|
||||
|
||||
if (hard) return fabsf(2.0f*noisefunc(x, y, z)-1.0f);
|
||||
if (hard) return fabsf(2.0f * noisefunc(x, y, z) - 1.0f);
|
||||
return noisefunc(x, y, z);
|
||||
}
|
||||
|
||||
@@ -1438,7 +1445,7 @@ float BLI_gNoise(float noisesize, float x, float y, float z, int hard, int noise
|
||||
float BLI_gTurbulence(float noisesize, float x, float y, float z, int oct, int hard, int noisebasis)
|
||||
{
|
||||
float (*noisefunc)(float, float, float);
|
||||
float sum, t, amp=1, fscale=1;
|
||||
float sum, t, amp = 1, fscale = 1;
|
||||
int i;
|
||||
|
||||
switch (noisebasis) {
|
||||
@@ -1477,21 +1484,21 @@ float BLI_gTurbulence(float noisesize, float x, float y, float z, int oct, int h
|
||||
z += 1;
|
||||
}
|
||||
|
||||
if (noisesize!=0.0f) {
|
||||
noisesize = 1.0f/noisesize;
|
||||
if (noisesize != 0.0f) {
|
||||
noisesize = 1.0f / noisesize;
|
||||
x *= noisesize;
|
||||
y *= noisesize;
|
||||
z *= noisesize;
|
||||
}
|
||||
|
||||
sum = 0;
|
||||
for (i=0;i<=oct;i++, amp*=0.5f, fscale*=2.0f) {
|
||||
t = noisefunc(fscale*x, fscale*y, fscale*z);
|
||||
if (hard) t = fabsf(2.0f*t-1.0f);
|
||||
for (i = 0; i <= oct; i++, amp *= 0.5f, fscale *= 2.0f) {
|
||||
t = noisefunc(fscale * x, fscale * y, fscale * z);
|
||||
if (hard) t = fabsf(2.0f * t - 1.0f);
|
||||
sum += t * amp;
|
||||
}
|
||||
|
||||
sum *= ((float)(1<<oct)/(float)((1<<(oct+1))-1));
|
||||
sum *= ((float)(1 << oct) / (float)((1 << (oct + 1)) - 1));
|
||||
|
||||
return sum;
|
||||
|
||||
@@ -1513,8 +1520,8 @@ float BLI_gTurbulence(float noisesize, float x, float y, float z, int oct, int h
|
||||
*/
|
||||
float mg_fBm(float x, float y, float z, float H, float lacunarity, float octaves, int noisebasis)
|
||||
{
|
||||
float rmd, value=0.0, pwr=1.0, pwHL=powf(lacunarity, -H);
|
||||
int i;
|
||||
float rmd, value = 0.0, pwr = 1.0, pwHL = powf(lacunarity, -H);
|
||||
int i;
|
||||
|
||||
float (*noisefunc)(float, float, float);
|
||||
switch (noisebasis) {
|
||||
@@ -1551,7 +1558,7 @@ float mg_fBm(float x, float y, float z, float H, float lacunarity, float octaves
|
||||
}
|
||||
}
|
||||
|
||||
for (i=0; i<(int)octaves; i++) {
|
||||
for (i = 0; i < (int)octaves; i++) {
|
||||
value += noisefunc(x, y, z) * pwr;
|
||||
pwr *= pwHL;
|
||||
x *= lacunarity;
|
||||
@@ -1560,7 +1567,7 @@ float mg_fBm(float x, float y, float z, float H, float lacunarity, float octaves
|
||||
}
|
||||
|
||||
rmd = octaves - floorf(octaves);
|
||||
if (rmd!=0.f) value += rmd * noisefunc(x, y, z) * pwr;
|
||||
if (rmd != 0.f) value += rmd * noisefunc(x, y, z) * pwr;
|
||||
|
||||
return value;
|
||||
|
||||
@@ -1583,7 +1590,7 @@ float mg_fBm(float x, float y, float z, float H, float lacunarity, float octaves
|
||||
* I modified it to something that made sense to me, so it might be wrong... */
|
||||
float mg_MultiFractal(float x, float y, float z, float H, float lacunarity, float octaves, int noisebasis)
|
||||
{
|
||||
float rmd, value=1.0, pwr=1.0, pwHL=powf(lacunarity, -H);
|
||||
float rmd, value = 1.0, pwr = 1.0, pwHL = powf(lacunarity, -H);
|
||||
int i;
|
||||
|
||||
float (*noisefunc)(float, float, float);
|
||||
@@ -1621,7 +1628,7 @@ float mg_MultiFractal(float x, float y, float z, float H, float lacunarity, floa
|
||||
}
|
||||
}
|
||||
|
||||
for (i=0; i<(int)octaves; i++) {
|
||||
for (i = 0; i < (int)octaves; i++) {
|
||||
value *= (pwr * noisefunc(x, y, z) + 1.0f);
|
||||
pwr *= pwHL;
|
||||
x *= lacunarity;
|
||||
@@ -1629,7 +1636,7 @@ float mg_MultiFractal(float x, float y, float z, float H, float lacunarity, floa
|
||||
z *= lacunarity;
|
||||
}
|
||||
rmd = octaves - floorf(octaves);
|
||||
if (rmd!=0.0f) value *= (rmd * noisefunc(x, y, z) * pwr + 1.0f);
|
||||
if (rmd != 0.0f) value *= (rmd * noisefunc(x, y, z) * pwr + 1.0f);
|
||||
|
||||
return value;
|
||||
|
||||
@@ -1647,10 +1654,10 @@ float mg_MultiFractal(float x, float y, float z, float H, float lacunarity, floa
|
||||
*/
|
||||
float mg_HeteroTerrain(float x, float y, float z, float H, float lacunarity, float octaves, float offset, int noisebasis)
|
||||
{
|
||||
float value, increment, rmd;
|
||||
float value, increment, rmd;
|
||||
int i;
|
||||
float pwHL = powf(lacunarity, -H);
|
||||
float pwr = pwHL; /* starts with i=1 instead of 0 */
|
||||
float pwr = pwHL; /* starts with i=1 instead of 0 */
|
||||
|
||||
float (*noisefunc)(float, float, float);
|
||||
switch (noisebasis) {
|
||||
@@ -1693,7 +1700,7 @@ float mg_HeteroTerrain(float x, float y, float z, float H, float lacunarity, flo
|
||||
y *= lacunarity;
|
||||
z *= lacunarity;
|
||||
|
||||
for (i=1; i<(int)octaves; i++) {
|
||||
for (i = 1; i < (int)octaves; i++) {
|
||||
increment = (noisefunc(x, y, z) + offset) * pwr * value;
|
||||
value += increment;
|
||||
pwr *= pwHL;
|
||||
@@ -1703,7 +1710,7 @@ float mg_HeteroTerrain(float x, float y, float z, float H, float lacunarity, flo
|
||||
}
|
||||
|
||||
rmd = octaves - floorf(octaves);
|
||||
if (rmd!=0.0f) {
|
||||
if (rmd != 0.0f) {
|
||||
increment = (noisefunc(x, y, z) + offset) * pwr * value;
|
||||
value += rmd * increment;
|
||||
}
|
||||
@@ -1723,7 +1730,7 @@ float mg_HybridMultiFractal(float x, float y, float z, float H, float lacunarity
|
||||
float result, signal, weight, rmd;
|
||||
int i;
|
||||
float pwHL = powf(lacunarity, -H);
|
||||
float pwr = pwHL; /* starts with i=1 instead of 0 */
|
||||
float pwr = pwHL; /* starts with i=1 instead of 0 */
|
||||
float (*noisefunc)(float, float, float);
|
||||
|
||||
switch (noisebasis) {
|
||||
@@ -1766,8 +1773,8 @@ float mg_HybridMultiFractal(float x, float y, float z, float H, float lacunarity
|
||||
y *= lacunarity;
|
||||
z *= lacunarity;
|
||||
|
||||
for (i=1; (weight>0.001f) && (i<(int)octaves); i++) {
|
||||
if (weight>1.0f) weight=1.0f;
|
||||
for (i = 1; (weight > 0.001f) && (i < (int)octaves); i++) {
|
||||
if (weight > 1.0f) weight = 1.0f;
|
||||
signal = (noisefunc(x, y, z) + offset) * pwr;
|
||||
pwr *= pwHL;
|
||||
result += weight * signal;
|
||||
@@ -1778,7 +1785,7 @@ float mg_HybridMultiFractal(float x, float y, float z, float H, float lacunarity
|
||||
}
|
||||
|
||||
rmd = octaves - floorf(octaves);
|
||||
if (rmd!=0.f) result += rmd * ((noisefunc(x, y, z) + offset) * pwr);
|
||||
if (rmd != 0.f) result += rmd * ((noisefunc(x, y, z) + offset) * pwr);
|
||||
|
||||
return result;
|
||||
|
||||
@@ -1796,9 +1803,9 @@ float mg_HybridMultiFractal(float x, float y, float z, float H, float lacunarity
|
||||
float mg_RidgedMultiFractal(float x, float y, float z, float H, float lacunarity, float octaves, float offset, float gain, int noisebasis)
|
||||
{
|
||||
float result, signal, weight;
|
||||
int i;
|
||||
int i;
|
||||
float pwHL = powf(lacunarity, -H);
|
||||
float pwr = pwHL; /* starts with i=1 instead of 0 */
|
||||
float pwr = pwHL; /* starts with i=1 instead of 0 */
|
||||
|
||||
float (*noisefunc)(float, float, float);
|
||||
switch (noisebasis) {
|
||||
@@ -1840,12 +1847,12 @@ float mg_RidgedMultiFractal(float x, float y, float z, float H, float lacunarity
|
||||
result = signal;
|
||||
|
||||
|
||||
for ( i=1; i<(int)octaves; i++ ) {
|
||||
for (i = 1; i < (int)octaves; i++) {
|
||||
x *= lacunarity;
|
||||
y *= lacunarity;
|
||||
z *= lacunarity;
|
||||
weight = signal * gain;
|
||||
if (weight>1.0f) weight=1.0f; else if (weight<0.0f) weight=0.0f;
|
||||
if (weight > 1.0f) weight = 1.0f; else if (weight < 0.0f) weight = 0.0f;
|
||||
signal = offset - fabsf(noisefunc(x, y, z));
|
||||
signal *= signal;
|
||||
signal *= weight;
|
||||
@@ -1934,10 +1941,10 @@ float mg_VLNoise(float x, float y, float z, float distortion, int nbas1, int nba
|
||||
}
|
||||
|
||||
/* get a random vector and scale the randomization */
|
||||
rv[0] = noisefunc1(x+13.5f, y+13.5f, z+13.5f) * distortion;
|
||||
rv[0] = noisefunc1(x + 13.5f, y + 13.5f, z + 13.5f) * distortion;
|
||||
rv[1] = noisefunc1(x, y, z) * distortion;
|
||||
rv[2] = noisefunc1(x-13.5f, y-13.5f, z-13.5f) * distortion;
|
||||
return noisefunc2(x+rv[0], y+rv[1], z+rv[2]); /* distorted-domain noise */
|
||||
rv[2] = noisefunc1(x - 13.5f, y - 13.5f, z - 13.5f) * distortion;
|
||||
return noisefunc2(x + rv[0], y + rv[1], z + rv[2]); /* distorted-domain noise */
|
||||
}
|
||||
|
||||
/****************/
|
||||
|
||||
@@ -41,22 +41,22 @@
|
||||
#include "BLI_rand.h"
|
||||
|
||||
#if defined(WIN32) && !defined(FREE_WINDOWS)
|
||||
typedef unsigned __int64 r_uint64;
|
||||
typedef unsigned __int64 r_uint64;
|
||||
|
||||
#define MULTIPLIER 0x5DEECE66Di64
|
||||
#define MASK 0x0000FFFFFFFFFFFFi64
|
||||
#define MULTIPLIER 0x5DEECE66Di64
|
||||
#define MASK 0x0000FFFFFFFFFFFFi64
|
||||
#else
|
||||
typedef unsigned long long r_uint64;
|
||||
typedef unsigned long long r_uint64;
|
||||
|
||||
#define MULTIPLIER 0x5DEECE66Dll
|
||||
#define MASK 0x0000FFFFFFFFFFFFll
|
||||
#define MULTIPLIER 0x5DEECE66Dll
|
||||
#define MASK 0x0000FFFFFFFFFFFFll
|
||||
#endif
|
||||
|
||||
#define ADDEND 0xB
|
||||
#define ADDEND 0xB
|
||||
|
||||
#define LOWSEED 0x330E
|
||||
#define LOWSEED 0x330E
|
||||
|
||||
extern unsigned char hash[]; // noise.c
|
||||
extern unsigned char hash[]; // noise.c
|
||||
|
||||
/***/
|
||||
|
||||
@@ -64,7 +64,7 @@ struct RNG {
|
||||
r_uint64 X;
|
||||
};
|
||||
|
||||
RNG *rng_new(unsigned int seed)
|
||||
RNG *rng_new(unsigned int seed)
|
||||
{
|
||||
RNG *rng = MEM_mallocN(sizeof(*rng), "rng");
|
||||
|
||||
@@ -73,39 +73,39 @@ RNG *rng_new(unsigned int seed)
|
||||
return rng;
|
||||
}
|
||||
|
||||
void rng_free(RNG* rng)
|
||||
void rng_free(RNG *rng)
|
||||
{
|
||||
MEM_freeN(rng);
|
||||
}
|
||||
|
||||
void rng_seed(RNG *rng, unsigned int seed)
|
||||
{
|
||||
rng->X= (((r_uint64) seed)<<16) | LOWSEED;
|
||||
rng->X = (((r_uint64) seed) << 16) | LOWSEED;
|
||||
}
|
||||
|
||||
void rng_srandom(RNG *rng, unsigned int seed)
|
||||
{
|
||||
rng_seed(rng, seed + hash[seed & 255]);
|
||||
seed= rng_getInt(rng);
|
||||
seed = rng_getInt(rng);
|
||||
rng_seed(rng, seed + hash[seed & 255]);
|
||||
seed= rng_getInt(rng);
|
||||
seed = rng_getInt(rng);
|
||||
rng_seed(rng, seed + hash[seed & 255]);
|
||||
}
|
||||
|
||||
int rng_getInt(RNG *rng)
|
||||
{
|
||||
rng->X= (MULTIPLIER*rng->X + ADDEND)&MASK;
|
||||
return (int) (rng->X>>17);
|
||||
rng->X = (MULTIPLIER * rng->X + ADDEND) & MASK;
|
||||
return (int) (rng->X >> 17);
|
||||
}
|
||||
|
||||
double rng_getDouble(RNG *rng)
|
||||
{
|
||||
return (double) rng_getInt(rng)/0x80000000;
|
||||
return (double) rng_getInt(rng) / 0x80000000;
|
||||
}
|
||||
|
||||
float rng_getFloat(RNG *rng)
|
||||
{
|
||||
return (float) rng_getInt(rng)/0x80000000;
|
||||
return (float) rng_getInt(rng) / 0x80000000;
|
||||
}
|
||||
|
||||
void rng_shuffleArray(RNG *rng, void *data, int elemSize, int numElems)
|
||||
@@ -122,10 +122,10 @@ void rng_shuffleArray(RNG *rng, void *data, int elemSize, int numElems)
|
||||
/* XXX Shouldn't it rather be "while (i--) {" ?
|
||||
* Else we have no guaranty first (0) element has a chance to be shuffled... --mont29 */
|
||||
while (--i) {
|
||||
int j = rng_getInt(rng)%numElems;
|
||||
if (i!=j) {
|
||||
void *iElem = (unsigned char*)data + i*elemSize;
|
||||
void *jElem = (unsigned char*)data + j*elemSize;
|
||||
int j = rng_getInt(rng) % numElems;
|
||||
if (i != j) {
|
||||
void *iElem = (unsigned char *)data + i * elemSize;
|
||||
void *jElem = (unsigned char *)data + j * elemSize;
|
||||
memcpy(temp, iElem, elemSize);
|
||||
memcpy(iElem, jElem, elemSize);
|
||||
memcpy(jElem, temp, elemSize);
|
||||
@@ -139,7 +139,7 @@ void rng_skip(RNG *rng, int n)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=0; i<n; i++)
|
||||
for (i = 0; i < n; i++)
|
||||
rng_getInt(rng);
|
||||
}
|
||||
|
||||
@@ -177,10 +177,10 @@ float BLI_frand(void)
|
||||
void BLI_fillrand(void *addr, int len)
|
||||
{
|
||||
RNG rng;
|
||||
unsigned char *p= addr;
|
||||
unsigned char *p = addr;
|
||||
|
||||
rng_seed(&rng, (unsigned int) (PIL_check_seconds_timer()*0x7FFFFFFF));
|
||||
while (len--) *p++= rng_getInt(&rng)&0xFF;
|
||||
rng_seed(&rng, (unsigned int) (PIL_check_seconds_timer() * 0x7FFFFFFF));
|
||||
while (len--) *p++ = rng_getInt(&rng) & 0xFF;
|
||||
}
|
||||
|
||||
void BLI_array_randomize(void *data, int elemSize, int numElems, unsigned int seed)
|
||||
@@ -198,12 +198,12 @@ static RNG rng_tab[BLENDER_MAX_THREADS];
|
||||
void BLI_thread_srandom(int thread, unsigned int seed)
|
||||
{
|
||||
if (thread >= BLENDER_MAX_THREADS)
|
||||
thread= 0;
|
||||
thread = 0;
|
||||
|
||||
rng_seed(&rng_tab[thread], seed + hash[seed & 255]);
|
||||
seed= rng_getInt(&rng_tab[thread]);
|
||||
seed = rng_getInt(&rng_tab[thread]);
|
||||
rng_seed(&rng_tab[thread], seed + hash[seed & 255]);
|
||||
seed= rng_getInt(&rng_tab[thread]);
|
||||
seed = rng_getInt(&rng_tab[thread]);
|
||||
rng_seed(&rng_tab[thread], seed + hash[seed & 255]);
|
||||
}
|
||||
|
||||
|
||||
@@ -40,8 +40,8 @@
|
||||
*
|
||||
* note: these have the SMHASH suffix because we may want to make them public.
|
||||
*/
|
||||
#define SMHASH_CELL_UNUSED ((void *)0x7FFFFFFF)
|
||||
#define SMHASH_CELL_FREE ((void *)0x7FFFFFFD)
|
||||
#define SMHASH_CELL_UNUSED ((void *)0x7FFFFFFF)
|
||||
#define SMHASH_CELL_FREE ((void *)0x7FFFFFFD)
|
||||
|
||||
#define SMHASH_NONZERO(n) ((n) + !(n))
|
||||
#define SMHASH_NEXT(h, hoff) ABS(((h) + ((hoff = SMHASH_NONZERO(hoff * 2) + 1), hoff)))
|
||||
@@ -80,7 +80,7 @@ void BLI_smallhash_release(SmallHash *hash)
|
||||
|
||||
void BLI_smallhash_insert(SmallHash *hash, uintptr_t key, void *item)
|
||||
{
|
||||
int h, hoff=1;
|
||||
int h, hoff = 1;
|
||||
|
||||
if (hash->size < hash->used * 3) {
|
||||
int newsize = hashsizes[++hash->curhash];
|
||||
@@ -103,7 +103,7 @@ void BLI_smallhash_insert(SmallHash *hash, uintptr_t key, void *item)
|
||||
hash->table[i].val = SMHASH_CELL_FREE;
|
||||
}
|
||||
|
||||
for (i = 0; i<hashsizes[hash->curhash - 1]; i++) {
|
||||
for (i = 0; i < hashsizes[hash->curhash - 1]; i++) {
|
||||
if (ELEM(tmp[i].val, SMHASH_CELL_UNUSED, SMHASH_CELL_FREE)) {
|
||||
continue;
|
||||
}
|
||||
@@ -141,7 +141,7 @@ void BLI_smallhash_insert(SmallHash *hash, uintptr_t key, void *item)
|
||||
|
||||
void BLI_smallhash_remove(SmallHash *hash, uintptr_t key)
|
||||
{
|
||||
int h, hoff=1;
|
||||
int h, hoff = 1;
|
||||
|
||||
h = ABS((int)key);
|
||||
|
||||
@@ -162,7 +162,7 @@ void BLI_smallhash_remove(SmallHash *hash, uintptr_t key)
|
||||
|
||||
void *BLI_smallhash_lookup(SmallHash *hash, uintptr_t key)
|
||||
{
|
||||
int h, hoff=1;
|
||||
int h, hoff = 1;
|
||||
void *v;
|
||||
|
||||
h = ABS((int)key);
|
||||
@@ -193,7 +193,7 @@ void *BLI_smallhash_lookup(SmallHash *hash, uintptr_t key)
|
||||
int BLI_smallhash_haskey(SmallHash *hash, uintptr_t key)
|
||||
{
|
||||
int h = ABS((int)key);
|
||||
int hoff =1;
|
||||
int hoff = 1;
|
||||
|
||||
if (hash->table == NULL) {
|
||||
return 0;
|
||||
@@ -251,21 +251,21 @@ void *BLI_smallhash_iternew(SmallHash *hash, SmallHashIter *iter, uintptr_t *key
|
||||
#if 0
|
||||
void BLI_smallhash_print(SmallHash *hash)
|
||||
{
|
||||
int i, linecol=79, c=0;
|
||||
int i, linecol = 79, c = 0;
|
||||
|
||||
printf("{");
|
||||
for (i=0; i<hash->size; i++) {
|
||||
for (i = 0; i < hash->size; i++) {
|
||||
if (hash->table[i].val == SMHASH_CELL_UNUSED) {
|
||||
printf("--u-");
|
||||
}
|
||||
else if (hash->table[i].val == SMHASH_CELL_FREE) {
|
||||
printf("--f-");
|
||||
}
|
||||
else {
|
||||
else {
|
||||
printf("%2x", (unsigned int)hash->table[i].key);
|
||||
}
|
||||
|
||||
if (i != hash->size-1)
|
||||
if (i != hash->size - 1)
|
||||
printf(", ");
|
||||
|
||||
c += 6;
|
||||
|
||||
@@ -43,13 +43,13 @@
|
||||
#include <time.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#if defined (__sun__) || defined (__sun) || defined (__NetBSD__)
|
||||
#if defined(__sun__) || defined(__sun) || defined(__NetBSD__)
|
||||
#include <sys/statvfs.h> /* Other modern unix os's should probably use this also */
|
||||
#elif !defined(__FreeBSD__) && !defined(linux) && (defined(__sparc) || defined(__sparc__))
|
||||
#include <sys/statfs.h>
|
||||
#endif
|
||||
|
||||
#if defined (__FreeBSD__) || defined (__OpenBSD__)
|
||||
#if defined(__FreeBSD__) || defined(__OpenBSD__)
|
||||
#include <sys/param.h>
|
||||
#include <sys/mount.h>
|
||||
#endif
|
||||
@@ -66,7 +66,7 @@
|
||||
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <string.h> /* strcpy etc.. */
|
||||
#include <string.h> /* strcpy etc.. */
|
||||
|
||||
#ifdef WIN32
|
||||
# include <io.h>
|
||||
@@ -98,13 +98,13 @@
|
||||
static int totnum, actnum;
|
||||
static struct direntry *files;
|
||||
|
||||
static struct ListBase dirbase_={NULL, NULL};
|
||||
static struct ListBase dirbase_ = {NULL, NULL};
|
||||
static struct ListBase *dirbase = &dirbase_;
|
||||
|
||||
/* can return NULL when the size is not big enough */
|
||||
char *BLI_current_working_dir(char *dir, const int maxncpy)
|
||||
{
|
||||
const char *pwd= getenv("PWD");
|
||||
const char *pwd = getenv("PWD");
|
||||
if (pwd) {
|
||||
BLI_strncpy(dir, pwd, maxncpy);
|
||||
return dir;
|
||||
@@ -119,13 +119,13 @@ static int bli_compare(struct direntry *entry1, struct direntry *entry2)
|
||||
/* type is equal to stat.st_mode */
|
||||
|
||||
if (S_ISDIR(entry1->type)) {
|
||||
if (S_ISDIR(entry2->type)==0) return (-1);
|
||||
if (S_ISDIR(entry2->type) == 0) return (-1);
|
||||
}
|
||||
else {
|
||||
if (S_ISDIR(entry2->type)) return (1);
|
||||
}
|
||||
if (S_ISREG(entry1->type)) {
|
||||
if (S_ISREG(entry2->type)==0) return (-1);
|
||||
if (S_ISREG(entry2->type) == 0) return (-1);
|
||||
}
|
||||
else {
|
||||
if (S_ISREG(entry2->type)) return (1);
|
||||
@@ -134,10 +134,10 @@ static int bli_compare(struct direntry *entry1, struct direntry *entry2)
|
||||
if ((entry1->type & S_IFMT) > (entry2->type & S_IFMT)) return (1);
|
||||
|
||||
/* make sure "." and ".." are always first */
|
||||
if ( strcmp(entry1->relname, ".")==0 ) return (-1);
|
||||
if ( strcmp(entry2->relname, ".")==0 ) return (1);
|
||||
if ( strcmp(entry1->relname, "..")==0 ) return (-1);
|
||||
if ( strcmp(entry2->relname, "..")==0 ) return (1);
|
||||
if (strcmp(entry1->relname, ".") == 0) return (-1);
|
||||
if (strcmp(entry2->relname, ".") == 0) return (1);
|
||||
if (strcmp(entry1->relname, "..") == 0) return (-1);
|
||||
if (strcmp(entry2->relname, "..") == 0) return (1);
|
||||
|
||||
return (BLI_natstrcmp(entry1->relname, entry2->relname));
|
||||
}
|
||||
@@ -149,24 +149,24 @@ double BLI_dir_free_space(const char *dir)
|
||||
DWORD sectorspc, bytesps, freec, clusters;
|
||||
char tmp[4];
|
||||
|
||||
tmp[0]='\\'; tmp[1]=0; /* Just a failsafe */
|
||||
if (dir[0]=='/' || dir[0]=='\\') {
|
||||
tmp[0]='\\';
|
||||
tmp[1]=0;
|
||||
tmp[0] = '\\'; tmp[1] = 0; /* Just a failsafe */
|
||||
if (dir[0] == '/' || dir[0] == '\\') {
|
||||
tmp[0] = '\\';
|
||||
tmp[1] = 0;
|
||||
}
|
||||
else if (dir[1]==':') {
|
||||
tmp[0]=dir[0];
|
||||
tmp[1]=':';
|
||||
tmp[2]='\\';
|
||||
tmp[3]=0;
|
||||
else if (dir[1] == ':') {
|
||||
tmp[0] = dir[0];
|
||||
tmp[1] = ':';
|
||||
tmp[2] = '\\';
|
||||
tmp[3] = 0;
|
||||
}
|
||||
|
||||
GetDiskFreeSpace(tmp, §orspc, &bytesps, &freec, &clusters);
|
||||
|
||||
return (double) (freec*bytesps*sectorspc);
|
||||
return (double) (freec * bytesps * sectorspc);
|
||||
#else
|
||||
|
||||
#if defined (__sun__) || defined (__sun) || defined (__NetBSD__)
|
||||
#if defined(__sun__) || defined(__sun) || defined(__NetBSD__)
|
||||
struct statvfs disk;
|
||||
#else
|
||||
struct statfs disk;
|
||||
@@ -185,11 +185,11 @@ double BLI_dir_free_space(const char *dir)
|
||||
}
|
||||
else strcpy(name, "/");
|
||||
|
||||
#if defined (__FreeBSD__) || defined (linux) || defined (__OpenBSD__) || defined (__APPLE__) || defined(__GNU__) || defined(__GLIBC__)
|
||||
#if defined(__FreeBSD__) || defined(linux) || defined(__OpenBSD__) || defined(__APPLE__) || defined(__GNU__) || defined(__GLIBC__)
|
||||
if (statfs(name, &disk)) return(-1);
|
||||
#endif
|
||||
|
||||
#if defined (__sun__) || defined (__sun) || defined (__NetBSD__)
|
||||
#if defined(__sun__) || defined(__sun) || defined(__NetBSD__)
|
||||
if (statvfs(name, &disk)) return(-1);
|
||||
#elif !defined(__FreeBSD__) && !defined(linux) && (defined(__sparc) || defined(__sparc__))
|
||||
/* WARNING - This may not be supported by geeneric unix os's - Campbell */
|
||||
@@ -209,10 +209,10 @@ static void bli_builddir(const char *dirname, const char *relname)
|
||||
DIR *dir;
|
||||
|
||||
BLI_strncpy(buf, relname, sizeof(buf));
|
||||
rellen=strlen(relname);
|
||||
rellen = strlen(relname);
|
||||
|
||||
if (rellen) {
|
||||
buf[rellen]='/';
|
||||
buf[rellen] = '/';
|
||||
rellen++;
|
||||
}
|
||||
#ifndef WIN32
|
||||
@@ -231,7 +231,7 @@ static void bli_builddir(const char *dirname, const char *relname)
|
||||
|
||||
#endif
|
||||
if ((dir = (DIR *)opendir("."))) {
|
||||
while ((fname = (struct dirent*) readdir(dir)) != NULL) {
|
||||
while ((fname = (struct dirent *) readdir(dir)) != NULL) {
|
||||
dlink = (struct dirlink *)malloc(sizeof(struct dirlink));
|
||||
if (dlink) {
|
||||
BLI_strncpy(buf + rellen, fname->d_name, sizeof(buf) - rellen);
|
||||
@@ -244,7 +244,7 @@ static void bli_builddir(const char *dirname, const char *relname)
|
||||
if (newnum) {
|
||||
|
||||
if (files) {
|
||||
void *tmp = realloc(files, (totnum+newnum) * sizeof(struct direntry));
|
||||
void *tmp = realloc(files, (totnum + newnum) * sizeof(struct direntry));
|
||||
if (tmp) {
|
||||
files = (struct direntry *)tmp;
|
||||
}
|
||||
@@ -254,8 +254,8 @@ static void bli_builddir(const char *dirname, const char *relname)
|
||||
}
|
||||
}
|
||||
|
||||
if (files==NULL)
|
||||
files=(struct direntry *)malloc(newnum * sizeof(struct direntry));
|
||||
if (files == NULL)
|
||||
files = (struct direntry *)malloc(newnum * sizeof(struct direntry));
|
||||
|
||||
if (files) {
|
||||
dlink = (struct dirlink *) dirbase->first;
|
||||
@@ -266,18 +266,20 @@ static void bli_builddir(const char *dirname, const char *relname)
|
||||
// use 64 bit file size, only needed for WIN32 and WIN64.
|
||||
// Excluding other than current MSVC compiler until able to test
|
||||
#ifdef WIN32
|
||||
{wchar_t * name_16 = alloc_utf16_from_8(dlink->name, 0);
|
||||
#if (defined(WIN32) || defined(WIN64)) && (_MSC_VER>=1500)
|
||||
_wstat64(name_16, &files[actnum].s);
|
||||
{
|
||||
wchar_t *name_16 = alloc_utf16_from_8(dlink->name, 0);
|
||||
#if (defined(WIN32) || defined(WIN64)) && (_MSC_VER >= 1500)
|
||||
_wstat64(name_16, &files[actnum].s);
|
||||
#elif defined(__MINGW32__)
|
||||
_stati64(dlink->name, &files[actnum].s);
|
||||
_stati64(dlink->name, &files[actnum].s);
|
||||
#endif
|
||||
free(name_16);};
|
||||
free(name_16);
|
||||
}
|
||||
|
||||
#else
|
||||
stat(dlink->name, &files[actnum].s);
|
||||
#endif
|
||||
files[actnum].type=files[actnum].s.st_mode;
|
||||
files[actnum].type = files[actnum].s.st_mode;
|
||||
files[actnum].flags = 0;
|
||||
totnum++;
|
||||
actnum++;
|
||||
@@ -290,7 +292,7 @@ static void bli_builddir(const char *dirname, const char *relname)
|
||||
}
|
||||
|
||||
BLI_freelist(dirbase);
|
||||
if (files) qsort(files, actnum, sizeof(struct direntry), (int (*)(const void *, const void*))bli_compare);
|
||||
if (files) qsort(files, actnum, sizeof(struct direntry), (int (*)(const void *, const void *))bli_compare);
|
||||
}
|
||||
else {
|
||||
printf("%s empty directory\n", dirname);
|
||||
@@ -308,7 +310,7 @@ static void bli_adddirstrings(void)
|
||||
char datum[100];
|
||||
char buf[512];
|
||||
char size[250];
|
||||
static const char * types[8] = {"---", "--x", "-w-", "-wx", "r--", "r-x", "rw-", "rwx"};
|
||||
static const char *types[8] = {"---", "--x", "-w-", "-wx", "r--", "r-x", "rw-", "rwx"};
|
||||
int num, mode;
|
||||
#ifdef WIN32
|
||||
__int64 st_size;
|
||||
@@ -316,11 +318,11 @@ static void bli_adddirstrings(void)
|
||||
off_t st_size;
|
||||
#endif
|
||||
|
||||
struct direntry * file;
|
||||
struct direntry *file;
|
||||
struct tm *tm;
|
||||
time_t zero= 0;
|
||||
time_t zero = 0;
|
||||
|
||||
for (num=0, file= files; num<actnum; num++, file++) {
|
||||
for (num = 0, file = files; num < actnum; num++, file++) {
|
||||
#ifdef WIN32
|
||||
mode = 0;
|
||||
BLI_strncpy(file->mode1, types[0], sizeof(file->mode1));
|
||||
@@ -333,13 +335,13 @@ static void bli_adddirstrings(void)
|
||||
BLI_strncpy(file->mode2, types[(mode & 0070) >> 3], sizeof(file->mode2));
|
||||
BLI_strncpy(file->mode3, types[(mode & 0007)], sizeof(file->mode3));
|
||||
|
||||
if (((mode & S_ISGID) == S_ISGID) && (file->mode2[2]=='-'))file->mode2[2]='l';
|
||||
if (((mode & S_ISGID) == S_ISGID) && (file->mode2[2] == '-')) file->mode2[2] = 'l';
|
||||
|
||||
if (mode & (S_ISUID | S_ISGID)) {
|
||||
if (file->mode1[2]=='x') file->mode1[2]='s';
|
||||
else file->mode1[2]='S';
|
||||
if (file->mode1[2] == 'x') file->mode1[2] = 's';
|
||||
else file->mode1[2] = 'S';
|
||||
|
||||
if (file->mode2[2]=='x')file->mode2[2]='s';
|
||||
if (file->mode2[2] == 'x') file->mode2[2] = 's';
|
||||
}
|
||||
|
||||
if (mode & S_ISVTX) {
|
||||
@@ -354,7 +356,7 @@ static void bli_adddirstrings(void)
|
||||
{
|
||||
struct passwd *pwuser;
|
||||
pwuser = getpwuid(file->s.st_uid);
|
||||
if ( pwuser ) {
|
||||
if (pwuser) {
|
||||
BLI_strncpy(file->owner, pwuser->pw_name, sizeof(file->owner));
|
||||
}
|
||||
else {
|
||||
@@ -363,9 +365,9 @@ static void bli_adddirstrings(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
tm= localtime(&file->s.st_mtime);
|
||||
tm = localtime(&file->s.st_mtime);
|
||||
// prevent impossible dates in windows
|
||||
if (tm==NULL) tm= localtime(&zero);
|
||||
if (tm == NULL) tm = localtime(&zero);
|
||||
strftime(file->time, sizeof(file->time), "%H:%M", tm);
|
||||
strftime(file->date, sizeof(file->date), "%d-%b-%y", tm);
|
||||
|
||||
@@ -374,16 +376,16 @@ static void bli_adddirstrings(void)
|
||||
* will buy us some time until files get bigger than 4GB or until
|
||||
* everyone starts using __USE_FILE_OFFSET64 or equivalent.
|
||||
*/
|
||||
st_size= file->s.st_size;
|
||||
st_size = file->s.st_size;
|
||||
|
||||
if (st_size > 1024*1024*1024) {
|
||||
BLI_snprintf(file->size, sizeof(file->size), "%.2f GB", ((double)st_size)/(1024*1024*1024));
|
||||
if (st_size > 1024 * 1024 * 1024) {
|
||||
BLI_snprintf(file->size, sizeof(file->size), "%.2f GB", ((double)st_size) / (1024 * 1024 * 1024));
|
||||
}
|
||||
else if (st_size > 1024*1024) {
|
||||
BLI_snprintf(file->size, sizeof(file->size), "%.1f MB", ((double)st_size)/(1024*1024));
|
||||
else if (st_size > 1024 * 1024) {
|
||||
BLI_snprintf(file->size, sizeof(file->size), "%.1f MB", ((double)st_size) / (1024 * 1024));
|
||||
}
|
||||
else if (st_size > 1024) {
|
||||
BLI_snprintf(file->size, sizeof(file->size), "%d KB", (int)(st_size/1024));
|
||||
BLI_snprintf(file->size, sizeof(file->size), "%d KB", (int)(st_size / 1024));
|
||||
}
|
||||
else {
|
||||
BLI_snprintf(file->size, sizeof(file->size), "%d B", (int)st_size);
|
||||
@@ -401,7 +403,7 @@ static void bli_adddirstrings(void)
|
||||
}
|
||||
else if (st_size < 100 * 1000 * 1000) {
|
||||
BLI_snprintf(size, sizeof(size), "%2d %03d %03d",
|
||||
(int) (st_size / (1000 * 1000)), (int) ((st_size / 1000) % 1000), (int) ( st_size % 1000));
|
||||
(int) (st_size / (1000 * 1000)), (int) ((st_size / 1000) % 1000), (int) (st_size % 1000));
|
||||
}
|
||||
else {
|
||||
/* XXX, whats going on here?. 2x calls - campbell */
|
||||
@@ -447,13 +449,13 @@ size_t BLI_file_descriptor_size(int file)
|
||||
struct stat buf;
|
||||
|
||||
if (file <= 0) return (-1);
|
||||
fstat(file, &buf);//CHANGE
|
||||
fstat(file, &buf); /* CHANGE */
|
||||
return (buf.st_size);
|
||||
}
|
||||
|
||||
size_t BLI_file_size(const char *path)
|
||||
{
|
||||
int size, file = BLI_open(path, O_BINARY|O_RDONLY, 0);
|
||||
int size, file = BLI_open(path, O_BINARY | O_RDONLY, 0);
|
||||
|
||||
if (file == -1)
|
||||
return -1;
|
||||
@@ -475,10 +477,10 @@ int BLI_exists(const char *name)
|
||||
/* in Windows stat doesn't recognize dir ending on a slash
|
||||
* To not break code where the ending slash is expected we
|
||||
* don't mess with the argument name directly here - elubie */
|
||||
wchar_t * tmp_16 = alloc_utf16_from_8(name, 0);
|
||||
wchar_t *tmp_16 = alloc_utf16_from_8(name, 0);
|
||||
int len, res;
|
||||
len = wcslen(tmp_16);
|
||||
if (len > 3 && ( tmp_16[len-1]==L'\\' || tmp_16[len-1]==L'/') ) tmp_16[len-1] = '\0';
|
||||
if (len > 3 && (tmp_16[len - 1] == L'\\' || tmp_16[len - 1] == L'/') ) tmp_16[len - 1] = '\0';
|
||||
#ifndef __MINGW32__
|
||||
res = _wstat(tmp_16, &st);
|
||||
#else
|
||||
@@ -499,7 +501,7 @@ int BLI_stat(const char *path, struct stat *buffer)
|
||||
{
|
||||
int r;
|
||||
UTF16_ENCODE(path);
|
||||
r=_wstat(path_16,buffer);
|
||||
r = _wstat(path_16, buffer);
|
||||
UTF16_UN_ENCODE(path);
|
||||
return r;
|
||||
}
|
||||
@@ -518,39 +520,39 @@ int BLI_is_dir(const char *file)
|
||||
|
||||
int BLI_is_file(const char *path)
|
||||
{
|
||||
int mode= BLI_exists(path);
|
||||
int mode = BLI_exists(path);
|
||||
return (mode && !S_ISDIR(mode));
|
||||
}
|
||||
|
||||
LinkNode *BLI_file_read_as_lines(const char *name)
|
||||
{
|
||||
FILE *fp= BLI_fopen(name, "r");
|
||||
LinkNode *lines= NULL;
|
||||
FILE *fp = BLI_fopen(name, "r");
|
||||
LinkNode *lines = NULL;
|
||||
char *buf;
|
||||
size_t size;
|
||||
|
||||
if (!fp) return NULL;
|
||||
|
||||
fseek(fp, 0, SEEK_END);
|
||||
size= (size_t)ftell(fp);
|
||||
size = (size_t)ftell(fp);
|
||||
fseek(fp, 0, SEEK_SET);
|
||||
|
||||
buf= MEM_mallocN(size, "file_as_lines");
|
||||
buf = MEM_mallocN(size, "file_as_lines");
|
||||
if (buf) {
|
||||
size_t i, last= 0;
|
||||
size_t i, last = 0;
|
||||
|
||||
/*
|
||||
* size = because on win32 reading
|
||||
* all the bytes in the file will return
|
||||
* less bytes because of crnl changes.
|
||||
*/
|
||||
size= fread(buf, 1, size, fp);
|
||||
for (i=0; i<=size; i++) {
|
||||
if (i==size || buf[i]=='\n') {
|
||||
char *line= BLI_strdupn(&buf[last], i-last);
|
||||
/*
|
||||
* size = because on win32 reading
|
||||
* all the bytes in the file will return
|
||||
* less bytes because of crnl changes.
|
||||
*/
|
||||
size = fread(buf, 1, size, fp);
|
||||
for (i = 0; i <= size; i++) {
|
||||
if (i == size || buf[i] == '\n') {
|
||||
char *line = BLI_strdupn(&buf[last], i - last);
|
||||
|
||||
BLI_linklist_prepend(&lines, line);
|
||||
last= i+1;
|
||||
last = i + 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -565,7 +567,7 @@ LinkNode *BLI_file_read_as_lines(const char *name)
|
||||
|
||||
void BLI_file_free_lines(LinkNode *lines)
|
||||
{
|
||||
BLI_linklist_free(lines, (void(*)(void*)) MEM_freeN);
|
||||
BLI_linklist_free(lines, (void (*)(void *))MEM_freeN);
|
||||
}
|
||||
|
||||
/** is file1 older then file2 */
|
||||
|
||||
@@ -114,7 +114,7 @@ static pthread_mutex_t _opengl_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||
static pthread_mutex_t _nodes_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||
static pthread_mutex_t _movieclip_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||
static pthread_t mainid;
|
||||
static int thread_levels= 0; /* threads can be invoked inside threads */
|
||||
static int thread_levels = 0; /* threads can be invoked inside threads */
|
||||
|
||||
/* just a max for security reasons */
|
||||
#define RE_MAX_THREAD BLENDER_MAX_THREADS
|
||||
@@ -151,16 +151,16 @@ void BLI_init_threads(ListBase *threadbase, void *(*do_thread)(void *), int tot)
|
||||
int a;
|
||||
|
||||
if (threadbase != NULL && tot > 0) {
|
||||
threadbase->first= threadbase->last= NULL;
|
||||
threadbase->first = threadbase->last = NULL;
|
||||
|
||||
if (tot>RE_MAX_THREAD) tot= RE_MAX_THREAD;
|
||||
else if (tot<1) tot= 1;
|
||||
if (tot > RE_MAX_THREAD) tot = RE_MAX_THREAD;
|
||||
else if (tot < 1) tot = 1;
|
||||
|
||||
for (a=0; a<tot; a++) {
|
||||
ThreadSlot *tslot= MEM_callocN(sizeof(ThreadSlot), "threadslot");
|
||||
for (a = 0; a < tot; a++) {
|
||||
ThreadSlot *tslot = MEM_callocN(sizeof(ThreadSlot), "threadslot");
|
||||
BLI_addtail(threadbase, tslot);
|
||||
tslot->do_thread= do_thread;
|
||||
tslot->avail= 1;
|
||||
tslot->do_thread = do_thread;
|
||||
tslot->avail = 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -182,9 +182,9 @@ void BLI_init_threads(ListBase *threadbase, void *(*do_thread)(void *), int tot)
|
||||
int BLI_available_threads(ListBase *threadbase)
|
||||
{
|
||||
ThreadSlot *tslot;
|
||||
int counter=0;
|
||||
int counter = 0;
|
||||
|
||||
for (tslot= threadbase->first; tslot; tslot= tslot->next) {
|
||||
for (tslot = threadbase->first; tslot; tslot = tslot->next) {
|
||||
if (tslot->avail)
|
||||
counter++;
|
||||
}
|
||||
@@ -195,9 +195,9 @@ int BLI_available_threads(ListBase *threadbase)
|
||||
int BLI_available_thread_index(ListBase *threadbase)
|
||||
{
|
||||
ThreadSlot *tslot;
|
||||
int counter=0;
|
||||
int counter = 0;
|
||||
|
||||
for (tslot= threadbase->first; tslot; tslot= tslot->next, counter++) {
|
||||
for (tslot = threadbase->first; tslot; tslot = tslot->next, counter++) {
|
||||
if (tslot->avail)
|
||||
return counter;
|
||||
}
|
||||
@@ -206,12 +206,12 @@ int BLI_available_thread_index(ListBase *threadbase)
|
||||
|
||||
static void *tslot_thread_start(void *tslot_p)
|
||||
{
|
||||
ThreadSlot *tslot= (ThreadSlot*)tslot_p;
|
||||
ThreadSlot *tslot = (ThreadSlot *)tslot_p;
|
||||
|
||||
#if defined(__APPLE__) && (PARALLEL == 1) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 2)
|
||||
/* workaround for Apple gcc 4.2.1 omp vs background thread bug,
|
||||
* set gomp thread local storage pointer which was copied beforehand */
|
||||
pthread_setspecific (gomp_tls_key, thread_tls_data);
|
||||
pthread_setspecific(gomp_tls_key, thread_tls_data);
|
||||
#endif
|
||||
|
||||
return tslot->do_thread(tslot->callerdata);
|
||||
@@ -226,10 +226,10 @@ void BLI_insert_thread(ListBase *threadbase, void *callerdata)
|
||||
{
|
||||
ThreadSlot *tslot;
|
||||
|
||||
for (tslot= threadbase->first; tslot; tslot= tslot->next) {
|
||||
for (tslot = threadbase->first; tslot; tslot = tslot->next) {
|
||||
if (tslot->avail) {
|
||||
tslot->avail= 0;
|
||||
tslot->callerdata= callerdata;
|
||||
tslot->avail = 0;
|
||||
tslot->callerdata = callerdata;
|
||||
pthread_create(&tslot->pthread, NULL, tslot_thread_start, tslot);
|
||||
return;
|
||||
}
|
||||
@@ -241,11 +241,11 @@ void BLI_remove_thread(ListBase *threadbase, void *callerdata)
|
||||
{
|
||||
ThreadSlot *tslot;
|
||||
|
||||
for (tslot= threadbase->first; tslot; tslot= tslot->next) {
|
||||
if (tslot->callerdata==callerdata) {
|
||||
for (tslot = threadbase->first; tslot; tslot = tslot->next) {
|
||||
if (tslot->callerdata == callerdata) {
|
||||
pthread_join(tslot->pthread, NULL);
|
||||
tslot->callerdata= NULL;
|
||||
tslot->avail= 1;
|
||||
tslot->callerdata = NULL;
|
||||
tslot->avail = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -253,7 +253,7 @@ void BLI_remove_thread(ListBase *threadbase, void *callerdata)
|
||||
void BLI_remove_thread_index(ListBase *threadbase, int index)
|
||||
{
|
||||
ThreadSlot *tslot;
|
||||
int counter=0;
|
||||
int counter = 0;
|
||||
|
||||
for (tslot = threadbase->first; tslot; tslot = tslot->next, counter++) {
|
||||
if (counter == index && tslot->avail == 0) {
|
||||
@@ -286,8 +286,8 @@ void BLI_end_threads(ListBase *threadbase)
|
||||
* this way we don't end up decrementing thread_levels on an empty threadbase
|
||||
* */
|
||||
if (threadbase && threadbase->first != NULL) {
|
||||
for (tslot= threadbase->first; tslot; tslot= tslot->next) {
|
||||
if (tslot->avail==0) {
|
||||
for (tslot = threadbase->first; tslot; tslot = tslot->next) {
|
||||
if (tslot->avail == 0) {
|
||||
pthread_join(tslot->pthread, NULL);
|
||||
}
|
||||
}
|
||||
@@ -295,7 +295,7 @@ void BLI_end_threads(ListBase *threadbase)
|
||||
}
|
||||
|
||||
thread_levels--;
|
||||
if (thread_levels==0)
|
||||
if (thread_levels == 0)
|
||||
MEM_set_lock_callback(NULL, NULL);
|
||||
}
|
||||
|
||||
@@ -310,7 +310,7 @@ int BLI_system_thread_count(void)
|
||||
GetSystemInfo(&info);
|
||||
t = (int) info.dwNumberOfProcessors;
|
||||
#else
|
||||
# ifdef __APPLE__
|
||||
# ifdef __APPLE__
|
||||
int mib[2];
|
||||
size_t len;
|
||||
|
||||
@@ -318,14 +318,14 @@ int BLI_system_thread_count(void)
|
||||
mib[1] = HW_NCPU;
|
||||
len = sizeof(t);
|
||||
sysctl(mib, 2, &t, &len, NULL, 0);
|
||||
# else
|
||||
# else
|
||||
t = (int)sysconf(_SC_NPROCESSORS_ONLN);
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
if (t>RE_MAX_THREAD)
|
||||
if (t > RE_MAX_THREAD)
|
||||
return RE_MAX_THREAD;
|
||||
if (t<1)
|
||||
if (t < 1)
|
||||
return 1;
|
||||
|
||||
return t;
|
||||
@@ -335,41 +335,41 @@ int BLI_system_thread_count(void)
|
||||
|
||||
void BLI_lock_thread(int type)
|
||||
{
|
||||
if (type==LOCK_IMAGE)
|
||||
if (type == LOCK_IMAGE)
|
||||
pthread_mutex_lock(&_image_lock);
|
||||
else if (type==LOCK_PREVIEW)
|
||||
else if (type == LOCK_PREVIEW)
|
||||
pthread_mutex_lock(&_preview_lock);
|
||||
else if (type==LOCK_VIEWER)
|
||||
else if (type == LOCK_VIEWER)
|
||||
pthread_mutex_lock(&_viewer_lock);
|
||||
else if (type==LOCK_CUSTOM1)
|
||||
else if (type == LOCK_CUSTOM1)
|
||||
pthread_mutex_lock(&_custom1_lock);
|
||||
else if (type==LOCK_RCACHE)
|
||||
else if (type == LOCK_RCACHE)
|
||||
pthread_mutex_lock(&_rcache_lock);
|
||||
else if (type==LOCK_OPENGL)
|
||||
else if (type == LOCK_OPENGL)
|
||||
pthread_mutex_lock(&_opengl_lock);
|
||||
else if (type==LOCK_NODES)
|
||||
else if (type == LOCK_NODES)
|
||||
pthread_mutex_lock(&_nodes_lock);
|
||||
else if (type==LOCK_MOVIECLIP)
|
||||
else if (type == LOCK_MOVIECLIP)
|
||||
pthread_mutex_lock(&_movieclip_lock);
|
||||
}
|
||||
|
||||
void BLI_unlock_thread(int type)
|
||||
{
|
||||
if (type==LOCK_IMAGE)
|
||||
if (type == LOCK_IMAGE)
|
||||
pthread_mutex_unlock(&_image_lock);
|
||||
else if (type==LOCK_PREVIEW)
|
||||
else if (type == LOCK_PREVIEW)
|
||||
pthread_mutex_unlock(&_preview_lock);
|
||||
else if (type==LOCK_VIEWER)
|
||||
else if (type == LOCK_VIEWER)
|
||||
pthread_mutex_unlock(&_viewer_lock);
|
||||
else if (type==LOCK_CUSTOM1)
|
||||
else if (type == LOCK_CUSTOM1)
|
||||
pthread_mutex_unlock(&_custom1_lock);
|
||||
else if (type==LOCK_RCACHE)
|
||||
else if (type == LOCK_RCACHE)
|
||||
pthread_mutex_unlock(&_rcache_lock);
|
||||
else if (type==LOCK_OPENGL)
|
||||
else if (type == LOCK_OPENGL)
|
||||
pthread_mutex_unlock(&_opengl_lock);
|
||||
else if (type==LOCK_NODES)
|
||||
else if (type == LOCK_NODES)
|
||||
pthread_mutex_unlock(&_nodes_lock);
|
||||
else if (type==LOCK_MOVIECLIP)
|
||||
else if (type == LOCK_MOVIECLIP)
|
||||
pthread_mutex_unlock(&_movieclip_lock);
|
||||
}
|
||||
|
||||
@@ -425,20 +425,20 @@ void BLI_rw_mutex_end(ThreadRWMutex *mutex)
|
||||
typedef struct ThreadedWorker {
|
||||
ListBase threadbase;
|
||||
void *(*work_fnct)(void *);
|
||||
char busy[RE_MAX_THREAD];
|
||||
int total;
|
||||
int sleep_time;
|
||||
char busy[RE_MAX_THREAD];
|
||||
int total;
|
||||
int sleep_time;
|
||||
} ThreadedWorker;
|
||||
|
||||
typedef struct WorkParam {
|
||||
ThreadedWorker *worker;
|
||||
void *param;
|
||||
int index;
|
||||
int index;
|
||||
} WorkParam;
|
||||
|
||||
static void *exec_work_fnct(void *v_param)
|
||||
{
|
||||
WorkParam *p = (WorkParam*)v_param;
|
||||
WorkParam *p = (WorkParam *)v_param;
|
||||
void *value;
|
||||
|
||||
value = p->worker->work_fnct(p->param);
|
||||
@@ -461,7 +461,7 @@ ThreadedWorker *BLI_create_worker(void *(*do_thread)(void *), int tot, int sleep
|
||||
tot = RE_MAX_THREAD;
|
||||
}
|
||||
else if (tot < 1) {
|
||||
tot= 1;
|
||||
tot = 1;
|
||||
}
|
||||
|
||||
worker->total = tot;
|
||||
@@ -528,8 +528,8 @@ ThreadQueue *BLI_thread_queue_init(void)
|
||||
{
|
||||
ThreadQueue *queue;
|
||||
|
||||
queue= MEM_callocN(sizeof(ThreadQueue), "ThreadQueue");
|
||||
queue->queue= BLI_gsqueue_new(sizeof(void*));
|
||||
queue = MEM_callocN(sizeof(ThreadQueue), "ThreadQueue");
|
||||
queue->queue = BLI_gsqueue_new(sizeof(void *));
|
||||
|
||||
pthread_mutex_init(&queue->mutex, NULL);
|
||||
pthread_cond_init(&queue->cond, NULL);
|
||||
@@ -560,7 +560,7 @@ void BLI_thread_queue_push(ThreadQueue *queue, void *work)
|
||||
|
||||
void *BLI_thread_queue_pop(ThreadQueue *queue)
|
||||
{
|
||||
void *work= NULL;
|
||||
void *work = NULL;
|
||||
|
||||
/* wait until there is work */
|
||||
pthread_mutex_lock(&queue->mutex);
|
||||
@@ -586,7 +586,7 @@ static void wait_timeout(struct timespec *timeout, int ms)
|
||||
struct _timeb now;
|
||||
_ftime(&now);
|
||||
sec = now.time;
|
||||
usec = now.millitm*1000; /* microsecond precision would be better */
|
||||
usec = now.millitm * 1000; /* microsecond precision would be better */
|
||||
}
|
||||
#else
|
||||
{
|
||||
@@ -601,23 +601,23 @@ static void wait_timeout(struct timespec *timeout, int ms)
|
||||
div_result = ldiv(ms, 1000);
|
||||
timeout->tv_sec = sec + div_result.quot;
|
||||
|
||||
x = usec + (div_result.rem*1000);
|
||||
x = usec + (div_result.rem * 1000);
|
||||
|
||||
if (x >= 1000000) {
|
||||
timeout->tv_sec++;
|
||||
x -= 1000000;
|
||||
}
|
||||
|
||||
timeout->tv_nsec = x*1000;
|
||||
timeout->tv_nsec = x * 1000;
|
||||
}
|
||||
|
||||
void *BLI_thread_queue_pop_timeout(ThreadQueue *queue, int ms)
|
||||
{
|
||||
double t;
|
||||
void *work= NULL;
|
||||
void *work = NULL;
|
||||
struct timespec timeout;
|
||||
|
||||
t= PIL_check_seconds_timer();
|
||||
t = PIL_check_seconds_timer();
|
||||
wait_timeout(&timeout, ms);
|
||||
|
||||
/* wait until there is work */
|
||||
@@ -625,7 +625,7 @@ void *BLI_thread_queue_pop_timeout(ThreadQueue *queue, int ms)
|
||||
while (BLI_gsqueue_is_empty(queue->queue) && !queue->nowait) {
|
||||
if (pthread_cond_timedwait(&queue->cond, &queue->mutex, &timeout) == ETIMEDOUT)
|
||||
break;
|
||||
else if (PIL_check_seconds_timer() - t >= ms*0.001)
|
||||
else if (PIL_check_seconds_timer() - t >= ms * 0.001)
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -643,7 +643,7 @@ int BLI_thread_queue_size(ThreadQueue *queue)
|
||||
int size;
|
||||
|
||||
pthread_mutex_lock(&queue->mutex);
|
||||
size= BLI_gsqueue_size(queue->queue);
|
||||
size = BLI_gsqueue_size(queue->queue);
|
||||
pthread_mutex_unlock(&queue->mutex);
|
||||
|
||||
return size;
|
||||
@@ -653,7 +653,7 @@ void BLI_thread_queue_nowait(ThreadQueue *queue)
|
||||
{
|
||||
pthread_mutex_lock(&queue->mutex);
|
||||
|
||||
queue->nowait= 1;
|
||||
queue->nowait = 1;
|
||||
|
||||
/* signal threads waiting to pop */
|
||||
pthread_cond_signal(&queue->cond);
|
||||
@@ -671,6 +671,6 @@ void BLI_begin_threaded_malloc(void)
|
||||
void BLI_end_threaded_malloc(void)
|
||||
{
|
||||
thread_levels--;
|
||||
if (thread_levels==0)
|
||||
if (thread_levels == 0)
|
||||
MEM_set_lock_callback(NULL, NULL);
|
||||
}
|
||||
|
||||
@@ -71,13 +71,13 @@
|
||||
/* local prototypes --------------------- */
|
||||
void BLO_blendhandle_print_sizes(BlendHandle *, void *);
|
||||
|
||||
/* Access routines used by filesel. */
|
||||
/* Access routines used by filesel. */
|
||||
|
||||
BlendHandle *BLO_blendhandle_from_file(char *file, ReportList *reports)
|
||||
{
|
||||
BlendHandle *bh;
|
||||
|
||||
bh= (BlendHandle*)blo_openblenderfile(file, reports);
|
||||
bh = (BlendHandle *)blo_openblenderfile(file, reports);
|
||||
|
||||
return bh;
|
||||
}
|
||||
@@ -86,36 +86,36 @@ BlendHandle *BLO_blendhandle_from_memory(void *mem, int memsize)
|
||||
{
|
||||
BlendHandle *bh;
|
||||
|
||||
bh= (BlendHandle*)blo_openblendermemory(mem, memsize, NULL);
|
||||
bh = (BlendHandle *)blo_openblendermemory(mem, memsize, NULL);
|
||||
|
||||
return bh;
|
||||
}
|
||||
|
||||
void BLO_blendhandle_print_sizes(BlendHandle *bh, void *fp)
|
||||
{
|
||||
FileData *fd= (FileData*) bh;
|
||||
FileData *fd = (FileData *) bh;
|
||||
BHead *bhead;
|
||||
|
||||
fprintf(fp, "[\n");
|
||||
for (bhead= blo_firstbhead(fd); bhead; bhead= blo_nextbhead(fd, bhead)) {
|
||||
if (bhead->code==ENDB)
|
||||
for (bhead = blo_firstbhead(fd); bhead; bhead = blo_nextbhead(fd, bhead)) {
|
||||
if (bhead->code == ENDB)
|
||||
break;
|
||||
else {
|
||||
short *sp= fd->filesdna->structs[bhead->SDNAnr];
|
||||
char *name= fd->filesdna->types[ sp[0] ];
|
||||
short *sp = fd->filesdna->structs[bhead->SDNAnr];
|
||||
char *name = fd->filesdna->types[sp[0]];
|
||||
char buf[4];
|
||||
|
||||
buf[0]= (bhead->code>>24)&0xFF;
|
||||
buf[1]= (bhead->code>>16)&0xFF;
|
||||
buf[2]= (bhead->code>>8)&0xFF;
|
||||
buf[3]= (bhead->code>>0)&0xFF;
|
||||
buf[0] = (bhead->code >> 24) & 0xFF;
|
||||
buf[1] = (bhead->code >> 16) & 0xFF;
|
||||
buf[2] = (bhead->code >> 8) & 0xFF;
|
||||
buf[3] = (bhead->code >> 0) & 0xFF;
|
||||
|
||||
buf[0] = buf[0] ? buf[0] : ' ';
|
||||
buf[1] = buf[1] ? buf[1] : ' ';
|
||||
buf[2] = buf[2] ? buf[2] : ' ';
|
||||
buf[3] = buf[3] ? buf[3] : ' ';
|
||||
|
||||
buf[0]= buf[0]?buf[0]:' ';
|
||||
buf[1]= buf[1]?buf[1]:' ';
|
||||
buf[2]= buf[2]?buf[2]:' ';
|
||||
buf[3]= buf[3]?buf[3]:' ';
|
||||
|
||||
fprintf(fp, "['%.4s', '%s', %d, %ld ],\n", buf, name, bhead->nr, (long int)(bhead->len+sizeof(BHead)));
|
||||
fprintf(fp, "['%.4s', '%s', %d, %ld ],\n", buf, name, bhead->nr, (long int)(bhead->len + sizeof(BHead)));
|
||||
}
|
||||
}
|
||||
fprintf(fp, "]\n");
|
||||
@@ -123,39 +123,39 @@ void BLO_blendhandle_print_sizes(BlendHandle *bh, void *fp)
|
||||
|
||||
LinkNode *BLO_blendhandle_get_datablock_names(BlendHandle *bh, int ofblocktype, int *tot_names)
|
||||
{
|
||||
FileData *fd= (FileData*) bh;
|
||||
LinkNode *names= NULL;
|
||||
FileData *fd = (FileData *) bh;
|
||||
LinkNode *names = NULL;
|
||||
BHead *bhead;
|
||||
int tot= 0;
|
||||
int tot = 0;
|
||||
|
||||
for (bhead= blo_firstbhead(fd); bhead; bhead= blo_nextbhead(fd, bhead)) {
|
||||
if (bhead->code==ofblocktype) {
|
||||
char *idname= bhead_id_name(fd, bhead);
|
||||
for (bhead = blo_firstbhead(fd); bhead; bhead = blo_nextbhead(fd, bhead)) {
|
||||
if (bhead->code == ofblocktype) {
|
||||
char *idname = bhead_id_name(fd, bhead);
|
||||
|
||||
BLI_linklist_prepend(&names, strdup(idname+2));
|
||||
BLI_linklist_prepend(&names, strdup(idname + 2));
|
||||
tot++;
|
||||
}
|
||||
else if (bhead->code==ENDB)
|
||||
else if (bhead->code == ENDB)
|
||||
break;
|
||||
}
|
||||
|
||||
*tot_names= tot;
|
||||
*tot_names = tot;
|
||||
return names;
|
||||
}
|
||||
|
||||
LinkNode *BLO_blendhandle_get_previews(BlendHandle *bh, int ofblocktype, int *tot_prev)
|
||||
{
|
||||
FileData *fd= (FileData*) bh;
|
||||
LinkNode *previews= NULL;
|
||||
FileData *fd = (FileData *) bh;
|
||||
LinkNode *previews = NULL;
|
||||
BHead *bhead;
|
||||
int looking=0;
|
||||
PreviewImage* prv = NULL;
|
||||
PreviewImage* new_prv = NULL;
|
||||
int tot= 0;
|
||||
|
||||
for (bhead= blo_firstbhead(fd); bhead; bhead= blo_nextbhead(fd, bhead)) {
|
||||
if (bhead->code==ofblocktype) {
|
||||
char *idname= bhead_id_name(fd, bhead);
|
||||
int looking = 0;
|
||||
PreviewImage *prv = NULL;
|
||||
PreviewImage *new_prv = NULL;
|
||||
int tot = 0;
|
||||
|
||||
for (bhead = blo_firstbhead(fd); bhead; bhead = blo_nextbhead(fd, bhead)) {
|
||||
if (bhead->code == ofblocktype) {
|
||||
char *idname = bhead_id_name(fd, bhead);
|
||||
switch (GS(idname)) {
|
||||
case ID_MA: /* fall through */
|
||||
case ID_TE: /* fall through */
|
||||
@@ -171,7 +171,7 @@ LinkNode *BLO_blendhandle_get_previews(BlendHandle *bh, int ofblocktype, int *to
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (bhead->code==DATA) {
|
||||
else if (bhead->code == DATA) {
|
||||
if (looking) {
|
||||
if (bhead->SDNAnr == DNA_struct_find_nr(fd->filesdna, "PreviewImage") ) {
|
||||
prv = BLO_library_read_struct(fd, bhead, "PreviewImage");
|
||||
@@ -179,9 +179,9 @@ LinkNode *BLO_blendhandle_get_previews(BlendHandle *bh, int ofblocktype, int *to
|
||||
memcpy(new_prv, prv, sizeof(PreviewImage));
|
||||
if (prv->rect[0]) {
|
||||
unsigned int *rect = NULL;
|
||||
new_prv->rect[0] = MEM_callocN(new_prv->w[0]*new_prv->h[0]*sizeof(unsigned int), "prvrect");
|
||||
bhead= blo_nextbhead(fd, bhead);
|
||||
rect = (unsigned int*)(bhead+1);
|
||||
new_prv->rect[0] = MEM_callocN(new_prv->w[0] * new_prv->h[0] * sizeof(unsigned int), "prvrect");
|
||||
bhead = blo_nextbhead(fd, bhead);
|
||||
rect = (unsigned int *)(bhead + 1);
|
||||
memcpy(new_prv->rect[0], rect, bhead->len);
|
||||
}
|
||||
else {
|
||||
@@ -190,9 +190,9 @@ LinkNode *BLO_blendhandle_get_previews(BlendHandle *bh, int ofblocktype, int *to
|
||||
|
||||
if (prv->rect[1]) {
|
||||
unsigned int *rect = NULL;
|
||||
new_prv->rect[1] = MEM_callocN(new_prv->w[1]*new_prv->h[1]*sizeof(unsigned int), "prvrect");
|
||||
bhead= blo_nextbhead(fd, bhead);
|
||||
rect = (unsigned int*)(bhead+1);
|
||||
new_prv->rect[1] = MEM_callocN(new_prv->w[1] * new_prv->h[1] * sizeof(unsigned int), "prvrect");
|
||||
bhead = blo_nextbhead(fd, bhead);
|
||||
rect = (unsigned int *)(bhead + 1);
|
||||
memcpy(new_prv->rect[1], rect, bhead->len);
|
||||
}
|
||||
else {
|
||||
@@ -203,7 +203,7 @@ LinkNode *BLO_blendhandle_get_previews(BlendHandle *bh, int ofblocktype, int *to
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (bhead->code==ENDB) {
|
||||
else if (bhead->code == ENDB) {
|
||||
break;
|
||||
}
|
||||
else {
|
||||
@@ -214,24 +214,24 @@ LinkNode *BLO_blendhandle_get_previews(BlendHandle *bh, int ofblocktype, int *to
|
||||
|
||||
}
|
||||
|
||||
*tot_prev= tot;
|
||||
*tot_prev = tot;
|
||||
return previews;
|
||||
}
|
||||
|
||||
LinkNode *BLO_blendhandle_get_linkable_groups(BlendHandle *bh)
|
||||
{
|
||||
FileData *fd= (FileData*) bh;
|
||||
GHash *gathered= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "linkable_groups gh");
|
||||
LinkNode *names= NULL;
|
||||
FileData *fd = (FileData *) bh;
|
||||
GHash *gathered = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "linkable_groups gh");
|
||||
LinkNode *names = NULL;
|
||||
BHead *bhead;
|
||||
|
||||
for (bhead= blo_firstbhead(fd); bhead; bhead= blo_nextbhead(fd, bhead)) {
|
||||
if (bhead->code==ENDB) {
|
||||
for (bhead = blo_firstbhead(fd); bhead; bhead = blo_nextbhead(fd, bhead)) {
|
||||
if (bhead->code == ENDB) {
|
||||
break;
|
||||
}
|
||||
else if (BKE_idcode_is_valid(bhead->code)) {
|
||||
if (BKE_idcode_is_linkable(bhead->code)) {
|
||||
const char *str= BKE_idcode_to_name(bhead->code);
|
||||
const char *str = BKE_idcode_to_name(bhead->code);
|
||||
|
||||
if (!BLI_ghash_haskey(gathered, (void *)str)) {
|
||||
BLI_linklist_prepend(&names, strdup(str));
|
||||
@@ -248,12 +248,12 @@ LinkNode *BLO_blendhandle_get_linkable_groups(BlendHandle *bh)
|
||||
|
||||
void BLO_blendhandle_close(BlendHandle *bh)
|
||||
{
|
||||
FileData *fd= (FileData*) bh;
|
||||
FileData *fd = (FileData *) bh;
|
||||
|
||||
blo_freefiledata(fd);
|
||||
}
|
||||
|
||||
/**********/
|
||||
/**********/
|
||||
|
||||
BlendFileData *BLO_read_from_file(const char *filepath, ReportList *reports)
|
||||
{
|
||||
@@ -262,8 +262,8 @@ BlendFileData *BLO_read_from_file(const char *filepath, ReportList *reports)
|
||||
|
||||
fd = blo_openblenderfile(filepath, reports);
|
||||
if (fd) {
|
||||
fd->reports= reports;
|
||||
bfd= blo_read_file_internal(fd, filepath);
|
||||
fd->reports = reports;
|
||||
bfd = blo_read_file_internal(fd, filepath);
|
||||
blo_freefiledata(fd);
|
||||
}
|
||||
|
||||
@@ -277,8 +277,8 @@ BlendFileData *BLO_read_from_memory(void *mem, int memsize, ReportList *reports)
|
||||
|
||||
fd = blo_openblendermemory(mem, memsize, reports);
|
||||
if (fd) {
|
||||
fd->reports= reports;
|
||||
bfd= blo_read_file_internal(fd, "");
|
||||
fd->reports = reports;
|
||||
bfd = blo_read_file_internal(fd, "");
|
||||
blo_freefiledata(fd);
|
||||
}
|
||||
|
||||
@@ -293,7 +293,7 @@ BlendFileData *BLO_read_from_memfile(Main *oldmain, const char *filename, MemFil
|
||||
|
||||
fd = blo_openblendermemfile(memfile, reports);
|
||||
if (fd) {
|
||||
fd->reports= reports;
|
||||
fd->reports = reports;
|
||||
BLI_strncpy(fd->relabase, filename, sizeof(fd->relabase));
|
||||
|
||||
/* clear ob->proxy_from pointers in old main */
|
||||
@@ -310,7 +310,7 @@ BlendFileData *BLO_read_from_memfile(Main *oldmain, const char *filename, MemFil
|
||||
/* makes lookup of existing video clips in old main */
|
||||
blo_make_movieclip_pointer_map(fd, oldmain);
|
||||
|
||||
bfd= blo_read_file_internal(fd, filename);
|
||||
bfd = blo_read_file_internal(fd, filename);
|
||||
|
||||
/* ensures relinked images are not freed */
|
||||
blo_end_image_pointer_map(fd, oldmain);
|
||||
@@ -319,11 +319,11 @@ BlendFileData *BLO_read_from_memfile(Main *oldmain, const char *filename, MemFil
|
||||
blo_end_movieclip_pointer_map(fd, oldmain);
|
||||
|
||||
/* move libraries from old main to new main */
|
||||
if (bfd && mainlist.first!=mainlist.last) {
|
||||
if (bfd && mainlist.first != mainlist.last) {
|
||||
|
||||
/* Library structs themselves */
|
||||
bfd->main->library= oldmain->library;
|
||||
oldmain->library.first= oldmain->library.last= NULL;
|
||||
bfd->main->library = oldmain->library;
|
||||
oldmain->library.first = oldmain->library.last = NULL;
|
||||
|
||||
/* add the Library mainlist to the new main */
|
||||
BLI_remlink(&mainlist, oldmain);
|
||||
|
||||
@@ -56,11 +56,11 @@ void BLO_free_memfile(MemFile *memfile)
|
||||
MemFileChunk *chunk;
|
||||
|
||||
while ( (chunk = (memfile->chunks.first) ) ) {
|
||||
if (chunk->ident==0) MEM_freeN(chunk->buf);
|
||||
if (chunk->ident == 0) MEM_freeN(chunk->buf);
|
||||
BLI_remlink(&memfile->chunks, chunk);
|
||||
MEM_freeN(chunk);
|
||||
}
|
||||
memfile->size= 0;
|
||||
memfile->size = 0;
|
||||
}
|
||||
|
||||
/* to keep list of memfiles consistent, 'first' is always first in list */
|
||||
@@ -69,17 +69,17 @@ void BLO_merge_memfile(MemFile *first, MemFile *second)
|
||||
{
|
||||
MemFileChunk *fc, *sc;
|
||||
|
||||
fc= first->chunks.first;
|
||||
sc= second->chunks.first;
|
||||
fc = first->chunks.first;
|
||||
sc = second->chunks.first;
|
||||
while (fc || sc) {
|
||||
if (fc && sc) {
|
||||
if (sc->ident) {
|
||||
sc->ident= 0;
|
||||
fc->ident= 1;
|
||||
sc->ident = 0;
|
||||
fc->ident = 1;
|
||||
}
|
||||
}
|
||||
if (fc) fc= fc->next;
|
||||
if (sc) sc= sc->next;
|
||||
if (fc) fc = fc->next;
|
||||
if (sc) sc = sc->next;
|
||||
}
|
||||
|
||||
BLO_free_memfile(first);
|
||||
@@ -92,7 +92,7 @@ static int my_memcmp(const int *mem1, const int *mem2, const int len)
|
||||
register const int *memb = mem2;
|
||||
|
||||
while (a--) {
|
||||
if ( *mema != *memb) return 1;
|
||||
if (*mema != *memb) return 1;
|
||||
mema++;
|
||||
memb++;
|
||||
}
|
||||
@@ -101,39 +101,39 @@ static int my_memcmp(const int *mem1, const int *mem2, const int len)
|
||||
|
||||
void add_memfilechunk(MemFile *compare, MemFile *current, const char *buf, unsigned int size)
|
||||
{
|
||||
static MemFileChunk *compchunk=NULL;
|
||||
static MemFileChunk *compchunk = NULL;
|
||||
MemFileChunk *curchunk;
|
||||
|
||||
/* this function inits when compare != NULL or when current==NULL */
|
||||
if (compare) {
|
||||
compchunk= compare->chunks.first;
|
||||
compchunk = compare->chunks.first;
|
||||
return;
|
||||
}
|
||||
if (current==NULL) {
|
||||
compchunk= NULL;
|
||||
if (current == NULL) {
|
||||
compchunk = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
curchunk= MEM_mallocN(sizeof(MemFileChunk), "MemFileChunk");
|
||||
curchunk->size= size;
|
||||
curchunk->buf= NULL;
|
||||
curchunk->ident= 0;
|
||||
curchunk = MEM_mallocN(sizeof(MemFileChunk), "MemFileChunk");
|
||||
curchunk->size = size;
|
||||
curchunk->buf = NULL;
|
||||
curchunk->ident = 0;
|
||||
BLI_addtail(¤t->chunks, curchunk);
|
||||
|
||||
/* we compare compchunk with buf */
|
||||
if (compchunk) {
|
||||
if (compchunk->size == curchunk->size) {
|
||||
if (my_memcmp((int *)compchunk->buf, (const int *)buf, size / 4) == 0) {
|
||||
curchunk->buf= compchunk->buf;
|
||||
curchunk->ident= 1;
|
||||
curchunk->buf = compchunk->buf;
|
||||
curchunk->ident = 1;
|
||||
}
|
||||
}
|
||||
compchunk= compchunk->next;
|
||||
compchunk = compchunk->next;
|
||||
}
|
||||
|
||||
/* not equal... */
|
||||
if (curchunk->buf==NULL) {
|
||||
curchunk->buf= MEM_mallocN(size, "Chunk buffer");
|
||||
if (curchunk->buf == NULL) {
|
||||
curchunk->buf = MEM_mallocN(size, "Chunk buffer");
|
||||
memcpy(curchunk->buf, buf, size);
|
||||
current->size += size;
|
||||
}
|
||||
|
||||
@@ -143,10 +143,10 @@ static short le_short(short temp);
|
||||
static short le_short(short temp)
|
||||
{
|
||||
short new;
|
||||
char *rt=(char *)&temp, *rtn=(char *)&new;
|
||||
char *rt = (char *)&temp, *rtn = (char *)&new;
|
||||
|
||||
rtn[0]= rt[1];
|
||||
rtn[1]= rt[0];
|
||||
rtn[0] = rt[1];
|
||||
rtn[1] = rt[0];
|
||||
|
||||
return new;
|
||||
}
|
||||
@@ -155,12 +155,12 @@ static short le_short(short temp)
|
||||
static int le_int(int temp)
|
||||
{
|
||||
int new;
|
||||
char *rt=(char *)&temp, *rtn=(char *)&new;
|
||||
char *rt = (char *)&temp, *rtn = (char *)&new;
|
||||
|
||||
rtn[0]= rt[3];
|
||||
rtn[1]= rt[2];
|
||||
rtn[2]= rt[1];
|
||||
rtn[3]= rt[0];
|
||||
rtn[0] = rt[3];
|
||||
rtn[1] = rt[2];
|
||||
rtn[2] = rt[1];
|
||||
rtn[3] = rt[0];
|
||||
|
||||
return new;
|
||||
}
|
||||
@@ -171,18 +171,18 @@ static int le_int(int temp)
|
||||
/* allowed duplicate code from makesdna.c */
|
||||
int DNA_elem_array_size(const char *astr, int len)
|
||||
{
|
||||
int a, mul=1;
|
||||
char str[100], *cp= NULL;
|
||||
int a, mul = 1;
|
||||
char str[100], *cp = NULL;
|
||||
|
||||
memcpy(str, astr, len+1);
|
||||
memcpy(str, astr, len + 1);
|
||||
|
||||
for (a=0; a<len; a++) {
|
||||
if ( str[a]== '[' ) {
|
||||
cp= &(str[a+1]);
|
||||
for (a = 0; a < len; a++) {
|
||||
if (str[a] == '[') {
|
||||
cp = &(str[a + 1]);
|
||||
}
|
||||
else if ( str[a]==']' && cp) {
|
||||
str[a]= 0;
|
||||
mul*= atoi(cp);
|
||||
else if (str[a] == ']' && cp) {
|
||||
str[a] = 0;
|
||||
mul *= atoi(cp);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -210,7 +210,7 @@ void DNA_sdna_free(SDNA *sdna)
|
||||
static int ispointer(const char *name)
|
||||
{
|
||||
/* check if pointer or function pointer */
|
||||
return (name[0]=='*' || (name[0]=='(' && name[1]=='*'));
|
||||
return (name[0] == '*' || (name[0] == '(' && name[1] == '*'));
|
||||
}
|
||||
|
||||
static int elementsize(SDNA *sdna, short type, short name)
|
||||
@@ -219,24 +219,24 @@ static int elementsize(SDNA *sdna, short type, short name)
|
||||
int mul, namelen, len;
|
||||
const char *cp;
|
||||
|
||||
cp= sdna->names[name];
|
||||
len= 0;
|
||||
cp = sdna->names[name];
|
||||
len = 0;
|
||||
|
||||
namelen= strlen(cp);
|
||||
namelen = strlen(cp);
|
||||
/* is it a pointer or function pointer? */
|
||||
if (ispointer(cp)) {
|
||||
/* has the naam an extra length? (array) */
|
||||
mul= 1;
|
||||
if ( cp[namelen-1]==']') mul= DNA_elem_array_size(cp, namelen);
|
||||
mul = 1;
|
||||
if (cp[namelen - 1] == ']') mul = DNA_elem_array_size(cp, namelen);
|
||||
|
||||
len= sdna->pointerlen*mul;
|
||||
len = sdna->pointerlen * mul;
|
||||
}
|
||||
else if ( sdna->typelens[type] ) {
|
||||
else if (sdna->typelens[type]) {
|
||||
/* has the naam an extra length? (array) */
|
||||
mul= 1;
|
||||
if ( cp[namelen-1]==']') mul= DNA_elem_array_size(cp, namelen);
|
||||
mul = 1;
|
||||
if (cp[namelen - 1] == ']') mul = DNA_elem_array_size(cp, namelen);
|
||||
|
||||
len= mul*sdna->typelens[type];
|
||||
len = mul * sdna->typelens[type];
|
||||
|
||||
}
|
||||
|
||||
@@ -250,13 +250,13 @@ static void printstruct(SDNA *sdna, short strnr)
|
||||
int b, nr;
|
||||
short *sp;
|
||||
|
||||
sp= sdna->structs[strnr];
|
||||
sp = sdna->structs[strnr];
|
||||
|
||||
printf("struct %s\n", sdna->types[ sp[0] ]);
|
||||
nr= sp[1];
|
||||
sp+= 2;
|
||||
printf("struct %s\n", sdna->types[sp[0]]);
|
||||
nr = sp[1];
|
||||
sp += 2;
|
||||
|
||||
for (b=0; b< nr; b++, sp+= 2) {
|
||||
for (b = 0; b < nr; b++, sp += 2) {
|
||||
printf(" %s %s\n", sdna->types[sp[0]], sdna->names[sp[1]]);
|
||||
}
|
||||
}
|
||||
@@ -265,14 +265,14 @@ static void printstruct(SDNA *sdna, short strnr)
|
||||
static short *findstruct_name(SDNA *sdna, const char *str)
|
||||
{
|
||||
int a;
|
||||
short *sp= NULL;
|
||||
short *sp = NULL;
|
||||
|
||||
|
||||
for (a=0; a<sdna->nr_structs; a++) {
|
||||
for (a = 0; a < sdna->nr_structs; a++) {
|
||||
|
||||
sp= sdna->structs[a];
|
||||
sp = sdna->structs[a];
|
||||
|
||||
if (strcmp( sdna->types[ sp[0] ], str )==0) return sp;
|
||||
if (strcmp(sdna->types[sp[0]], str) == 0) return sp;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
@@ -280,11 +280,11 @@ static short *findstruct_name(SDNA *sdna, const char *str)
|
||||
|
||||
int DNA_struct_find_nr(SDNA *sdna, const char *str)
|
||||
{
|
||||
short *sp= NULL;
|
||||
short *sp = NULL;
|
||||
|
||||
if (sdna->lastfind<sdna->nr_structs) {
|
||||
sp= sdna->structs[sdna->lastfind];
|
||||
if (strcmp( sdna->types[ sp[0] ], str )==0) return sdna->lastfind;
|
||||
if (sdna->lastfind < sdna->nr_structs) {
|
||||
sp = sdna->structs[sdna->lastfind];
|
||||
if (strcmp(sdna->types[sp[0]], str) == 0) return sdna->lastfind;
|
||||
}
|
||||
|
||||
#ifdef WITH_DNA_GHASH
|
||||
@@ -293,12 +293,12 @@ int DNA_struct_find_nr(SDNA *sdna, const char *str)
|
||||
{
|
||||
int a;
|
||||
|
||||
for (a=0; a<sdna->nr_structs; a++) {
|
||||
for (a = 0; a < sdna->nr_structs; a++) {
|
||||
|
||||
sp= sdna->structs[a];
|
||||
sp = sdna->structs[a];
|
||||
|
||||
if (strcmp( sdna->types[ sp[0] ], str )==0) {
|
||||
sdna->lastfind= a;
|
||||
if (strcmp(sdna->types[sp[0]], str) == 0) {
|
||||
sdna->lastfind = a;
|
||||
return a;
|
||||
}
|
||||
}
|
||||
@@ -314,172 +314,172 @@ int DNA_struct_find_nr(SDNA *sdna, const char *str)
|
||||
static void init_structDNA(SDNA *sdna, int do_endian_swap)
|
||||
/* in sdna->data the data, now we convert that to something understandable */
|
||||
{
|
||||
int *data, *verg, gravity_fix= -1;
|
||||
int *data, *verg, gravity_fix = -1;
|
||||
intptr_t nr;
|
||||
short *sp;
|
||||
char str[8], *cp;
|
||||
|
||||
verg= (int *)str;
|
||||
data= (int *)sdna->data;
|
||||
verg = (int *)str;
|
||||
data = (int *)sdna->data;
|
||||
|
||||
strcpy(str, "SDNA");
|
||||
if ( *data == *verg ) {
|
||||
if (*data == *verg) {
|
||||
|
||||
data++;
|
||||
|
||||
/* load names array */
|
||||
strcpy(str, "NAME");
|
||||
if ( *data == *verg ) {
|
||||
if (*data == *verg) {
|
||||
data++;
|
||||
|
||||
if (do_endian_swap) sdna->nr_names= le_int(*data);
|
||||
else sdna->nr_names= *data;
|
||||
if (do_endian_swap) sdna->nr_names = le_int(*data);
|
||||
else sdna->nr_names = *data;
|
||||
|
||||
data++;
|
||||
sdna->names= MEM_callocN(sizeof(void *)*sdna->nr_names, "sdnanames");
|
||||
sdna->names = MEM_callocN(sizeof(void *) * sdna->nr_names, "sdnanames");
|
||||
}
|
||||
else {
|
||||
printf("NAME error in SDNA file\n");
|
||||
return;
|
||||
}
|
||||
|
||||
nr= 0;
|
||||
cp= (char *)data;
|
||||
while (nr<sdna->nr_names) {
|
||||
sdna->names[nr]= cp;
|
||||
nr = 0;
|
||||
cp = (char *)data;
|
||||
while (nr < sdna->nr_names) {
|
||||
sdna->names[nr] = cp;
|
||||
|
||||
/* "float gravity [3]" was parsed wrong giving both "gravity" and
|
||||
* "[3]" members. we rename "[3]", and later set the type of
|
||||
* "gravity" to "void" so the offsets work out correct */
|
||||
if (*cp == '[' && strcmp(cp, "[3]")==0) {
|
||||
if (nr && strcmp(sdna->names[nr-1], "Cvi") == 0) {
|
||||
sdna->names[nr]= "gravity[3]";
|
||||
gravity_fix= nr;
|
||||
if (*cp == '[' && strcmp(cp, "[3]") == 0) {
|
||||
if (nr && strcmp(sdna->names[nr - 1], "Cvi") == 0) {
|
||||
sdna->names[nr] = "gravity[3]";
|
||||
gravity_fix = nr;
|
||||
}
|
||||
}
|
||||
|
||||
while ( *cp) cp++;
|
||||
while (*cp) cp++;
|
||||
cp++;
|
||||
nr++;
|
||||
}
|
||||
nr= (intptr_t)cp; /* prevent BUS error */
|
||||
nr= (nr+3) & ~3;
|
||||
cp= (char *)nr;
|
||||
nr = (intptr_t)cp; /* prevent BUS error */
|
||||
nr = (nr + 3) & ~3;
|
||||
cp = (char *)nr;
|
||||
|
||||
/* load type names array */
|
||||
data= (int *)cp;
|
||||
data = (int *)cp;
|
||||
strcpy(str, "TYPE");
|
||||
if ( *data == *verg ) {
|
||||
if (*data == *verg) {
|
||||
data++;
|
||||
|
||||
if (do_endian_swap) sdna->nr_types= le_int(*data);
|
||||
else sdna->nr_types= *data;
|
||||
if (do_endian_swap) sdna->nr_types = le_int(*data);
|
||||
else sdna->nr_types = *data;
|
||||
|
||||
data++;
|
||||
sdna->types= MEM_callocN(sizeof(void *)*sdna->nr_types, "sdnatypes");
|
||||
sdna->types = MEM_callocN(sizeof(void *) * sdna->nr_types, "sdnatypes");
|
||||
}
|
||||
else {
|
||||
printf("TYPE error in SDNA file\n");
|
||||
return;
|
||||
}
|
||||
|
||||
nr= 0;
|
||||
cp= (char *)data;
|
||||
while (nr<sdna->nr_types) {
|
||||
sdna->types[nr]= cp;
|
||||
nr = 0;
|
||||
cp = (char *)data;
|
||||
while (nr < sdna->nr_types) {
|
||||
sdna->types[nr] = cp;
|
||||
|
||||
/* this is a patch, to change struct names without a conflict with SDNA */
|
||||
/* be careful to use it, in this case for a system-struct (opengl/X) */
|
||||
|
||||
if ( *cp == 'b') {
|
||||
if (*cp == 'b') {
|
||||
/* struct Screen was already used by X, 'bScreen' replaces the old IrisGL 'Screen' struct */
|
||||
if ( strcmp("bScreen", cp)==0 ) sdna->types[nr]= cp+1;
|
||||
if (strcmp("bScreen", cp) == 0) sdna->types[nr] = cp + 1;
|
||||
}
|
||||
|
||||
while ( *cp) cp++;
|
||||
while (*cp) cp++;
|
||||
cp++;
|
||||
nr++;
|
||||
}
|
||||
nr= (intptr_t)cp; /* prevent BUS error */
|
||||
nr= (nr+3) & ~3;
|
||||
cp= (char *)nr;
|
||||
nr = (intptr_t)cp; /* prevent BUS error */
|
||||
nr = (nr + 3) & ~3;
|
||||
cp = (char *)nr;
|
||||
|
||||
/* load typelen array */
|
||||
data= (int *)cp;
|
||||
data = (int *)cp;
|
||||
strcpy(str, "TLEN");
|
||||
if ( *data == *verg ) {
|
||||
if (*data == *verg) {
|
||||
data++;
|
||||
sp= (short *)data;
|
||||
sdna->typelens= sp;
|
||||
sp = (short *)data;
|
||||
sdna->typelens = sp;
|
||||
|
||||
if (do_endian_swap) {
|
||||
short a, *spo= sp;
|
||||
short a, *spo = sp;
|
||||
|
||||
a= sdna->nr_types;
|
||||
a = sdna->nr_types;
|
||||
while (a--) {
|
||||
spo[0]= le_short(spo[0]);
|
||||
spo[0] = le_short(spo[0]);
|
||||
spo++;
|
||||
}
|
||||
}
|
||||
|
||||
sp+= sdna->nr_types;
|
||||
sp += sdna->nr_types;
|
||||
}
|
||||
else {
|
||||
printf("TLEN error in SDNA file\n");
|
||||
return;
|
||||
}
|
||||
if (sdna->nr_types & 1) sp++; /* prevent BUS error */
|
||||
if (sdna->nr_types & 1) sp++; /* prevent BUS error */
|
||||
|
||||
/* load struct array */
|
||||
data= (int *)sp;
|
||||
data = (int *)sp;
|
||||
strcpy(str, "STRC");
|
||||
if ( *data == *verg ) {
|
||||
if (*data == *verg) {
|
||||
data++;
|
||||
|
||||
if (do_endian_swap) sdna->nr_structs= le_int(*data);
|
||||
else sdna->nr_structs= *data;
|
||||
if (do_endian_swap) sdna->nr_structs = le_int(*data);
|
||||
else sdna->nr_structs = *data;
|
||||
|
||||
data++;
|
||||
sdna->structs= MEM_callocN(sizeof(void *)*sdna->nr_structs, "sdnastrcs");
|
||||
sdna->structs = MEM_callocN(sizeof(void *) * sdna->nr_structs, "sdnastrcs");
|
||||
}
|
||||
else {
|
||||
printf("STRC error in SDNA file\n");
|
||||
return;
|
||||
}
|
||||
|
||||
nr= 0;
|
||||
sp= (short *)data;
|
||||
while (nr<sdna->nr_structs) {
|
||||
sdna->structs[nr]= sp;
|
||||
nr = 0;
|
||||
sp = (short *)data;
|
||||
while (nr < sdna->nr_structs) {
|
||||
sdna->structs[nr] = sp;
|
||||
|
||||
if (do_endian_swap) {
|
||||
short a;
|
||||
|
||||
sp[0]= le_short(sp[0]);
|
||||
sp[1]= le_short(sp[1]);
|
||||
sp[0] = le_short(sp[0]);
|
||||
sp[1] = le_short(sp[1]);
|
||||
|
||||
a= sp[1];
|
||||
sp+= 2;
|
||||
a = sp[1];
|
||||
sp += 2;
|
||||
while (a--) {
|
||||
sp[0]= le_short(sp[0]);
|
||||
sp[1]= le_short(sp[1]);
|
||||
sp+= 2;
|
||||
sp[0] = le_short(sp[0]);
|
||||
sp[1] = le_short(sp[1]);
|
||||
sp += 2;
|
||||
}
|
||||
}
|
||||
else {
|
||||
sp+= 2*sp[1]+2;
|
||||
sp += 2 * sp[1] + 2;
|
||||
}
|
||||
|
||||
nr++;
|
||||
}
|
||||
|
||||
/* finally pointerlen: use struct ListBase to test it, never change the size of it! */
|
||||
sp= findstruct_name(sdna, "ListBase");
|
||||
sp = findstruct_name(sdna, "ListBase");
|
||||
/* weird; i have no memory of that... I think I used sizeof(void *) before... (ton) */
|
||||
|
||||
sdna->pointerlen= sdna->typelens[ sp[0] ]/2;
|
||||
sdna->pointerlen = sdna->typelens[sp[0]] / 2;
|
||||
|
||||
if (sp[1]!=2 || (sdna->pointerlen!=4 && sdna->pointerlen!=8)) {
|
||||
if (sp[1] != 2 || (sdna->pointerlen != 4 && sdna->pointerlen != 8)) {
|
||||
printf("ListBase struct error! Needs it to calculate pointerize.\n");
|
||||
exit(0);
|
||||
/* well, at least sizeof(ListBase) is error proof! (ton) */
|
||||
@@ -487,19 +487,19 @@ static void init_structDNA(SDNA *sdna, int do_endian_swap)
|
||||
|
||||
/* second part of gravity problem, setting "gravity" type to void */
|
||||
if (gravity_fix > -1) {
|
||||
for (nr=0; nr<sdna->nr_structs; nr++) {
|
||||
sp= sdna->structs[nr];
|
||||
for (nr = 0; nr < sdna->nr_structs; nr++) {
|
||||
sp = sdna->structs[nr];
|
||||
if (strcmp(sdna->types[sp[0]], "ClothSimSettings") == 0)
|
||||
sp[10]= SDNA_TYPE_VOID;
|
||||
sp[10] = SDNA_TYPE_VOID;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef WITH_DNA_GHASH
|
||||
/* create a ghash lookup to speed up */
|
||||
sdna->structs_map= BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp, "init_structDNA gh");
|
||||
sdna->structs_map = BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp, "init_structDNA gh");
|
||||
|
||||
for (nr = 0; nr < sdna->nr_structs; nr++) {
|
||||
sp= sdna->structs[nr];
|
||||
sp = sdna->structs[nr];
|
||||
BLI_ghash_insert(sdna->structs_map, (void *)sdna->types[sp[0]], (void *)(nr + 1));
|
||||
}
|
||||
#endif
|
||||
@@ -508,12 +508,12 @@ static void init_structDNA(SDNA *sdna, int do_endian_swap)
|
||||
|
||||
SDNA *DNA_sdna_from_data(void *data, int datalen, int do_endian_swap)
|
||||
{
|
||||
SDNA *sdna= MEM_mallocN(sizeof(*sdna), "sdna");
|
||||
SDNA *sdna = MEM_mallocN(sizeof(*sdna), "sdna");
|
||||
|
||||
sdna->lastfind= 0;
|
||||
sdna->lastfind = 0;
|
||||
|
||||
sdna->datalen= datalen;
|
||||
sdna->data= MEM_mallocN(datalen, "sdna_data");
|
||||
sdna->datalen = datalen;
|
||||
sdna->data = MEM_mallocN(datalen, "sdna_data");
|
||||
memcpy(sdna->data, data, datalen);
|
||||
|
||||
init_structDNA(sdna, do_endian_swap);
|
||||
@@ -532,19 +532,19 @@ static void recurs_test_compflags(SDNA *sdna, char *compflags, int structnr)
|
||||
const char *cp;
|
||||
|
||||
/* check all structs, test if it's inside another struct */
|
||||
sp= sdna->structs[structnr];
|
||||
typenr= sp[0];
|
||||
sp = sdna->structs[structnr];
|
||||
typenr = sp[0];
|
||||
|
||||
for (a=0; a<sdna->nr_structs; a++) {
|
||||
if (a!=structnr && compflags[a]==1) {
|
||||
sp= sdna->structs[a];
|
||||
elems= sp[1];
|
||||
sp+= 2;
|
||||
for (b=0; b<elems; b++, sp+=2) {
|
||||
if (sp[0]==typenr) {
|
||||
cp= sdna->names[ sp[1] ];
|
||||
for (a = 0; a < sdna->nr_structs; a++) {
|
||||
if (a != structnr && compflags[a] == 1) {
|
||||
sp = sdna->structs[a];
|
||||
elems = sp[1];
|
||||
sp += 2;
|
||||
for (b = 0; b < elems; b++, sp += 2) {
|
||||
if (sp[0] == typenr) {
|
||||
cp = sdna->names[sp[1]];
|
||||
if (!ispointer(cp)) {
|
||||
compflags[a]= 2;
|
||||
compflags[a] = 2;
|
||||
recurs_test_compflags(sdna, compflags, a);
|
||||
}
|
||||
}
|
||||
@@ -554,11 +554,11 @@ static void recurs_test_compflags(SDNA *sdna, char *compflags, int structnr)
|
||||
|
||||
}
|
||||
|
||||
/* Unsure of exact function - compares the sdna argument to
|
||||
* newsdna and sets up the information necessary to convert
|
||||
* data written with a dna of oldsdna to inmemory data with a
|
||||
* structure defined by the newsdna sdna (I think). -zr
|
||||
*/
|
||||
/* Unsure of exact function - compares the sdna argument to
|
||||
* newsdna and sets up the information necessary to convert
|
||||
* data written with a dna of oldsdna to inmemory data with a
|
||||
* structure defined by the newsdna sdna (I think). -zr
|
||||
*/
|
||||
|
||||
/* well, the function below is just a lookup table to speed
|
||||
* up reading files. doh! -ton
|
||||
@@ -576,53 +576,53 @@ char *DNA_struct_get_compareflags(SDNA *sdna, SDNA *newsdna)
|
||||
const char *str1, *str2;
|
||||
char *compflags;
|
||||
|
||||
if (sdna->nr_structs==0) {
|
||||
if (sdna->nr_structs == 0) {
|
||||
printf("error: file without SDNA\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
compflags= MEM_callocN(sdna->nr_structs, "compflags");
|
||||
compflags = MEM_callocN(sdna->nr_structs, "compflags");
|
||||
|
||||
/* we check all structs in 'sdna' and compare them with
|
||||
* the structs in 'newsdna'
|
||||
*/
|
||||
|
||||
for (a=0; a<sdna->nr_structs; a++) {
|
||||
spold= sdna->structs[a];
|
||||
for (a = 0; a < sdna->nr_structs; a++) {
|
||||
spold = sdna->structs[a];
|
||||
|
||||
/* search for type in cur */
|
||||
spcur= findstruct_name(newsdna, sdna->types[spold[0]]);
|
||||
spcur = findstruct_name(newsdna, sdna->types[spold[0]]);
|
||||
|
||||
if (spcur) {
|
||||
compflags[a]= 2;
|
||||
compflags[a] = 2;
|
||||
|
||||
/* compare length and amount of elems */
|
||||
if ( spcur[1] == spold[1]) {
|
||||
if ( newsdna->typelens[spcur[0]] == sdna->typelens[spold[0]] ) {
|
||||
if (spcur[1] == spold[1]) {
|
||||
if (newsdna->typelens[spcur[0]] == sdna->typelens[spold[0]]) {
|
||||
|
||||
/* same length, same amount of elems, now per type and name */
|
||||
b= spold[1];
|
||||
spold+= 2;
|
||||
spcur+= 2;
|
||||
b = spold[1];
|
||||
spold += 2;
|
||||
spcur += 2;
|
||||
while (b > 0) {
|
||||
str1= newsdna->types[spcur[0]];
|
||||
str2= sdna->types[spold[0]];
|
||||
if (strcmp(str1, str2)!=0) break;
|
||||
str1 = newsdna->types[spcur[0]];
|
||||
str2 = sdna->types[spold[0]];
|
||||
if (strcmp(str1, str2) != 0) break;
|
||||
|
||||
str1= newsdna->names[spcur[1]];
|
||||
str2= sdna->names[spold[1]];
|
||||
if (strcmp(str1, str2)!=0) break;
|
||||
str1 = newsdna->names[spcur[1]];
|
||||
str2 = sdna->names[spold[1]];
|
||||
if (strcmp(str1, str2) != 0) break;
|
||||
|
||||
/* same type and same name, now pointersize */
|
||||
if (ispointer(str1)) {
|
||||
if (sdna->pointerlen!=newsdna->pointerlen) break;
|
||||
if (sdna->pointerlen != newsdna->pointerlen) break;
|
||||
}
|
||||
|
||||
b--;
|
||||
spold+= 2;
|
||||
spcur+= 2;
|
||||
spold += 2;
|
||||
spcur += 2;
|
||||
}
|
||||
if (b==0) compflags[a]= 1;
|
||||
if (b == 0) compflags[a] = 1;
|
||||
|
||||
}
|
||||
}
|
||||
@@ -633,20 +633,20 @@ char *DNA_struct_get_compareflags(SDNA *sdna, SDNA *newsdna)
|
||||
/* first struct in util.h is struct Link, this is skipped in compflags (als # 0).
|
||||
* was a bug, and this way dirty patched! Solve this later....
|
||||
*/
|
||||
compflags[0]= 1;
|
||||
compflags[0] = 1;
|
||||
|
||||
/* Because structs can be inside structs, we recursively
|
||||
* set flags when a struct is altered
|
||||
*/
|
||||
for (a=0; a<sdna->nr_structs; a++) {
|
||||
if (compflags[a]==2) recurs_test_compflags(sdna, compflags, a);
|
||||
for (a = 0; a < sdna->nr_structs; a++) {
|
||||
if (compflags[a] == 2) recurs_test_compflags(sdna, compflags, a);
|
||||
}
|
||||
|
||||
#if 0
|
||||
for (a=0; a<sdna->nr_structs; a++) {
|
||||
if (compflags[a]==2) {
|
||||
spold= sdna->structs[a];
|
||||
printf("changed: %s\n", sdna->types[ spold[0] ]);
|
||||
for (a = 0; a < sdna->nr_structs; a++) {
|
||||
if (compflags[a] == 2) {
|
||||
spold = sdna->structs[a];
|
||||
printf("changed: %s\n", sdna->types[spold[0]]);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -656,94 +656,94 @@ char *DNA_struct_get_compareflags(SDNA *sdna, SDNA *newsdna)
|
||||
|
||||
static eSDNA_Type sdna_type_nr(const char *dna_type)
|
||||
{
|
||||
if ((strcmp(dna_type, "char")==0) || (strcmp(dna_type, "const char")==0)) return SDNA_TYPE_CHAR;
|
||||
else if ((strcmp(dna_type, "uchar")==0) || (strcmp(dna_type, "unsigned char")==0)) return SDNA_TYPE_UCHAR;
|
||||
else if ( strcmp(dna_type, "short")==0) return SDNA_TYPE_SHORT;
|
||||
else if ((strcmp(dna_type, "ushort")==0)||(strcmp(dna_type, "unsigned short")==0)) return SDNA_TYPE_USHORT;
|
||||
else if ( strcmp(dna_type, "int")==0) return SDNA_TYPE_INT;
|
||||
else if ( strcmp(dna_type, "long")==0) return SDNA_TYPE_LONG;
|
||||
else if ((strcmp(dna_type, "ulong")==0)||(strcmp(dna_type, "unsigned long")==0)) return SDNA_TYPE_ULONG;
|
||||
else if ( strcmp(dna_type, "float")==0) return SDNA_TYPE_FLOAT;
|
||||
else if ( strcmp(dna_type, "double")==0) return SDNA_TYPE_DOUBLE;
|
||||
else if ( strcmp(dna_type, "int64_t")==0) return SDNA_TYPE_INT64;
|
||||
else if ( strcmp(dna_type, "uint64_t")==0) return SDNA_TYPE_UINT64;
|
||||
else return -1; /* invalid! */
|
||||
if ((strcmp(dna_type, "char") == 0) || (strcmp(dna_type, "const char") == 0)) return SDNA_TYPE_CHAR;
|
||||
else if ((strcmp(dna_type, "uchar") == 0) || (strcmp(dna_type, "unsigned char") == 0)) return SDNA_TYPE_UCHAR;
|
||||
else if ( strcmp(dna_type, "short") == 0) return SDNA_TYPE_SHORT;
|
||||
else if ((strcmp(dna_type, "ushort") == 0)||(strcmp(dna_type, "unsigned short") == 0)) return SDNA_TYPE_USHORT;
|
||||
else if ( strcmp(dna_type, "int") == 0) return SDNA_TYPE_INT;
|
||||
else if ( strcmp(dna_type, "long") == 0) return SDNA_TYPE_LONG;
|
||||
else if ((strcmp(dna_type, "ulong") == 0)||(strcmp(dna_type, "unsigned long") == 0)) return SDNA_TYPE_ULONG;
|
||||
else if ( strcmp(dna_type, "float") == 0) return SDNA_TYPE_FLOAT;
|
||||
else if ( strcmp(dna_type, "double") == 0) return SDNA_TYPE_DOUBLE;
|
||||
else if ( strcmp(dna_type, "int64_t") == 0) return SDNA_TYPE_INT64;
|
||||
else if ( strcmp(dna_type, "uint64_t") == 0) return SDNA_TYPE_UINT64;
|
||||
else return -1; /* invalid! */
|
||||
}
|
||||
|
||||
static void cast_elem(const char *ctype, const char *otype, const char *name, char *curdata, char *olddata)
|
||||
{
|
||||
double val = 0.0;
|
||||
int arrlen, curlen=1, oldlen=1;
|
||||
int arrlen, curlen = 1, oldlen = 1;
|
||||
|
||||
eSDNA_Type ctypenr, otypenr;
|
||||
|
||||
arrlen= DNA_elem_array_size(name, strlen(name));
|
||||
arrlen = DNA_elem_array_size(name, strlen(name));
|
||||
|
||||
if ( (otypenr= sdna_type_nr(otype)) == -1 ||
|
||||
(ctypenr= sdna_type_nr(ctype)) == -1 )
|
||||
if ( (otypenr = sdna_type_nr(otype)) == -1 ||
|
||||
(ctypenr = sdna_type_nr(ctype)) == -1)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
/* define lengths */
|
||||
oldlen= DNA_elem_type_size(otypenr);
|
||||
curlen= DNA_elem_type_size(ctypenr);
|
||||
oldlen = DNA_elem_type_size(otypenr);
|
||||
curlen = DNA_elem_type_size(ctypenr);
|
||||
|
||||
while (arrlen>0) {
|
||||
while (arrlen > 0) {
|
||||
switch (otypenr) {
|
||||
case SDNA_TYPE_CHAR:
|
||||
val= *olddata; break;
|
||||
case SDNA_TYPE_UCHAR:
|
||||
val= *( (unsigned char *)olddata); break;
|
||||
case SDNA_TYPE_SHORT:
|
||||
val= *( (short *)olddata); break;
|
||||
case SDNA_TYPE_USHORT:
|
||||
val= *( (unsigned short *)olddata); break;
|
||||
case SDNA_TYPE_INT:
|
||||
val= *( (int *)olddata); break;
|
||||
case SDNA_TYPE_LONG:
|
||||
val= *( (int *)olddata); break;
|
||||
case SDNA_TYPE_ULONG:
|
||||
val= *( (unsigned int *)olddata); break;
|
||||
case SDNA_TYPE_FLOAT:
|
||||
val= *( (float *)olddata); break;
|
||||
case SDNA_TYPE_DOUBLE:
|
||||
val= *( (double *)olddata); break;
|
||||
case SDNA_TYPE_INT64:
|
||||
val= *( (int64_t *)olddata); break;
|
||||
case SDNA_TYPE_UINT64:
|
||||
val= *( (uint64_t *)olddata); break;
|
||||
case SDNA_TYPE_CHAR:
|
||||
val = *olddata; break;
|
||||
case SDNA_TYPE_UCHAR:
|
||||
val = *( (unsigned char *)olddata); break;
|
||||
case SDNA_TYPE_SHORT:
|
||||
val = *( (short *)olddata); break;
|
||||
case SDNA_TYPE_USHORT:
|
||||
val = *( (unsigned short *)olddata); break;
|
||||
case SDNA_TYPE_INT:
|
||||
val = *( (int *)olddata); break;
|
||||
case SDNA_TYPE_LONG:
|
||||
val = *( (int *)olddata); break;
|
||||
case SDNA_TYPE_ULONG:
|
||||
val = *( (unsigned int *)olddata); break;
|
||||
case SDNA_TYPE_FLOAT:
|
||||
val = *( (float *)olddata); break;
|
||||
case SDNA_TYPE_DOUBLE:
|
||||
val = *( (double *)olddata); break;
|
||||
case SDNA_TYPE_INT64:
|
||||
val = *( (int64_t *)olddata); break;
|
||||
case SDNA_TYPE_UINT64:
|
||||
val = *( (uint64_t *)olddata); break;
|
||||
}
|
||||
|
||||
switch (ctypenr) {
|
||||
case SDNA_TYPE_CHAR:
|
||||
*curdata= val; break;
|
||||
case SDNA_TYPE_UCHAR:
|
||||
*( (unsigned char *)curdata)= val; break;
|
||||
case SDNA_TYPE_SHORT:
|
||||
*( (short *)curdata)= val; break;
|
||||
case SDNA_TYPE_USHORT:
|
||||
*( (unsigned short *)curdata)= val; break;
|
||||
case SDNA_TYPE_INT:
|
||||
*( (int *)curdata)= val; break;
|
||||
case SDNA_TYPE_LONG:
|
||||
*( (int *)curdata)= val; break;
|
||||
case SDNA_TYPE_ULONG:
|
||||
*( (unsigned int *)curdata)= val; break;
|
||||
case SDNA_TYPE_FLOAT:
|
||||
if (otypenr<2) val/= 255;
|
||||
*( (float *)curdata)= val; break;
|
||||
case SDNA_TYPE_DOUBLE:
|
||||
if (otypenr<2) val/= 255;
|
||||
*( (double *)curdata)= val; break;
|
||||
case SDNA_TYPE_INT64:
|
||||
*( (int64_t *)curdata)= val; break;
|
||||
case SDNA_TYPE_UINT64:
|
||||
*( (uint64_t *)curdata)= val; break;
|
||||
case SDNA_TYPE_CHAR:
|
||||
*curdata = val; break;
|
||||
case SDNA_TYPE_UCHAR:
|
||||
*( (unsigned char *)curdata) = val; break;
|
||||
case SDNA_TYPE_SHORT:
|
||||
*( (short *)curdata) = val; break;
|
||||
case SDNA_TYPE_USHORT:
|
||||
*( (unsigned short *)curdata) = val; break;
|
||||
case SDNA_TYPE_INT:
|
||||
*( (int *)curdata) = val; break;
|
||||
case SDNA_TYPE_LONG:
|
||||
*( (int *)curdata) = val; break;
|
||||
case SDNA_TYPE_ULONG:
|
||||
*( (unsigned int *)curdata) = val; break;
|
||||
case SDNA_TYPE_FLOAT:
|
||||
if (otypenr < 2) val /= 255;
|
||||
*( (float *)curdata) = val; break;
|
||||
case SDNA_TYPE_DOUBLE:
|
||||
if (otypenr < 2) val /= 255;
|
||||
*( (double *)curdata) = val; break;
|
||||
case SDNA_TYPE_INT64:
|
||||
*( (int64_t *)curdata) = val; break;
|
||||
case SDNA_TYPE_UINT64:
|
||||
*( (uint64_t *)curdata) = val; break;
|
||||
}
|
||||
|
||||
olddata+= oldlen;
|
||||
curdata+= curlen;
|
||||
olddata += oldlen;
|
||||
curdata += curlen;
|
||||
arrlen--;
|
||||
}
|
||||
}
|
||||
@@ -757,26 +757,26 @@ static void cast_pointer(int curlen, int oldlen, const char *name, char *curdata
|
||||
#endif
|
||||
int arrlen;
|
||||
|
||||
arrlen= DNA_elem_array_size(name, strlen(name));
|
||||
arrlen = DNA_elem_array_size(name, strlen(name));
|
||||
|
||||
while (arrlen>0) {
|
||||
while (arrlen > 0) {
|
||||
|
||||
if (curlen==oldlen) {
|
||||
if (curlen == oldlen) {
|
||||
memcpy(curdata, olddata, curlen);
|
||||
}
|
||||
else if (curlen==4 && oldlen==8) {
|
||||
else if (curlen == 4 && oldlen == 8) {
|
||||
#ifdef WIN32
|
||||
lval= *( (__int64 *)olddata );
|
||||
lval = *( (__int64 *)olddata);
|
||||
#else
|
||||
lval= *( (long long *)olddata );
|
||||
lval = *( (long long *)olddata);
|
||||
#endif
|
||||
*((int *)curdata) = lval>>3; /* is of course gambling! */
|
||||
*((int *)curdata) = lval >> 3; /* is of course gambling! */
|
||||
}
|
||||
else if (curlen==8 && oldlen==4) {
|
||||
else if (curlen == 8 && oldlen == 4) {
|
||||
#ifdef WIN32
|
||||
*( (__int64 *)curdata ) = *((int *)olddata);
|
||||
*( (__int64 *)curdata) = *((int *)olddata);
|
||||
#else
|
||||
*( (long long *)curdata ) = *((int *)olddata);
|
||||
*( (long long *)curdata) = *((int *)olddata);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
@@ -784,8 +784,8 @@ static void cast_pointer(int curlen, int oldlen, const char *name, char *curdata
|
||||
printf("errpr: illegal pointersize!\n");
|
||||
}
|
||||
|
||||
olddata+= oldlen;
|
||||
curdata+= curlen;
|
||||
olddata += oldlen;
|
||||
curdata += curlen;
|
||||
arrlen--;
|
||||
|
||||
}
|
||||
@@ -793,14 +793,14 @@ static void cast_pointer(int curlen, int oldlen, const char *name, char *curdata
|
||||
|
||||
static int elem_strcmp(const char *name, const char *oname)
|
||||
{
|
||||
int a=0;
|
||||
int a = 0;
|
||||
|
||||
/* strcmp without array part */
|
||||
|
||||
while (1) {
|
||||
if (name[a] != oname[a]) return 1;
|
||||
if (name[a]=='[') break;
|
||||
if (name[a]==0) break;
|
||||
if (name[a] == '[') break;
|
||||
if (name[a] == 0) break;
|
||||
a++;
|
||||
}
|
||||
return 0;
|
||||
@@ -814,25 +814,25 @@ static char *find_elem(SDNA *sdna, const char *type, const char *name, short *ol
|
||||
/* without arraypart, so names can differ: return old namenr and type */
|
||||
|
||||
/* in old is the old struct */
|
||||
elemcount= old[1];
|
||||
old+= 2;
|
||||
for (a=0; a<elemcount; a++, old+=2) {
|
||||
|
||||
otype= sdna->types[old[0]];
|
||||
oname= sdna->names[old[1]];
|
||||
|
||||
len= elementsize(sdna, old[0], old[1]);
|
||||
|
||||
if ( elem_strcmp(name, oname)==0 ) { /* naam equal */
|
||||
if ( strcmp(type, otype)==0 ) { /* type equal */
|
||||
if (sppo) *sppo= old;
|
||||
elemcount = old[1];
|
||||
old += 2;
|
||||
for (a = 0; a < elemcount; a++, old += 2) {
|
||||
|
||||
otype = sdna->types[old[0]];
|
||||
oname = sdna->names[old[1]];
|
||||
|
||||
len = elementsize(sdna, old[0], old[1]);
|
||||
|
||||
if (elem_strcmp(name, oname) == 0) { /* naam equal */
|
||||
if (strcmp(type, otype) == 0) { /* type equal */
|
||||
if (sppo) *sppo = old;
|
||||
return olddata;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
olddata+= len;
|
||||
olddata += len;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
@@ -841,11 +841,11 @@ static void reconstruct_elem(SDNA *newsdna, SDNA *oldsdna,
|
||||
char *type, const char *name, char *curdata, short *old, char *olddata)
|
||||
{
|
||||
/* rules: test for NAME:
|
||||
* - name equal:
|
||||
* - cast type
|
||||
* - name partially equal (array differs)
|
||||
* - type equal: memcpy
|
||||
* - types casten
|
||||
* - name equal:
|
||||
* - cast type
|
||||
* - name partially equal (array differs)
|
||||
* - type equal: memcpy
|
||||
* - types casten
|
||||
* (nzc 2-4-2001 I want the 'unsigned' bit to be parsed as well. Where
|
||||
* can I force this?)
|
||||
*/
|
||||
@@ -854,61 +854,61 @@ static void reconstruct_elem(SDNA *newsdna, SDNA *oldsdna,
|
||||
const char *oname, *cp;
|
||||
|
||||
/* is 'name' an array? */
|
||||
cp= name;
|
||||
array= 0;
|
||||
while ( *cp && *cp!='[') {
|
||||
cp = name;
|
||||
array = 0;
|
||||
while (*cp && *cp != '[') {
|
||||
cp++; array++;
|
||||
}
|
||||
if ( *cp!= '[' ) array= 0;
|
||||
if (*cp != '[') array = 0;
|
||||
|
||||
/* in old is the old struct */
|
||||
elemcount= old[1];
|
||||
old+= 2;
|
||||
for (a=0; a<elemcount; a++, old+=2) {
|
||||
otype= oldsdna->types[old[0]];
|
||||
oname= oldsdna->names[old[1]];
|
||||
len= elementsize(oldsdna, old[0], old[1]);
|
||||
elemcount = old[1];
|
||||
old += 2;
|
||||
for (a = 0; a < elemcount; a++, old += 2) {
|
||||
otype = oldsdna->types[old[0]];
|
||||
oname = oldsdna->names[old[1]];
|
||||
len = elementsize(oldsdna, old[0], old[1]);
|
||||
|
||||
if ( strcmp(name, oname)==0 ) { /* name equal */
|
||||
if (strcmp(name, oname) == 0) { /* name equal */
|
||||
|
||||
if (ispointer(name)) { /* pointer of functionpointer afhandelen */
|
||||
if (ispointer(name)) { /* pointer of functionpointer afhandelen */
|
||||
cast_pointer(newsdna->pointerlen, oldsdna->pointerlen, name, curdata, olddata);
|
||||
}
|
||||
else if ( strcmp(type, otype)==0 ) { /* type equal */
|
||||
else if (strcmp(type, otype) == 0) { /* type equal */
|
||||
memcpy(curdata, olddata, len);
|
||||
}
|
||||
else cast_elem(type, otype, name, curdata, olddata);
|
||||
|
||||
return;
|
||||
}
|
||||
else if (array) { /* name is an array */
|
||||
else if (array) { /* name is an array */
|
||||
|
||||
if (oname[array]=='[' && strncmp(name, oname, array)==0 ) { /* basis equal */
|
||||
if (oname[array] == '[' && strncmp(name, oname, array) == 0) { /* basis equal */
|
||||
|
||||
cursize= DNA_elem_array_size(name, strlen(name));
|
||||
oldsize= DNA_elem_array_size(oname, strlen(oname));
|
||||
cursize = DNA_elem_array_size(name, strlen(name));
|
||||
oldsize = DNA_elem_array_size(oname, strlen(oname));
|
||||
|
||||
if (ispointer(name)) { /* handle pointer or functionpointer */
|
||||
if (cursize>oldsize) cast_pointer(newsdna->pointerlen, oldsdna->pointerlen, oname, curdata, olddata);
|
||||
if (ispointer(name)) { /* handle pointer or functionpointer */
|
||||
if (cursize > oldsize) cast_pointer(newsdna->pointerlen, oldsdna->pointerlen, oname, curdata, olddata);
|
||||
else cast_pointer(newsdna->pointerlen, oldsdna->pointerlen, name, curdata, olddata);
|
||||
}
|
||||
else if (name[0]=='*' || strcmp(type, otype)==0 ) { /* type equal */
|
||||
mul= len/oldsize;
|
||||
mul*= (cursize < oldsize)? cursize: oldsize;
|
||||
else if (name[0] == '*' || strcmp(type, otype) == 0) { /* type equal */
|
||||
mul = len / oldsize;
|
||||
mul *= (cursize < oldsize) ? cursize : oldsize;
|
||||
memcpy(curdata, olddata, mul);
|
||||
|
||||
/* terminate strings */
|
||||
if (oldsize > cursize && strcmp(type, "char")==0)
|
||||
curdata[mul-1]= 0;
|
||||
if (oldsize > cursize && strcmp(type, "char") == 0)
|
||||
curdata[mul - 1] = 0;
|
||||
}
|
||||
else {
|
||||
if (cursize>oldsize) cast_elem(type, otype, oname, curdata, olddata);
|
||||
if (cursize > oldsize) cast_elem(type, otype, oname, curdata, olddata);
|
||||
else cast_elem(type, otype, name, curdata, olddata);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
olddata+= len;
|
||||
olddata += len;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -924,69 +924,69 @@ static void reconstruct_struct(SDNA *newsdna, SDNA *oldsdna,
|
||||
char *type, *cpo, *cpc;
|
||||
const char *name, *nameo;
|
||||
|
||||
if (oldSDNAnr== -1) return;
|
||||
if (curSDNAnr== -1) return;
|
||||
if (oldSDNAnr == -1) return;
|
||||
if (curSDNAnr == -1) return;
|
||||
|
||||
if ( compflags[oldSDNAnr]==1 ) { /* if recursive: test for equal */
|
||||
if (compflags[oldSDNAnr] == 1) { /* if recursive: test for equal */
|
||||
|
||||
spo= oldsdna->structs[oldSDNAnr];
|
||||
elen= oldsdna->typelens[ spo[0] ];
|
||||
spo = oldsdna->structs[oldSDNAnr];
|
||||
elen = oldsdna->typelens[spo[0]];
|
||||
memcpy(cur, data, elen);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
firststructtypenr= *(newsdna->structs[0]);
|
||||
firststructtypenr = *(newsdna->structs[0]);
|
||||
|
||||
spo= oldsdna->structs[oldSDNAnr];
|
||||
spc= newsdna->structs[curSDNAnr];
|
||||
spo = oldsdna->structs[oldSDNAnr];
|
||||
spc = newsdna->structs[curSDNAnr];
|
||||
|
||||
elemcount= spc[1];
|
||||
elemcount = spc[1];
|
||||
|
||||
spc+= 2;
|
||||
cpc= cur;
|
||||
for (a=0; a<elemcount; a++, spc+=2) {
|
||||
type= newsdna->types[spc[0]];
|
||||
name= newsdna->names[spc[1]];
|
||||
spc += 2;
|
||||
cpc = cur;
|
||||
for (a = 0; a < elemcount; a++, spc += 2) {
|
||||
type = newsdna->types[spc[0]];
|
||||
name = newsdna->names[spc[1]];
|
||||
|
||||
elen= elementsize(newsdna, spc[0], spc[1]);
|
||||
elen = elementsize(newsdna, spc[0], spc[1]);
|
||||
|
||||
/* test: is type a struct? */
|
||||
if (spc[0]>=firststructtypenr && !ispointer(name)) {
|
||||
if (spc[0] >= firststructtypenr && !ispointer(name)) {
|
||||
|
||||
/* where does the old struct data start (and is there an old one?) */
|
||||
cpo= find_elem(oldsdna, type, name, spo, data, &sppo);
|
||||
cpo = find_elem(oldsdna, type, name, spo, data, &sppo);
|
||||
|
||||
if (cpo) {
|
||||
oldSDNAnr= DNA_struct_find_nr(oldsdna, type);
|
||||
curSDNAnr= DNA_struct_find_nr(newsdna, type);
|
||||
oldSDNAnr = DNA_struct_find_nr(oldsdna, type);
|
||||
curSDNAnr = DNA_struct_find_nr(newsdna, type);
|
||||
|
||||
/* array! */
|
||||
mul= DNA_elem_array_size(name, strlen(name));
|
||||
nameo= oldsdna->names[sppo[1]];
|
||||
mulo= DNA_elem_array_size(nameo, strlen(nameo));
|
||||
mul = DNA_elem_array_size(name, strlen(name));
|
||||
nameo = oldsdna->names[sppo[1]];
|
||||
mulo = DNA_elem_array_size(nameo, strlen(nameo));
|
||||
|
||||
eleno= elementsize(oldsdna, sppo[0], sppo[1]);
|
||||
eleno = elementsize(oldsdna, sppo[0], sppo[1]);
|
||||
|
||||
elen/= mul;
|
||||
eleno/= mulo;
|
||||
elen /= mul;
|
||||
eleno /= mulo;
|
||||
|
||||
while (mul--) {
|
||||
reconstruct_struct(newsdna, oldsdna, compflags, oldSDNAnr, cpo, curSDNAnr, cpc);
|
||||
cpo+= eleno;
|
||||
cpc+= elen;
|
||||
cpo += eleno;
|
||||
cpc += elen;
|
||||
|
||||
/* new struct array larger than old */
|
||||
mulo--;
|
||||
if (mulo<=0) break;
|
||||
if (mulo <= 0) break;
|
||||
}
|
||||
}
|
||||
else cpc+= elen;
|
||||
else cpc += elen;
|
||||
}
|
||||
else {
|
||||
|
||||
reconstruct_elem(newsdna, oldsdna, type, name, cpc, spo, data);
|
||||
cpc+= elen;
|
||||
cpc += elen;
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1002,32 +1002,32 @@ void DNA_struct_switch_endian(SDNA *oldsdna, int oldSDNAnr, char *data)
|
||||
char *type, *cpo, *cur, cval;
|
||||
const char *name;
|
||||
|
||||
if (oldSDNAnr== -1) return;
|
||||
firststructtypenr= *(oldsdna->structs[0]);
|
||||
if (oldSDNAnr == -1) return;
|
||||
firststructtypenr = *(oldsdna->structs[0]);
|
||||
|
||||
spo= spc= oldsdna->structs[oldSDNAnr];
|
||||
spo = spc = oldsdna->structs[oldSDNAnr];
|
||||
|
||||
elemcount= spo[1];
|
||||
elemcount = spo[1];
|
||||
|
||||
spc+= 2;
|
||||
cur= data;
|
||||
spc += 2;
|
||||
cur = data;
|
||||
|
||||
for (a=0; a<elemcount; a++, spc+=2) {
|
||||
type= oldsdna->types[spc[0]];
|
||||
name= oldsdna->names[spc[1]];
|
||||
for (a = 0; a < elemcount; a++, spc += 2) {
|
||||
type = oldsdna->types[spc[0]];
|
||||
name = oldsdna->names[spc[1]];
|
||||
|
||||
/* elementsize = including arraysize */
|
||||
elen= elementsize(oldsdna, spc[0], spc[1]);
|
||||
elen = elementsize(oldsdna, spc[0], spc[1]);
|
||||
|
||||
/* test: is type a struct? */
|
||||
if (spc[0]>=firststructtypenr && !ispointer(name)) {
|
||||
if (spc[0] >= firststructtypenr && !ispointer(name)) {
|
||||
/* where does the old data start (is there one?) */
|
||||
cpo= find_elem(oldsdna, type, name, spo, data, NULL);
|
||||
cpo = find_elem(oldsdna, type, name, spo, data, NULL);
|
||||
if (cpo) {
|
||||
oldSDNAnr= DNA_struct_find_nr(oldsdna, type);
|
||||
oldSDNAnr = DNA_struct_find_nr(oldsdna, type);
|
||||
|
||||
mul= DNA_elem_array_size(name, strlen(name));
|
||||
elena= elen/mul;
|
||||
mul = DNA_elem_array_size(name, strlen(name));
|
||||
elena = elen / mul;
|
||||
|
||||
while (mul--) {
|
||||
DNA_struct_switch_endian(oldsdna, oldSDNAnr, cpo);
|
||||
@@ -1038,113 +1038,113 @@ void DNA_struct_switch_endian(SDNA *oldsdna, int oldSDNAnr, char *data)
|
||||
else {
|
||||
|
||||
if (ispointer(name)) {
|
||||
if (oldsdna->pointerlen==8) {
|
||||
if (oldsdna->pointerlen == 8) {
|
||||
|
||||
mul= DNA_elem_array_size(name, strlen(name));
|
||||
cpo= cur;
|
||||
mul = DNA_elem_array_size(name, strlen(name));
|
||||
cpo = cur;
|
||||
while (mul--) {
|
||||
cval= cpo[0]; cpo[0]= cpo[7]; cpo[7]= cval;
|
||||
cval= cpo[1]; cpo[1]= cpo[6]; cpo[6]= cval;
|
||||
cval= cpo[2]; cpo[2]= cpo[5]; cpo[5]= cval;
|
||||
cval= cpo[3]; cpo[3]= cpo[4]; cpo[4]= cval;
|
||||
cval = cpo[0]; cpo[0] = cpo[7]; cpo[7] = cval;
|
||||
cval = cpo[1]; cpo[1] = cpo[6]; cpo[6] = cval;
|
||||
cval = cpo[2]; cpo[2] = cpo[5]; cpo[5] = cval;
|
||||
cval = cpo[3]; cpo[3] = cpo[4]; cpo[4] = cval;
|
||||
|
||||
cpo+= 8;
|
||||
cpo += 8;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
if ( spc[0]==SDNA_TYPE_SHORT ||
|
||||
spc[0]==SDNA_TYPE_USHORT )
|
||||
if (spc[0] == SDNA_TYPE_SHORT ||
|
||||
spc[0] == SDNA_TYPE_USHORT)
|
||||
{
|
||||
|
||||
/* exception: variable called blocktype/ipowin: derived from ID_ */
|
||||
skip= 0;
|
||||
if (name[0]=='b' && name[1]=='l') {
|
||||
if (strcmp(name, "blocktype")==0) skip= 1;
|
||||
skip = 0;
|
||||
if (name[0] == 'b' && name[1] == 'l') {
|
||||
if (strcmp(name, "blocktype") == 0) skip = 1;
|
||||
}
|
||||
else if (name[0]=='i' && name[1]=='p') {
|
||||
if (strcmp(name, "ipowin")==0) skip= 1;
|
||||
else if (name[0] == 'i' && name[1] == 'p') {
|
||||
if (strcmp(name, "ipowin") == 0) skip = 1;
|
||||
}
|
||||
|
||||
if (skip==0) {
|
||||
mul= DNA_elem_array_size(name, strlen(name));
|
||||
cpo= cur;
|
||||
if (skip == 0) {
|
||||
mul = DNA_elem_array_size(name, strlen(name));
|
||||
cpo = cur;
|
||||
while (mul--) {
|
||||
cval= cpo[0];
|
||||
cpo[0]= cpo[1];
|
||||
cpo[1]= cval;
|
||||
cpo+= 2;
|
||||
cval = cpo[0];
|
||||
cpo[0] = cpo[1];
|
||||
cpo[1] = cval;
|
||||
cpo += 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ( (spc[0]==SDNA_TYPE_INT ||
|
||||
spc[0]==SDNA_TYPE_LONG ||
|
||||
spc[0]==SDNA_TYPE_ULONG ||
|
||||
spc[0]==SDNA_TYPE_FLOAT))
|
||||
else if ( (spc[0] == SDNA_TYPE_INT ||
|
||||
spc[0] == SDNA_TYPE_LONG ||
|
||||
spc[0] == SDNA_TYPE_ULONG ||
|
||||
spc[0] == SDNA_TYPE_FLOAT))
|
||||
{
|
||||
|
||||
mul= DNA_elem_array_size(name, strlen(name));
|
||||
cpo= cur;
|
||||
mul = DNA_elem_array_size(name, strlen(name));
|
||||
cpo = cur;
|
||||
while (mul--) {
|
||||
cval= cpo[0];
|
||||
cpo[0]= cpo[3];
|
||||
cpo[3]= cval;
|
||||
cval= cpo[1];
|
||||
cpo[1]= cpo[2];
|
||||
cpo[2]= cval;
|
||||
cpo+= 4;
|
||||
cval = cpo[0];
|
||||
cpo[0] = cpo[3];
|
||||
cpo[3] = cval;
|
||||
cval = cpo[1];
|
||||
cpo[1] = cpo[2];
|
||||
cpo[2] = cval;
|
||||
cpo += 4;
|
||||
}
|
||||
}
|
||||
else if ( (spc[0]==SDNA_TYPE_INT64) ||
|
||||
(spc[0]==SDNA_TYPE_UINT64))
|
||||
else if ( (spc[0] == SDNA_TYPE_INT64) ||
|
||||
(spc[0] == SDNA_TYPE_UINT64))
|
||||
{
|
||||
mul= DNA_elem_array_size(name, strlen(name));
|
||||
cpo= cur;
|
||||
mul = DNA_elem_array_size(name, strlen(name));
|
||||
cpo = cur;
|
||||
while (mul--) {
|
||||
cval= cpo[0]; cpo[0]= cpo[7]; cpo[7]= cval;
|
||||
cval= cpo[1]; cpo[1]= cpo[6]; cpo[6]= cval;
|
||||
cval= cpo[2]; cpo[2]= cpo[5]; cpo[5]= cval;
|
||||
cval= cpo[3]; cpo[3]= cpo[4]; cpo[4]= cval;
|
||||
cval = cpo[0]; cpo[0] = cpo[7]; cpo[7] = cval;
|
||||
cval = cpo[1]; cpo[1] = cpo[6]; cpo[6] = cval;
|
||||
cval = cpo[2]; cpo[2] = cpo[5]; cpo[5] = cval;
|
||||
cval = cpo[3]; cpo[3] = cpo[4]; cpo[4] = cval;
|
||||
|
||||
cpo+= 8;
|
||||
cpo += 8;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
cur+= elen;
|
||||
cur += elen;
|
||||
}
|
||||
}
|
||||
|
||||
void *DNA_struct_reconstruct(SDNA *newsdna, SDNA *oldsdna, char *compflags, int oldSDNAnr, int blocks, void *data)
|
||||
{
|
||||
int a, curSDNAnr, curlen=0, oldlen;
|
||||
int a, curSDNAnr, curlen = 0, oldlen;
|
||||
short *spo, *spc;
|
||||
char *cur, *type, *cpc, *cpo;
|
||||
|
||||
/* oldSDNAnr == structnr, we're looking for the corresponding 'cur' number */
|
||||
spo= oldsdna->structs[oldSDNAnr];
|
||||
type= oldsdna->types[ spo[0] ];
|
||||
oldlen= oldsdna->typelens[ spo[0] ];
|
||||
curSDNAnr= DNA_struct_find_nr(newsdna, type);
|
||||
spo = oldsdna->structs[oldSDNAnr];
|
||||
type = oldsdna->types[spo[0]];
|
||||
oldlen = oldsdna->typelens[spo[0]];
|
||||
curSDNAnr = DNA_struct_find_nr(newsdna, type);
|
||||
|
||||
/* init data and alloc */
|
||||
if (curSDNAnr >= 0) {
|
||||
spc= newsdna->structs[curSDNAnr];
|
||||
curlen= newsdna->typelens[ spc[0] ];
|
||||
spc = newsdna->structs[curSDNAnr];
|
||||
curlen = newsdna->typelens[spc[0]];
|
||||
}
|
||||
if (curlen==0) {
|
||||
if (curlen == 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cur= MEM_callocN(blocks*curlen, "reconstruct");
|
||||
cpc= cur;
|
||||
cpo= data;
|
||||
for (a=0; a<blocks; a++) {
|
||||
cur = MEM_callocN(blocks * curlen, "reconstruct");
|
||||
cpc = cur;
|
||||
cpo = data;
|
||||
for (a = 0; a < blocks; a++) {
|
||||
reconstruct_struct(newsdna, oldsdna, compflags, oldSDNAnr, cpo, curSDNAnr, cpc);
|
||||
cpc+= curlen;
|
||||
cpo+= oldlen;
|
||||
cpc += curlen;
|
||||
cpo += oldlen;
|
||||
}
|
||||
|
||||
return cur;
|
||||
@@ -1153,9 +1153,9 @@ void *DNA_struct_reconstruct(SDNA *newsdna, SDNA *oldsdna, char *compflags, int
|
||||
int DNA_elem_offset(SDNA *sdna, const char *stype, const char *vartype, const char *name)
|
||||
{
|
||||
|
||||
int SDNAnr= DNA_struct_find_nr(sdna, stype);
|
||||
short *spo= sdna->structs[SDNAnr];
|
||||
char *cp= find_elem(sdna, vartype, name, spo, NULL, NULL);
|
||||
int SDNAnr = DNA_struct_find_nr(sdna, stype);
|
||||
short *spo = sdna->structs[SDNAnr];
|
||||
char *cp = find_elem(sdna, vartype, name, spo, NULL, NULL);
|
||||
return (int)((intptr_t)cp);
|
||||
}
|
||||
|
||||
|
||||
@@ -137,18 +137,18 @@ static const char *includefiles[] = {
|
||||
""
|
||||
};
|
||||
|
||||
static int maxdata= 500000, maxnr= 50000;
|
||||
static int nr_names=0;
|
||||
static int nr_types=0;
|
||||
static int nr_structs=0;
|
||||
static char **names, *namedata; /* at address names[a] is string a */
|
||||
static char **types, *typedata; /* at address types[a] is string a */
|
||||
static short *typelens; /* at typelens[a] is de length of type a */
|
||||
static short *alphalens; /* contains sizes as they are calculated on the DEC Alpha (64 bits), infact any 64bit system */
|
||||
static short **structs, *structdata;/* at sp= structs[a] is the first address of a struct definition
|
||||
* sp[0] is type number
|
||||
* sp[1] is amount of elements
|
||||
* sp[2] sp[3] is typenr, namenr (etc) */
|
||||
static int maxdata = 500000, maxnr = 50000;
|
||||
static int nr_names = 0;
|
||||
static int nr_types = 0;
|
||||
static int nr_structs = 0;
|
||||
static char **names, *namedata; /* at address names[a] is string a */
|
||||
static char **types, *typedata; /* at address types[a] is string a */
|
||||
static short *typelens; /* at typelens[a] is de length of type a */
|
||||
static short *alphalens; /* contains sizes as they are calculated on the DEC Alpha (64 bits), infact any 64bit system */
|
||||
static short **structs, *structdata; /* at sp= structs[a] is the first address of a struct definition
|
||||
* sp[0] is type number
|
||||
* sp[1] is amount of elements
|
||||
* sp[2] sp[3] is typenr, namenr (etc) */
|
||||
/**
|
||||
* Variable to control debug output of makesdna.
|
||||
* debugSDNA:
|
||||
@@ -228,7 +228,7 @@ static int add_type(const char *str, int len)
|
||||
char *cp;
|
||||
|
||||
/* first do validity check */
|
||||
if (str[0]==0) {
|
||||
if (str[0] == 0) {
|
||||
return -1;
|
||||
}
|
||||
else if (strchr(str, '*')) {
|
||||
@@ -238,10 +238,10 @@ static int add_type(const char *str, int len)
|
||||
}
|
||||
|
||||
/* search through type array */
|
||||
for (nr=0; nr<nr_types; nr++) {
|
||||
if (strcmp(str, types[nr])==0) {
|
||||
for (nr = 0; nr < nr_types; nr++) {
|
||||
if (strcmp(str, types[nr]) == 0) {
|
||||
if (len) {
|
||||
typelens[nr]= len;
|
||||
typelens[nr] = len;
|
||||
alphalens[nr] = len;
|
||||
}
|
||||
return nr;
|
||||
@@ -249,22 +249,22 @@ static int add_type(const char *str, int len)
|
||||
}
|
||||
|
||||
/* append new type */
|
||||
if (nr_types==0) cp= typedata;
|
||||
if (nr_types == 0) cp = typedata;
|
||||
else {
|
||||
cp= types[nr_types-1]+strlen(types[nr_types-1])+1;
|
||||
cp = types[nr_types - 1] + strlen(types[nr_types - 1]) + 1;
|
||||
}
|
||||
strcpy(cp, str);
|
||||
types[nr_types]= cp;
|
||||
typelens[nr_types]= len;
|
||||
alphalens[nr_types]= len;
|
||||
types[nr_types] = cp;
|
||||
typelens[nr_types] = len;
|
||||
alphalens[nr_types] = len;
|
||||
|
||||
if (nr_types>=maxnr) {
|
||||
if (nr_types >= maxnr) {
|
||||
printf("too many types\n");
|
||||
return nr_types-1;
|
||||
return nr_types - 1;
|
||||
}
|
||||
nr_types++;
|
||||
|
||||
return nr_types-1;
|
||||
return nr_types - 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -285,14 +285,14 @@ static int add_name(const char *str)
|
||||
|
||||
additional_slen_offset = 0;
|
||||
|
||||
if (str[0]==0 /* || (str[1]==0) */) return -1;
|
||||
if (str[0] == 0 /* || (str[1]==0) */) return -1;
|
||||
|
||||
if (str[0] == '(' && str[1] == '*') {
|
||||
/* we handle function pointer and special array cases here, e.g.
|
||||
* void (*function)(...) and float (*array)[..]. the array case
|
||||
* name is still converted to (array*)() though because it is that
|
||||
* way in old dna too, and works correct with elementsize() */
|
||||
int isfuncptr = (strchr(str+1, '(')) != NULL;
|
||||
int isfuncptr = (strchr(str + 1, '(')) != NULL;
|
||||
|
||||
if (debugSDNA > 3) printf("\t\t\t\t*** Function pointer or multidim array pointer found\n");
|
||||
/* functionpointer: transform the type (sometimes) */
|
||||
@@ -311,13 +311,13 @@ static int add_name(const char *str)
|
||||
if (debugSDNA > 3) printf("first brace after offset %d\n", i);
|
||||
|
||||
j++; /* j beyond closing brace ? */
|
||||
while ((str[j] != 0) && (str[j] != ')' )) {
|
||||
while ((str[j] != 0) && (str[j] != ')')) {
|
||||
if (debugSDNA > 3) printf("seen %c ( %d)\n", str[j], str[j]);
|
||||
j++;
|
||||
}
|
||||
if (debugSDNA > 3) printf("seen %c ( %d)\n"
|
||||
"special after offset%d\n",
|
||||
str[j], str[j], j);
|
||||
"special after offset%d\n",
|
||||
str[j], str[j], j);
|
||||
|
||||
if (!isfuncptr) {
|
||||
/* multidimensional array pointer case */
|
||||
@@ -327,7 +327,7 @@ static int add_name(const char *str)
|
||||
else
|
||||
printf("Error during tokening multidim array pointer\n");
|
||||
}
|
||||
else if (str[j] == 0 ) {
|
||||
else if (str[j] == 0) {
|
||||
if (debugSDNA > 3) printf("offsetting for space\n");
|
||||
/* get additional offset */
|
||||
k = 0;
|
||||
@@ -338,7 +338,7 @@ static int add_name(const char *str)
|
||||
if (debugSDNA > 3) printf("extra offset %d\n", k);
|
||||
additional_slen_offset = k;
|
||||
}
|
||||
else if (str[j] == ')' ) {
|
||||
else if (str[j] == ')') {
|
||||
if (debugSDNA > 3) printf("offsetting for brace\n");
|
||||
; /* don't get extra offset */
|
||||
}
|
||||
@@ -364,22 +364,22 @@ static int add_name(const char *str)
|
||||
(strncmp(buf, "(*windraw", 9) == 0) )
|
||||
{
|
||||
buf[i] = ')';
|
||||
buf[i+1] = '(';
|
||||
buf[i+2] = 'v';
|
||||
buf[i+3] = 'o';
|
||||
buf[i+4] = 'i';
|
||||
buf[i+5] = 'd';
|
||||
buf[i+6] = ')';
|
||||
buf[i+7] = 0;
|
||||
buf[i + 1] = '(';
|
||||
buf[i + 2] = 'v';
|
||||
buf[i + 3] = 'o';
|
||||
buf[i + 4] = 'i';
|
||||
buf[i + 5] = 'd';
|
||||
buf[i + 6] = ')';
|
||||
buf[i + 7] = 0;
|
||||
}
|
||||
else {
|
||||
buf[i] = ')';
|
||||
buf[i+1] = '(';
|
||||
buf[i+2] = ')';
|
||||
buf[i+3] = 0;
|
||||
buf[i + 1] = '(';
|
||||
buf[i + 2] = ')';
|
||||
buf[i + 3] = 0;
|
||||
}
|
||||
/* now precede with buf*/
|
||||
if (debugSDNA > 3) printf("\t\t\t\t\tProposing fp name %s\n", buf);
|
||||
if (debugSDNA > 3) printf("\t\t\t\t\tProposing fp name %s\n", buf);
|
||||
name = buf;
|
||||
}
|
||||
else {
|
||||
@@ -388,27 +388,27 @@ static int add_name(const char *str)
|
||||
}
|
||||
|
||||
/* search name array */
|
||||
for (nr=0; nr<nr_names; nr++) {
|
||||
if (strcmp(name, names[nr])==0) {
|
||||
for (nr = 0; nr < nr_names; nr++) {
|
||||
if (strcmp(name, names[nr]) == 0) {
|
||||
return nr;
|
||||
}
|
||||
}
|
||||
|
||||
/* append new type */
|
||||
if (nr_names==0) cp= namedata;
|
||||
if (nr_names == 0) cp = namedata;
|
||||
else {
|
||||
cp= names[nr_names-1]+strlen(names[nr_names-1])+1;
|
||||
cp = names[nr_names - 1] + strlen(names[nr_names - 1]) + 1;
|
||||
}
|
||||
strcpy(cp, name);
|
||||
names[nr_names]= cp;
|
||||
names[nr_names] = cp;
|
||||
|
||||
if (nr_names>=maxnr) {
|
||||
if (nr_names >= maxnr) {
|
||||
printf("too many names\n");
|
||||
return nr_names-1;
|
||||
return nr_names - 1;
|
||||
}
|
||||
nr_names++;
|
||||
|
||||
return nr_names-1;
|
||||
return nr_names - 1;
|
||||
}
|
||||
|
||||
static short *add_struct(int namecode)
|
||||
@@ -416,19 +416,19 @@ static short *add_struct(int namecode)
|
||||
int len;
|
||||
short *sp;
|
||||
|
||||
if (nr_structs==0) {
|
||||
structs[0]= structdata;
|
||||
if (nr_structs == 0) {
|
||||
structs[0] = structdata;
|
||||
}
|
||||
else {
|
||||
sp= structs[nr_structs-1];
|
||||
len= sp[1];
|
||||
structs[nr_structs]= sp+ 2*len+2;
|
||||
sp = structs[nr_structs - 1];
|
||||
len = sp[1];
|
||||
structs[nr_structs] = sp + 2 * len + 2;
|
||||
}
|
||||
|
||||
sp= structs[nr_structs];
|
||||
sp[0]= namecode;
|
||||
sp = structs[nr_structs];
|
||||
sp[0] = namecode;
|
||||
|
||||
if (nr_structs>=maxnr) {
|
||||
if (nr_structs >= maxnr) {
|
||||
printf("too many structs\n");
|
||||
return sp;
|
||||
}
|
||||
@@ -444,58 +444,58 @@ static int preprocess_include(char *maindata, int len)
|
||||
|
||||
/* note: len + 1, last character is a dummy to prevent
|
||||
* comparisons using uninitialized memory */
|
||||
temp= MEM_mallocN(len + 1, "preprocess_include");
|
||||
temp[len]= ' ';
|
||||
temp = MEM_mallocN(len + 1, "preprocess_include");
|
||||
temp[len] = ' ';
|
||||
|
||||
memcpy(temp, maindata, len);
|
||||
|
||||
// remove all c++ comments
|
||||
/* replace all enters/tabs/etc with spaces */
|
||||
cp= temp;
|
||||
a= len;
|
||||
cp = temp;
|
||||
a = len;
|
||||
comment = 0;
|
||||
while (a--) {
|
||||
if (cp[0]=='/' && cp[1]=='/') {
|
||||
if (cp[0] == '/' && cp[1] == '/') {
|
||||
comment = 1;
|
||||
}
|
||||
else if (*cp<32) {
|
||||
else if (*cp < 32) {
|
||||
comment = 0;
|
||||
}
|
||||
if (comment || *cp<32 || *cp>128 ) *cp= 32;
|
||||
if (comment || *cp < 32 || *cp > 128) *cp = 32;
|
||||
cp++;
|
||||
}
|
||||
|
||||
|
||||
/* data from temp copy to maindata, remove comments and double spaces */
|
||||
cp= temp;
|
||||
md= maindata;
|
||||
newlen= 0;
|
||||
comment= 0;
|
||||
a= len;
|
||||
cp = temp;
|
||||
md = maindata;
|
||||
newlen = 0;
|
||||
comment = 0;
|
||||
a = len;
|
||||
while (a--) {
|
||||
|
||||
if (cp[0]=='/' && cp[1]=='*') {
|
||||
comment= 1;
|
||||
cp[0]=cp[1]= 32;
|
||||
if (cp[0] == '/' && cp[1] == '*') {
|
||||
comment = 1;
|
||||
cp[0] = cp[1] = 32;
|
||||
}
|
||||
if (cp[0]=='*' && cp[1]=='/') {
|
||||
comment= 0;
|
||||
cp[0]=cp[1]= 32;
|
||||
if (cp[0] == '*' && cp[1] == '/') {
|
||||
comment = 0;
|
||||
cp[0] = cp[1] = 32;
|
||||
}
|
||||
|
||||
/* do not copy when: */
|
||||
if (comment);
|
||||
else if ( cp[0]==' ' && cp[1]==' ' );
|
||||
else if ( cp[-1]=='*' && cp[0]==' ' ); /* pointers with a space */
|
||||
if (comment) ;
|
||||
else if (cp[0] == ' ' && cp[1] == ' ') ;
|
||||
else if (cp[-1] == '*' && cp[0] == ' ') ; /* pointers with a space */
|
||||
|
||||
/* skip special keywords */
|
||||
else if (strncmp("DNA_DEPRECATED", cp, 14)==0) {
|
||||
else if (strncmp("DNA_DEPRECATED", cp, 14) == 0) {
|
||||
/* single values are skipped already, so decrement 1 less */
|
||||
a -= 13;
|
||||
cp += 13;
|
||||
}
|
||||
else {
|
||||
md[0]= cp[0];
|
||||
md[0] = cp[0];
|
||||
md++;
|
||||
newlen++;
|
||||
}
|
||||
@@ -509,30 +509,30 @@ static int preprocess_include(char *maindata, int len)
|
||||
static void *read_file_data(char *filename, int *len_r)
|
||||
{
|
||||
#ifdef WIN32
|
||||
FILE *fp= fopen(filename, "rb");
|
||||
FILE *fp = fopen(filename, "rb");
|
||||
#else
|
||||
FILE *fp= fopen(filename, "r");
|
||||
FILE *fp = fopen(filename, "r");
|
||||
#endif
|
||||
void *data;
|
||||
|
||||
if (!fp) {
|
||||
*len_r= -1;
|
||||
*len_r = -1;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
fseek(fp, 0L, SEEK_END);
|
||||
*len_r= ftell(fp);
|
||||
*len_r = ftell(fp);
|
||||
fseek(fp, 0L, SEEK_SET);
|
||||
|
||||
data= MEM_mallocN(*len_r, "read_file_data");
|
||||
data = MEM_mallocN(*len_r, "read_file_data");
|
||||
if (!data) {
|
||||
*len_r= -1;
|
||||
*len_r = -1;
|
||||
fclose(fp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (fread(data, *len_r, 1, fp)!=1) {
|
||||
*len_r= -1;
|
||||
if (fread(data, *len_r, 1, fp) != 1) {
|
||||
*len_r = -1;
|
||||
MEM_freeN(data);
|
||||
fclose(fp);
|
||||
return NULL;
|
||||
@@ -551,38 +551,38 @@ static int convert_include(char *filename)
|
||||
short *structpoin, *sp;
|
||||
char *maindata, *mainend, *md, *md1;
|
||||
|
||||
md= maindata= read_file_data(filename, &filelen);
|
||||
if (filelen==-1) {
|
||||
md = maindata = read_file_data(filename, &filelen);
|
||||
if (filelen == -1) {
|
||||
printf("Can't read file %s\n", filename);
|
||||
return 1;
|
||||
}
|
||||
|
||||
filelen= preprocess_include(maindata, filelen);
|
||||
mainend= maindata+filelen-1;
|
||||
filelen = preprocess_include(maindata, filelen);
|
||||
mainend = maindata + filelen - 1;
|
||||
|
||||
/* we look for '{' and then back to 'struct' */
|
||||
count= 0;
|
||||
overslaan= 0;
|
||||
while (count<filelen) {
|
||||
count = 0;
|
||||
overslaan = 0;
|
||||
while (count < filelen) {
|
||||
|
||||
/* code for skipping a struct: two hashes on 2 lines. (preprocess added a space) */
|
||||
if (md[0]=='#' && md[1]==' ' && md[2]=='#') {
|
||||
overslaan= 1;
|
||||
if (md[0] == '#' && md[1] == ' ' && md[2] == '#') {
|
||||
overslaan = 1;
|
||||
}
|
||||
|
||||
if (md[0]=='{') {
|
||||
md[0]= 0;
|
||||
if (md[0] == '{') {
|
||||
md[0] = 0;
|
||||
if (overslaan) {
|
||||
overslaan= 0;
|
||||
overslaan = 0;
|
||||
}
|
||||
else {
|
||||
if (md[-1]==' ') md[-1]= 0;
|
||||
md1= md-2;
|
||||
while ( *md1!=32) md1--; /* to beginning of word */
|
||||
if (md[-1] == ' ') md[-1] = 0;
|
||||
md1 = md - 2;
|
||||
while (*md1 != 32) md1--; /* to beginning of word */
|
||||
md1++;
|
||||
|
||||
/* we've got a struct name when... */
|
||||
if ( strncmp(md1-7, "struct", 6)==0 ) {
|
||||
if (strncmp(md1 - 7, "struct", 6) == 0) {
|
||||
|
||||
strct = add_type(md1, 0);
|
||||
if (strct == -1) {
|
||||
@@ -590,33 +590,33 @@ static int convert_include(char *filename)
|
||||
return 1;
|
||||
}
|
||||
|
||||
structpoin= add_struct(strct);
|
||||
sp= structpoin+2;
|
||||
structpoin = add_struct(strct);
|
||||
sp = structpoin + 2;
|
||||
|
||||
if (debugSDNA > 1) printf("\t|\t|-- detected struct %s\n", types[strct]);
|
||||
|
||||
/* first lets make it all nice strings */
|
||||
md1= md+1;
|
||||
md1 = md + 1;
|
||||
while (*md1 != '}') {
|
||||
if (md1>mainend) break;
|
||||
if (md1 > mainend) break;
|
||||
|
||||
if (*md1==',' || *md1==' ') *md1= 0;
|
||||
if (*md1 == ',' || *md1 == ' ') *md1 = 0;
|
||||
md1++;
|
||||
}
|
||||
|
||||
/* read types and names until first character that is not '}' */
|
||||
md1= md+1;
|
||||
while ( *md1 != '}' ) {
|
||||
if (md1>mainend) break;
|
||||
md1 = md + 1;
|
||||
while (*md1 != '}') {
|
||||
if (md1 > mainend) break;
|
||||
|
||||
/* skip when it says 'struct' or 'unsigned' or 'const' */
|
||||
if (*md1) {
|
||||
if ( strncmp(md1, "struct", 6)==0 ) md1+= 7;
|
||||
if ( strncmp(md1, "unsigned", 8)==0 ) md1+= 9;
|
||||
if ( strncmp(md1, "const", 5)==0 ) md1+= 6;
|
||||
if (strncmp(md1, "struct", 6) == 0) md1 += 7;
|
||||
if (strncmp(md1, "unsigned", 8) == 0) md1 += 9;
|
||||
if (strncmp(md1, "const", 5) == 0) md1 += 6;
|
||||
|
||||
/* we've got a type! */
|
||||
type= add_type(md1, 0);
|
||||
type = add_type(md1, 0);
|
||||
if (type == -1) {
|
||||
printf("File '%s' contains struct we can't parse \"%s\"\n", filename, md1);
|
||||
return 1;
|
||||
@@ -624,48 +624,48 @@ static int convert_include(char *filename)
|
||||
|
||||
if (debugSDNA > 1) printf("\t|\t|\tfound type %s (", md1);
|
||||
|
||||
md1+= strlen(md1);
|
||||
md1 += strlen(md1);
|
||||
|
||||
|
||||
/* read until ';' */
|
||||
while ( *md1 != ';' ) {
|
||||
if (md1>mainend) break;
|
||||
while (*md1 != ';') {
|
||||
if (md1 > mainend) break;
|
||||
|
||||
if (*md1) {
|
||||
/* We've got a name. slen needs
|
||||
* correction for function
|
||||
* pointers! */
|
||||
slen= (int) strlen(md1);
|
||||
if ( md1[slen-1]==';' ) {
|
||||
md1[slen-1]= 0;
|
||||
slen = (int) strlen(md1);
|
||||
if (md1[slen - 1] == ';') {
|
||||
md1[slen - 1] = 0;
|
||||
|
||||
|
||||
name= add_name(md1);
|
||||
name = add_name(md1);
|
||||
slen += additional_slen_offset;
|
||||
sp[0]= type;
|
||||
sp[1]= name;
|
||||
sp[0] = type;
|
||||
sp[1] = name;
|
||||
|
||||
if ((debugSDNA>1) && (names[name] != NULL)) printf("%s |", names[name]);
|
||||
if ((debugSDNA > 1) && (names[name] != NULL)) printf("%s |", names[name]);
|
||||
|
||||
structpoin[1]++;
|
||||
sp+= 2;
|
||||
sp += 2;
|
||||
|
||||
md1+= slen;
|
||||
md1 += slen;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
name= add_name(md1);
|
||||
name = add_name(md1);
|
||||
slen += additional_slen_offset;
|
||||
|
||||
sp[0]= type;
|
||||
sp[1]= name;
|
||||
sp[0] = type;
|
||||
sp[1] = name;
|
||||
if ((debugSDNA > 1) && (names[name] != NULL)) printf("%s ||", names[name]);
|
||||
|
||||
structpoin[1]++;
|
||||
sp+= 2;
|
||||
sp += 2;
|
||||
|
||||
md1+= slen;
|
||||
md1 += slen;
|
||||
}
|
||||
md1++;
|
||||
}
|
||||
@@ -689,20 +689,20 @@ static int convert_include(char *filename)
|
||||
|
||||
static int arraysize(char *astr, int len)
|
||||
{
|
||||
int a, mul=1;
|
||||
char str[100], *cp=NULL;
|
||||
int a, mul = 1;
|
||||
char str[100], *cp = NULL;
|
||||
|
||||
memcpy(str, astr, len+1);
|
||||
memcpy(str, astr, len + 1);
|
||||
|
||||
for (a=0; a<len; a++) {
|
||||
if ( str[a]== '[' ) {
|
||||
cp= &(str[a+1]);
|
||||
for (a = 0; a < len; a++) {
|
||||
if (str[a] == '[') {
|
||||
cp = &(str[a + 1]);
|
||||
}
|
||||
else if ( str[a]==']' && cp) {
|
||||
str[a]= 0;
|
||||
else if (str[a] == ']' && cp) {
|
||||
str[a] = 0;
|
||||
/* if 'cp' is a preprocessor definition, it will evaluate to 0,
|
||||
* the caller needs to check for this case and throw an error */
|
||||
mul*= atoi(cp);
|
||||
* the caller needs to check for this case and throw an error */
|
||||
mul *= atoi(cp);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -711,40 +711,40 @@ static int arraysize(char *astr, int len)
|
||||
|
||||
static int calculate_structlens(int firststruct)
|
||||
{
|
||||
int a, b, len, alphalen, unknown= nr_structs, lastunknown, structtype, type, mul, namelen;
|
||||
int a, b, len, alphalen, unknown = nr_structs, lastunknown, structtype, type, mul, namelen;
|
||||
short *sp, *structpoin;
|
||||
char *cp;
|
||||
int has_pointer, dna_error = 0;
|
||||
|
||||
while (unknown) {
|
||||
lastunknown= unknown;
|
||||
unknown= 0;
|
||||
lastunknown = unknown;
|
||||
unknown = 0;
|
||||
|
||||
/* check all structs... */
|
||||
for (a=0; a<nr_structs; a++) {
|
||||
structpoin= structs[a];
|
||||
structtype= structpoin[0];
|
||||
for (a = 0; a < nr_structs; a++) {
|
||||
structpoin = structs[a];
|
||||
structtype = structpoin[0];
|
||||
|
||||
/* when length is not known... */
|
||||
if (typelens[structtype]==0) {
|
||||
if (typelens[structtype] == 0) {
|
||||
|
||||
sp= structpoin+2;
|
||||
len= 0;
|
||||
sp = structpoin + 2;
|
||||
len = 0;
|
||||
alphalen = 0;
|
||||
has_pointer = 0;
|
||||
|
||||
/* check all elements in struct */
|
||||
for (b=0; b<structpoin[1]; b++, sp+=2) {
|
||||
type= sp[0];
|
||||
cp= names[sp[1]];
|
||||
for (b = 0; b < structpoin[1]; b++, sp += 2) {
|
||||
type = sp[0];
|
||||
cp = names[sp[1]];
|
||||
|
||||
namelen= (int) strlen(cp);
|
||||
namelen = (int) strlen(cp);
|
||||
/* is it a pointer or function pointer? */
|
||||
if (cp[0]=='*' || cp[1]=='*') {
|
||||
if (cp[0] == '*' || cp[1] == '*') {
|
||||
has_pointer = 1;
|
||||
/* has the name an extra length? (array) */
|
||||
mul= 1;
|
||||
if ( cp[namelen-1]==']') mul= arraysize(cp, namelen);
|
||||
mul = 1;
|
||||
if (cp[namelen - 1] == ']') mul = arraysize(cp, namelen);
|
||||
|
||||
if (mul == 0) {
|
||||
printf("Zero array size found or could not parse %s: '%.*s'\n", types[structtype], namelen + 1, cp);
|
||||
@@ -774,15 +774,15 @@ static int calculate_structlens(int firststruct)
|
||||
alphalen += 8 * mul;
|
||||
|
||||
}
|
||||
else if (cp[0]=='[') {
|
||||
else if (cp[0] == '[') {
|
||||
/* parsing can cause names "var" and "[3]" to be found for "float var [3]" ... */
|
||||
printf("Parse error in struct, invalid member name: %s %s\n", types[structtype], cp);
|
||||
dna_error = 1;
|
||||
}
|
||||
else if ( typelens[type] ) {
|
||||
else if (typelens[type]) {
|
||||
/* has the name an extra length? (array) */
|
||||
mul= 1;
|
||||
if ( cp[namelen-1]==']') mul= arraysize(cp, namelen);
|
||||
mul = 1;
|
||||
if (cp[namelen - 1] == ']') mul = arraysize(cp, namelen);
|
||||
|
||||
if (mul == 0) {
|
||||
printf("Zero array size found or could not parse %s: '%.*s'\n", types[structtype], namelen + 1, cp);
|
||||
@@ -791,50 +791,50 @@ static int calculate_structlens(int firststruct)
|
||||
|
||||
/* struct alignment */
|
||||
if (type >= firststruct) {
|
||||
if (sizeof(void *)==8 && (len % 8) ) {
|
||||
if (sizeof(void *) == 8 && (len % 8) ) {
|
||||
printf("Align struct error: %s %s\n", types[structtype], cp);
|
||||
dna_error = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* 2-4 aligned/ */
|
||||
if (typelens[type]>3 && (len % 4) ) {
|
||||
printf("Align 4 error in struct: %s %s (add %d padding bytes)\n", types[structtype], cp, len%4);
|
||||
if (typelens[type] > 3 && (len % 4) ) {
|
||||
printf("Align 4 error in struct: %s %s (add %d padding bytes)\n", types[structtype], cp, len % 4);
|
||||
dna_error = 1;
|
||||
}
|
||||
else if (typelens[type]==2 && (len % 2) ) {
|
||||
printf("Align 2 error in struct: %s %s (add %d padding bytes)\n", types[structtype], cp, len%2);
|
||||
else if (typelens[type] == 2 && (len % 2) ) {
|
||||
printf("Align 2 error in struct: %s %s (add %d padding bytes)\n", types[structtype], cp, len % 2);
|
||||
dna_error = 1;
|
||||
}
|
||||
|
||||
len += mul*typelens[type];
|
||||
len += mul * typelens[type];
|
||||
alphalen += mul * alphalens[type];
|
||||
|
||||
}
|
||||
else {
|
||||
len= 0;
|
||||
len = 0;
|
||||
alphalen = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (len==0) {
|
||||
if (len == 0) {
|
||||
unknown++;
|
||||
}
|
||||
else {
|
||||
typelens[structtype]= len;
|
||||
alphalens[structtype]= alphalen;
|
||||
typelens[structtype] = len;
|
||||
alphalens[structtype] = alphalen;
|
||||
// two ways to detect if a struct contains a pointer:
|
||||
// has_pointer is set or alphalen != len
|
||||
if (has_pointer || alphalen != len) {
|
||||
if (alphalen % 8) {
|
||||
printf("Sizeerror 8 in struct: %s (add %d bytes)\n", types[structtype], alphalen%8);
|
||||
printf("Sizeerror 8 in struct: %s (add %d bytes)\n", types[structtype], alphalen % 8);
|
||||
dna_error = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (len % 4) {
|
||||
printf("Sizeerror 4 in struct: %s (add %d bytes)\n", types[structtype], len%4);
|
||||
printf("Sizeerror 4 in struct: %s (add %d bytes)\n", types[structtype], len % 4);
|
||||
dna_error = 1;
|
||||
}
|
||||
|
||||
@@ -842,7 +842,7 @@ static int calculate_structlens(int firststruct)
|
||||
}
|
||||
}
|
||||
|
||||
if (unknown==lastunknown) break;
|
||||
if (unknown == lastunknown) break;
|
||||
}
|
||||
|
||||
if (unknown) {
|
||||
@@ -851,12 +851,12 @@ static int calculate_structlens(int firststruct)
|
||||
if (debugSDNA) {
|
||||
printf("*** Known structs :\n");
|
||||
|
||||
for (a=0; a<nr_structs; a++) {
|
||||
structpoin= structs[a];
|
||||
structtype= structpoin[0];
|
||||
for (a = 0; a < nr_structs; a++) {
|
||||
structpoin = structs[a];
|
||||
structtype = structpoin[0];
|
||||
|
||||
/* length unknown */
|
||||
if (typelens[structtype]!=0) {
|
||||
if (typelens[structtype] != 0) {
|
||||
printf(" %s\n", types[structtype]);
|
||||
}
|
||||
}
|
||||
@@ -865,12 +865,12 @@ static int calculate_structlens(int firststruct)
|
||||
|
||||
printf("*** Unknown structs :\n");
|
||||
|
||||
for (a=0; a<nr_structs; a++) {
|
||||
structpoin= structs[a];
|
||||
structtype= structpoin[0];
|
||||
for (a = 0; a < nr_structs; a++) {
|
||||
structpoin = structs[a];
|
||||
structtype = structpoin[0];
|
||||
|
||||
/* length unknown yet */
|
||||
if (typelens[structtype]==0) {
|
||||
if (typelens[structtype] == 0) {
|
||||
printf(" %s\n", types[structtype]);
|
||||
}
|
||||
}
|
||||
@@ -891,7 +891,7 @@ void dna_write(FILE *file, void *pntr, int size)
|
||||
|
||||
data = (char *) pntr;
|
||||
|
||||
for (i = 0 ; i < size ; i++) {
|
||||
for (i = 0; i < size; i++) {
|
||||
fprintf(file, "%d, ", data[i]);
|
||||
linelength++;
|
||||
if (linelength >= MAX_DNA_LINE_LENGTH) {
|
||||
@@ -903,19 +903,19 @@ void dna_write(FILE *file, void *pntr, int size)
|
||||
|
||||
void printStructLenghts(void)
|
||||
{
|
||||
int a, unknown= nr_structs, structtype;
|
||||
int a, unknown = nr_structs, structtype;
|
||||
/*int lastunknown;*/ /*UNUSED*/
|
||||
short *structpoin;
|
||||
printf("\n\n*** All detected structs:\n");
|
||||
|
||||
while (unknown) {
|
||||
/*lastunknown= unknown;*/ /*UNUSED*/
|
||||
unknown= 0;
|
||||
unknown = 0;
|
||||
|
||||
/* check all structs... */
|
||||
for (a=0; a<nr_structs; a++) {
|
||||
structpoin= structs[a];
|
||||
structtype= structpoin[0];
|
||||
for (a = 0; a < nr_structs; a++) {
|
||||
structpoin = structs[a];
|
||||
structtype = structpoin[0];
|
||||
printf("\t%s\t:%d\n", types[structtype], typelens[structtype]);
|
||||
}
|
||||
}
|
||||
@@ -940,32 +940,32 @@ static int make_structDNA(char *baseDirectory, FILE *file)
|
||||
}
|
||||
|
||||
/* the longest known struct is 50k, so we assume 100k is sufficent! */
|
||||
namedata= MEM_callocN(maxdata, "namedata");
|
||||
typedata= MEM_callocN(maxdata, "typedata");
|
||||
structdata= MEM_callocN(maxdata, "structdata");
|
||||
namedata = MEM_callocN(maxdata, "namedata");
|
||||
typedata = MEM_callocN(maxdata, "typedata");
|
||||
structdata = MEM_callocN(maxdata, "structdata");
|
||||
|
||||
/* a maximum of 5000 variables, must be sufficient? */
|
||||
names= MEM_callocN(sizeof(char *)*maxnr, "names");
|
||||
types= MEM_callocN(sizeof(char *)*maxnr, "types");
|
||||
typelens= MEM_callocN(sizeof(short)*maxnr, "typelens");
|
||||
alphalens= MEM_callocN(sizeof(short)*maxnr, "alphalens");
|
||||
structs= MEM_callocN(sizeof(short)*maxnr, "structs");
|
||||
names = MEM_callocN(sizeof(char *) * maxnr, "names");
|
||||
types = MEM_callocN(sizeof(char *) * maxnr, "types");
|
||||
typelens = MEM_callocN(sizeof(short) * maxnr, "typelens");
|
||||
alphalens = MEM_callocN(sizeof(short) * maxnr, "alphalens");
|
||||
structs = MEM_callocN(sizeof(short) * maxnr, "structs");
|
||||
|
||||
/* insertion of all known types */
|
||||
/* watch it: uint is not allowed! use in structs an unsigned int */
|
||||
/* watch it: sizes must match DNA_elem_type_size() */
|
||||
add_type("char", 1); /* SDNA_TYPE_CHAR */
|
||||
add_type("uchar", 1); /* SDNA_TYPE_UCHAR */
|
||||
add_type("short", 2); /* SDNA_TYPE_SHORT */
|
||||
add_type("ushort", 2); /* SDNA_TYPE_USHORT */
|
||||
add_type("int", 4); /* SDNA_TYPE_INT */
|
||||
add_type("long", 4); /* SDNA_TYPE_LONG */ /* should it be 8 on 64 bits? */
|
||||
add_type("ulong", 4); /* SDNA_TYPE_ULONG */
|
||||
add_type("float", 4); /* SDNA_TYPE_FLOAT */
|
||||
add_type("double", 8); /* SDNA_TYPE_DOUBLE */
|
||||
add_type("int64_t", 8); /* SDNA_TYPE_INT64 */
|
||||
add_type("char", 1); /* SDNA_TYPE_CHAR */
|
||||
add_type("uchar", 1); /* SDNA_TYPE_UCHAR */
|
||||
add_type("short", 2); /* SDNA_TYPE_SHORT */
|
||||
add_type("ushort", 2); /* SDNA_TYPE_USHORT */
|
||||
add_type("int", 4); /* SDNA_TYPE_INT */
|
||||
add_type("long", 4); /* SDNA_TYPE_LONG */ /* should it be 8 on 64 bits? */
|
||||
add_type("ulong", 4); /* SDNA_TYPE_ULONG */
|
||||
add_type("float", 4); /* SDNA_TYPE_FLOAT */
|
||||
add_type("double", 8); /* SDNA_TYPE_DOUBLE */
|
||||
add_type("int64_t", 8); /* SDNA_TYPE_INT64 */
|
||||
add_type("uint64_t", 8); /* SDNA_TYPE_UINT64 */
|
||||
add_type("void", 0); /* SDNA_TYPE_VOID */
|
||||
add_type("void", 0); /* SDNA_TYPE_VOID */
|
||||
|
||||
// the defines above shouldn't be output in the padding file...
|
||||
firststruct = nr_types;
|
||||
@@ -977,7 +977,7 @@ static int make_structDNA(char *baseDirectory, FILE *file)
|
||||
if (debugSDNA) printf("\tStart of header scan:\n");
|
||||
for (i = 0; strlen(includefiles[i]); i++) {
|
||||
sprintf(str, "%s%s", baseDirectory, includefiles[i]);
|
||||
if (debugSDNA) printf("\t|-- Converting %s\n", str);
|
||||
if (debugSDNA) printf("\t|-- Converting %s\n", str);
|
||||
if (convert_include(str)) {
|
||||
return (1);
|
||||
}
|
||||
@@ -992,28 +992,28 @@ static int make_structDNA(char *baseDirectory, FILE *file)
|
||||
/* FOR DEBUG */
|
||||
if (debugSDNA > 1) {
|
||||
int a, b;
|
||||
/* short *elem; */
|
||||
/* short *elem; */
|
||||
short num_types;
|
||||
|
||||
printf("nr_names %d nr_types %d nr_structs %d\n", nr_names, nr_types, nr_structs);
|
||||
for (a=0; a<nr_names; a++) {
|
||||
for (a = 0; a < nr_names; a++) {
|
||||
printf(" %s\n", names[a]);
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
sp= typelens;
|
||||
for (a=0; a<nr_types; a++, sp++) {
|
||||
sp = typelens;
|
||||
for (a = 0; a < nr_types; a++, sp++) {
|
||||
printf(" %s %d\n", types[a], *sp);
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
for (a=0; a<nr_structs; a++) {
|
||||
sp= structs[a];
|
||||
for (a = 0; a < nr_structs; a++) {
|
||||
sp = structs[a];
|
||||
printf(" struct %s elems: %d size: %d\n", types[sp[0]], sp[1], typelens[sp[0]]);
|
||||
num_types = sp[1];
|
||||
sp+= 2;
|
||||
sp += 2;
|
||||
/* ? num_types was elem? */
|
||||
for (b=0; b< num_types; b++, sp+= 2) {
|
||||
for (b = 0; b < num_types; b++, sp += 2) {
|
||||
printf(" %s %s\n", types[sp[0]], names[sp[1]]);
|
||||
}
|
||||
}
|
||||
@@ -1023,7 +1023,7 @@ static int make_structDNA(char *baseDirectory, FILE *file)
|
||||
|
||||
if (debugSDNA > -1) printf("Writing file ... ");
|
||||
|
||||
if (nr_names==0 || nr_structs==0);
|
||||
if (nr_names == 0 || nr_structs == 0) ;
|
||||
else {
|
||||
strcpy(str, "SDNA");
|
||||
dna_write(file, str, 4);
|
||||
@@ -1031,27 +1031,27 @@ static int make_structDNA(char *baseDirectory, FILE *file)
|
||||
/* write names */
|
||||
strcpy(str, "NAME");
|
||||
dna_write(file, str, 4);
|
||||
len= nr_names;
|
||||
len = nr_names;
|
||||
dna_write(file, &len, 4);
|
||||
|
||||
/* calculate size of datablock with strings */
|
||||
cp= names[nr_names-1];
|
||||
cp+= strlen(names[nr_names-1]) + 1; /* +1: null-terminator */
|
||||
len= (intptr_t) (cp - (char*) names[0]);
|
||||
len= (len+3) & ~3;
|
||||
cp = names[nr_names - 1];
|
||||
cp += strlen(names[nr_names - 1]) + 1; /* +1: null-terminator */
|
||||
len = (intptr_t) (cp - (char *) names[0]);
|
||||
len = (len + 3) & ~3;
|
||||
dna_write(file, names[0], len);
|
||||
|
||||
/* write TYPES */
|
||||
strcpy(str, "TYPE");
|
||||
dna_write(file, str, 4);
|
||||
len= nr_types;
|
||||
len = nr_types;
|
||||
dna_write(file, &len, 4);
|
||||
|
||||
/* calculate datablock size */
|
||||
cp= types[nr_types-1];
|
||||
cp+= strlen(types[nr_types-1]) + 1; /* +1: null-terminator */
|
||||
len= (intptr_t) (cp - (char*) types[0]);
|
||||
len= (len+3) & ~3;
|
||||
cp = types[nr_types - 1];
|
||||
cp += strlen(types[nr_types - 1]) + 1; /* +1: null-terminator */
|
||||
len = (intptr_t) (cp - (char *) types[0]);
|
||||
len = (len + 3) & ~3;
|
||||
|
||||
dna_write(file, types[0], len);
|
||||
|
||||
@@ -1059,21 +1059,21 @@ static int make_structDNA(char *baseDirectory, FILE *file)
|
||||
strcpy(str, "TLEN");
|
||||
dna_write(file, str, 4);
|
||||
|
||||
len= 2*nr_types;
|
||||
if (nr_types & 1) len+= 2;
|
||||
len = 2 * nr_types;
|
||||
if (nr_types & 1) len += 2;
|
||||
dna_write(file, typelens, len);
|
||||
|
||||
/* WRITE STRUCTS */
|
||||
strcpy(str, "STRC");
|
||||
dna_write(file, str, 4);
|
||||
len= nr_structs;
|
||||
len = nr_structs;
|
||||
dna_write(file, &len, 4);
|
||||
|
||||
/* calc datablock size */
|
||||
sp= structs[nr_structs-1];
|
||||
sp+= 2+ 2*( sp[1] );
|
||||
len= (intptr_t) ((char*) sp - (char*) structs[0]);
|
||||
len= (len+3) & ~3;
|
||||
sp = structs[nr_structs - 1];
|
||||
sp += 2 + 2 * (sp[1]);
|
||||
len = (intptr_t) ((char *) sp - (char *) structs[0]);
|
||||
len = (len + 3) & ~3;
|
||||
|
||||
dna_write(file, structs[0], len);
|
||||
|
||||
@@ -1082,8 +1082,8 @@ static int make_structDNA(char *baseDirectory, FILE *file)
|
||||
FILE *fp;
|
||||
int a;
|
||||
|
||||
fp= fopen("padding.c", "w");
|
||||
if (fp==NULL);
|
||||
fp = fopen("padding.c", "w");
|
||||
if (fp == NULL) ;
|
||||
else {
|
||||
|
||||
// add all include files defined in the global array
|
||||
@@ -1094,7 +1094,7 @@ static int make_structDNA(char *baseDirectory, FILE *file)
|
||||
fprintf(fp, "main() {\n");
|
||||
sp = typelens;
|
||||
sp += firststruct;
|
||||
for (a=firststruct; a<nr_types; a++, sp++) {
|
||||
for (a = firststruct; a < nr_types; a++, sp++) {
|
||||
if (*sp) {
|
||||
fprintf(fp, "\tif (sizeof(struct %s) - %d) printf(\"ALIGN ERROR:", types[a], *sp);
|
||||
fprintf(fp, "%%d %s %d ", types[a], *sp);
|
||||
@@ -1127,7 +1127,7 @@ static int make_structDNA(char *baseDirectory, FILE *file)
|
||||
|
||||
static void make_bad_file(const char *file, int line)
|
||||
{
|
||||
FILE *fp= fopen(file, "w");
|
||||
FILE *fp = fopen(file, "w");
|
||||
fprintf(fp, "#error \"Error! can't make correct DNA.c file from %s:%d, STUPID!\"\n", __FILE__, line);
|
||||
fclose(fp);
|
||||
}
|
||||
@@ -1136,32 +1136,32 @@ static void make_bad_file(const char *file, int line)
|
||||
#define BASE_HEADER "../"
|
||||
#endif
|
||||
|
||||
int main(int argc, char ** argv)
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
FILE *file;
|
||||
int return_status = 0;
|
||||
|
||||
if (argc!=2 && argc!=3) {
|
||||
if (argc != 2 && argc != 3) {
|
||||
printf("Usage: %s outfile.c [base directory]\n", argv[0]);
|
||||
return_status = 1;
|
||||
}
|
||||
else {
|
||||
file = fopen(argv[1], "w");
|
||||
if (!file) {
|
||||
printf ("Unable to open file: %s\n", argv[1]);
|
||||
printf("Unable to open file: %s\n", argv[1]);
|
||||
return_status = 1;
|
||||
}
|
||||
else {
|
||||
char baseDirectory[256];
|
||||
|
||||
if (argc==3) {
|
||||
if (argc == 3) {
|
||||
strcpy(baseDirectory, argv[2]);
|
||||
}
|
||||
else {
|
||||
strcpy(baseDirectory, BASE_HEADER);
|
||||
}
|
||||
|
||||
fprintf (file, "unsigned char DNAstr[]= {\n");
|
||||
fprintf(file, "unsigned char DNAstr[]= {\n");
|
||||
if (make_structDNA(baseDirectory, file)) {
|
||||
// error
|
||||
fclose(file);
|
||||
|
||||
Reference in New Issue
Block a user