diff options
Diffstat (limited to 'src/base/space.c')
| -rw-r--r-- | src/base/space.c | 584 |
1 files changed, 298 insertions, 286 deletions
diff --git a/src/base/space.c b/src/base/space.c index 1e2d3fa..382c4a4 100644 --- a/src/base/space.c +++ b/src/base/space.c @@ -9,375 +9,387 @@ #include "space.h" #include "index.h" -zone_t * -newZone() +zone_t* newZone() { - zone_t *new; + zone_t *new; - new = malloc(sizeof(zone_t)); - new->list = newList(); + new = malloc( sizeof(zone_t) ); + new->list = newList(); - return new; + return new; } -void -destroyZone(zone_t * p) +void destroyZone(zone_t *p) { - assert(p != NULL); + assert( p != NULL ); - destroyList(p->list); - free(p); + destroyList(p->list); + free(p); } -static int -my_conflictSpace(int x1, int y1, int w1, int h1, int x2, int y2, int w2, - int h2) +static int my_conflictSpace(int x1,int y1,int w1,int h1,int x2,int y2,int w2,int h2) { - return (x1 < x2 + w2 && x2 < x1 + w1 && y1 < y2 + h2 && y2 < y1 + h1); + return (x1<x2+w2 && x2<x1+w1 && y1<y2+h2 && y2<y1+h1); } -space_t * -newSpace(int w, int h, int segW, int segH, - void (*getStatus) (void *p, int *id, int *x, int *y, int *w, int *h), - void (*setStatus) (void *p, int x, int y, int w, int h)) +space_t *newSpace(int w, int h, int segW, int segH, + void (*getStatus)(void *p, int *id, int *x, int *y, int *w, int *h), + void (*setStatus)(void *p, int x, int y, int w, int h)) { - space_t *new; - int i, j; - - new = malloc(sizeof(space_t)); - memset(new, 0, sizeof(space_t)); - - new->w = w / segW + 1; - new->h = h / segH + 1; - new->segW = segW; - new->segH = segH; - new->getStatus = getStatus; - new->setStatus = setStatus; - new->listIndex = newIndex(); - - new->zone = malloc(new->w * sizeof(list_t **)); - - for (i = 0; i < new->w; i++) { - new->zone[i] = malloc(new->h * sizeof(list_t *)); - } - - for (i = 0; i < new->h; i++) { - for (j = 0; j < new->w; j++) { - new->zone[j][i] = newZone(); - } - } - - return new; + space_t *new; + int i, j; + + new = malloc( sizeof(space_t) ); + memset(new, 0, sizeof(space_t)); + + new->w = w / segW + 1; + new->h = h / segH + 1; + new->segW = segW; + new->segH = segH; + new->getStatus = getStatus; + new->setStatus = setStatus; + new->listIndex = newIndex(); + + new->zone = malloc( new->w * sizeof(list_t **) ); + + for( i = 0 ; i < new->w ; i++ ) + { + new->zone[i] = malloc( new->h * sizeof(list_t *) ); + } + + for( i = 0 ; i < new->h ; i++ ) + { + for( j = 0 ; j < new->w ; j++ ) + { + new->zone[j][i] = newZone(); + } + } + + return new; } -static void -getSegment(space_t * p, int x, int y, int w, int h, - int *segX, int *segY, int *segW, int *segH) +static void getSegment(space_t *p, int x, int y, int w, int h, + int *segX, int *segY, int *segW, int *segH) { - *segX = x / p->segW; - *segY = y / p->segH; - *segW = ((x + w) / p->segW + 1) - *segX; - *segH = ((y + h) / p->segH + 1) - *segY; + *segX = x / p->segW; + *segY = y / p->segH; + *segW = ( (x+w) / p->segW + 1 ) - *segX; + *segH = ( (y+h) / p->segH + 1 ) - *segY; } -int -getSpaceCount(space_t * p) +int getSpaceCount(space_t *p) { - return p->listIndex->count; + return p->listIndex->count; } -void * -getItemFromSpace(space_t * p, int offset) +void* getItemFromSpace(space_t *p, int offset) { - index_item_t *this; + index_item_t *this; - this = (index_item_t *) p->listIndex->list[offset]; - return this->data; + this = (index_item_t *)p->listIndex->list[offset]; + return this->data; } -void -addObjectToSpace(space_t * p, void *item) +void addObjectToSpace(space_t *p, void *item) { - int segX, segY, segW, segH; - int id, x, y, w, h; - int i, j; - - p->getStatus(item, &id, &x, &y, &w, &h); - getSegment(p, x, y, w, h, &segX, &segY, &segW, &segH); - - for (i = segY; i < segY + segH; i++) { - for (j = segX; j < segX + segW; j++) { - if (j < 0 || j >= p->w || i < 0 || i >= p->h) { - continue; - } - - addList(p->zone[j][i]->list, item); - } - } - - addToIndex(p->listIndex, id, item); + int segX, segY, segW, segH; + int id, x, y, w, h; + int i, j; + + p->getStatus(item, &id, &x, &y, &w, &h); + getSegment(p, x, y, w, h, &segX, &segY, &segW, &segH); + + for( i = segY ; i < segY + segH ; i++ ) + { + for( j = segX ; j < segX + segW ; j++ ) + { + if( j < 0 || j >= p->w || i < 0 || i >= p->h ) + { + continue; + } + + addList(p->zone[j][i]->list, item); + } + } + + addToIndex(p->listIndex, id, item); } -void -getObjectFromSpace(space_t * p, int x, int y, int w, int h, list_t * list) +void getObjectFromSpace(space_t *p, int x, int y, int w, int h, list_t *list) { - int segX, segY, segW, segH; - int id, this_x, this_y, this_w, this_h; - int i, j, k; - - getSegment(p, x, y, w, h, &segX, &segY, &segW, &segH); - - for (i = segY; i < segY + segH; i++) { - for (j = segX; j < segX + segW; j++) { - void *this; - - if (j < 0 || j >= p->w || i < 0 || i >= p->h) { - continue; - } - - for (k = 0; k < p->zone[j][i]->list->count; k++) { - this = p->zone[j][i]->list->list[k]; - p->getStatus(this, &id, &this_x, &this_y, &this_w, &this_h); - - if (my_conflictSpace(x, y, w, h, this_x, this_y, this_w, this_h) - && searchListItem(list, this) == -1) { - addList(list, this); - } - } - } - } + int segX, segY, segW, segH; + int id, this_x, this_y, this_w, this_h; + int i, j, k; + + getSegment(p, x, y, w, h, &segX, &segY, &segW, &segH); + + for( i = segY ; i < segY + segH ; i++ ) + { + for( j = segX ; j < segX + segW ; j++ ) + { + void *this; + + if( j < 0 || j >= p->w || i < 0 || i >= p->h ) + { + continue; + } + + for( k = 0 ; k < p->zone[j][i]->list->count ; k++ ) + { + this = p->zone[j][i]->list->list[k]; + p->getStatus(this, &id, &this_x, &this_y, &this_w, &this_h); + + if( my_conflictSpace(x, y, w, h, this_x, this_y, this_w, this_h) && + searchListItem(list, this) == -1 ) + { + addList(list, this); + } + } + } + } } -void * -getObjectFromSpaceWithID(space_t * space, int id) +void* getObjectFromSpaceWithID(space_t *space, int id) { - return getFromIndex(space->listIndex, id); + return getFromIndex(space->listIndex, id); } -int -isConflictWithObjectFromSpace(space_t * p, int x, int y, int w, int h) +int isConflictWithObjectFromSpace(space_t *p, int x, int y, int w, int h) { - int segX, segY, segW, segH; - int id, this_x, this_y, this_w, this_h; - int i, j, k; - - getSegment(p, x, y, w, h, &segX, &segY, &segW, &segH); - - for (i = segY; i < segY + segH; i++) { - for (j = segX; j < segX + segW; j++) { - void *this; - - if (j < 0 || j >= p->w || i < 0 || i >= p->h) { - continue; - } - - for (k = 0; k < p->zone[j][i]->list->count; k++) { - this = p->zone[j][i]->list->list[k]; - p->getStatus(this, &id, &this_x, &this_y, &this_w, &this_h); - - if (my_conflictSpace(x, y, w, h, this_x, this_y, this_w, this_h)) { - return 1; - } - } - } - } - - return 0; + int segX, segY, segW, segH; + int id, this_x, this_y, this_w, this_h; + int i, j, k; + + getSegment(p, x, y, w, h, &segX, &segY, &segW, &segH); + + for( i = segY ; i < segY + segH ; i++ ) + { + for( j = segX ; j < segX + segW ; j++ ) + { + void *this; + + if( j < 0 || j >= p->w || i < 0 || i >= p->h ) + { + continue; + } + + for( k = 0 ; k < p->zone[j][i]->list->count ; k++ ) + { + this = p->zone[j][i]->list->list[k]; + p->getStatus(this, &id, &this_x, &this_y, &this_w, &this_h); + + if( my_conflictSpace(x, y, w, h, this_x, this_y, this_w, this_h) ) + { + return 1; + } + } + } + } + + return 0; } -int -isConflictWithObjectFromSpaceBut(space_t * p, int x, int y, int w, int h, - void *but) +int isConflictWithObjectFromSpaceBut(space_t *p, int x, int y, int w, int h, void *but) { - int segX, segY, segW, segH; - int id, this_x, this_y, this_w, this_h; - int i, j, k; - - getSegment(p, x, y, w, h, &segX, &segY, &segW, &segH); - - for (i = segY; i < segY + segH; i++) { - for (j = segX; j < segX + segW; j++) { - void *this; - - if (j < 0 || j >= p->w || i < 0 || i >= p->h) { - continue; - } - - for (k = 0; k < p->zone[j][i]->list->count; k++) { - this = p->zone[j][i]->list->list[k]; - - if (this == but) { - continue; - } - - p->getStatus(this, &id, &this_x, &this_y, &this_w, &this_h); - - if (my_conflictSpace(x, y, w, h, this_x, this_y, this_w, this_h)) { - return 1; - } - } - } - } - - return 0; + int segX, segY, segW, segH; + int id, this_x, this_y, this_w, this_h; + int i, j, k; + + getSegment(p, x, y, w, h, &segX, &segY, &segW, &segH); + + for( i = segY ; i < segY + segH ; i++ ) + { + for( j = segX ; j < segX + segW ; j++ ) + { + void *this; + + if( j < 0 || j >= p->w || i < 0 || i >= p->h ) + { + continue; + } + + for( k = 0 ; k < p->zone[j][i]->list->count ; k++ ) + { + this = p->zone[j][i]->list->list[k]; + + if( this == but ) + { + continue; + } + + p->getStatus(this, &id, &this_x, &this_y, &this_w, &this_h); + + if( my_conflictSpace(x, y, w, h, this_x, this_y, this_w, this_h) ) + { + return 1; + } + } + } + } + + return 0; } -void -delObjectFromSpace(space_t * p, void *item) +void delObjectFromSpace(space_t *p, void *item) { - int segX, segY, segW, segH; - int id, x, y, w, h; - int index; - int i, j; - - p->getStatus(item, &id, &x, &y, &w, &h); - getSegment(p, x, y, w, h, &segX, &segY, &segW, &segH); - - for (i = segY; i < segY + segH; i++) { - for (j = segX; j < segX + segW; j++) { - if (j < 0 || j >= p->w || i < 0 || i >= p->h) { - continue; - } - - index = searchListItem(p->zone[j][i]->list, item); - assert(index != -1); - delList(p->zone[j][i]->list, index); - } - } - - delFromIndex(p->listIndex, id); + int segX, segY, segW, segH; + int id, x, y, w, h; + int index; + int i, j; + + p->getStatus(item, &id, &x, &y, &w, &h); + getSegment(p, x, y, w, h, &segX, &segY, &segW, &segH); + + for( i = segY ; i < segY + segH ; i++ ) + { + for( j = segX ; j < segX + segW ; j++ ) + { + if( j < 0 || j >= p->w || i < 0 || i >= p->h ) + { + continue; + } + + index = searchListItem(p->zone[j][i]->list, item); + assert( index != -1 ); + delList(p->zone[j][i]->list, index); + } + } + + delFromIndex(p->listIndex, id); } -void -delObjectFromSpaceWithObject(space_t * p, void *item, void *f) +void delObjectFromSpaceWithObject(space_t *p, void *item, void *f) { - void (*fce) (void *param); + void (*fce)(void *param); - fce = f; + fce = f; - delObjectFromSpace(p, item); - fce(item); + delObjectFromSpace(p, item); + fce(item); } -void -moveObjectInSpace(space_t * p, void *item, int move_x, int move_y) +void moveObjectInSpace(space_t *p, void *item, int move_x, int move_y) { - int old_segX, old_segY, old_segW, old_segH; - int new_segX, new_segY, new_segW, new_segH; - int id, x, y, w, h; - - p->getStatus(item, &id, &x, &y, &w, &h); - getSegment(p, x, y, w, h, &old_segX, &old_segY, &old_segW, &old_segH); - getSegment(p, move_x, move_y, w, h, &new_segX, &new_segY, &new_segW, - &new_segH); + int old_segX, old_segY, old_segW, old_segH; + int new_segX, new_segY, new_segW, new_segH; + int id, x, y, w, h; + + p->getStatus(item, &id, &x, &y, &w, &h); + getSegment(p, x, y, w, h, &old_segX, &old_segY, &old_segW, &old_segH); + getSegment(p, move_x, move_y, w, h, &new_segX, &new_segY, &new_segW, &new_segH); /* printf("%d %d %d %d -> %d %d %d %d \n", old_segX, old_segY, old_segW, old_segH, new_segX, new_segY, new_segW, new_segH); */ - if (old_segX != new_segX || old_segY != new_segY || - old_segW != new_segW || old_segH != new_segH) { - delObjectFromSpace(p, item); - p->setStatus(item, move_x, move_y, w, h); - addObjectToSpace(p, item); - return; - } - - p->setStatus(item, move_x, move_y, w, h); + if( old_segX != new_segX || old_segY != new_segY || + old_segW != new_segW || old_segH != new_segH ) + { + delObjectFromSpace(p, item); + p->setStatus(item, move_x, move_y, w, h); + addObjectToSpace(p, item); + return; + } + + p->setStatus(item, move_x, move_y, w, h); } -void -printSpace(space_t * p) +void printSpace(space_t *p) { - int i, j; + int i, j; - printf("print space : \n"); + printf("print space : \n"); - for (i = 0; i < p->h; i++) { - for (j = 0; j < p->w; j++) { - printf("%3d ", p->zone[j][i]->list->count); - } + for( i = 0 ; i < p->h ; i++ ) + { + for( j = 0 ; j < p->w ; j++ ) + { + printf("%3d ", p->zone[j][i]->list->count); + } - putchar('\n'); - } + putchar('\n'); + } } -void -actionSpace(space_t * space, void *f, void *p) +void actionSpace(space_t *space, void *f, void *p) { - void (*fce) (space_t * space, void *f, void *p); - int len; - int i; - - fce = f; - len = space->listIndex->count; - - for (i = 0; i < len; i++) { - fce(space, getItemFromSpace(space, i), p); - - if (space->listIndex->count == len - 1) { - len--; - i--; - } - } + void (*fce)(space_t *space, void *f, void *p); + int len; + int i; + + fce = f; + len = space->listIndex->count; + + for( i = 0 ; i < len ; i++ ) + { + fce(space, getItemFromSpace(space, i), p); + + if( space->listIndex->count == len-1 ) + { + len--; + i--; + } + } } -void -actionSpaceFromLocation(space_t * space, void *f, void *p, int x, int y, - int w, int h) +void actionSpaceFromLocation(space_t *space, void *f, void *p, int x, int y, int w, int h) { - void (*fce) (space_t * space, void *f, void *p); - list_t *list; - int len; - int i; + void (*fce)(space_t *space, void *f, void *p); + list_t *list; + int len; + int i; - fce = f; + fce = f; - list = newList(); + list = newList(); - getObjectFromSpace(space, x, y, w, h, list); + getObjectFromSpace(space, x, y, w, h, list); - len = list->count; + len = list->count; - for (i = 0; i < len; i++) { - fce(space, list->list[i], p); - } + for( i = 0 ; i < len ; i++ ) + { + fce(space, list->list[i], p); + } - destroyList(list); + destroyList(list); } -void -destroySpace(space_t * p) +void destroySpace(space_t *p) { - int j, i; + int j, i; - destroyIndex(p->listIndex); + destroyIndex(p->listIndex); - for (i = 0; i < p->h; i++) { - for (j = 0; j < p->w; j++) { - destroyZone(p->zone[j][i]); - } - } + for( i = 0 ; i < p->h ; i++ ) + { + for( j = 0 ; j < p->w ; j++ ) + { + destroyZone(p->zone[j][i]); + } + } - for (i = 0; i < p->w; i++) { - free(p->zone[i]); - } + for( i = 0 ; i < p->w ; i++ ) + { + free(p->zone[i]); + } - free(p->zone); - free(p); + free(p->zone); + free(p); } -void -destroySpaceWithObject(space_t * p, void *f) +void destroySpaceWithObject(space_t *p, void *f) { - void (*fce) (void *param); - int i; + void (*fce)(void *param); + int i; - fce = f; + fce = f; - for (i = 0; i < p->listIndex->count; i++) { - fce(getItemFromSpace(p, i)); - } + for( i = 0 ; i < p->listIndex->count ; i++ ) + { + fce( getItemFromSpace(p, i) ); + } - destroySpace(p); + destroySpace(p); } + |