int World::loadSurroundingColumns(v3d_t pos) { // this will follow a 'square spiral' pattern starting at the // given pos int numColumnsLoaded = 0; v3di_t regionIndex = WorldUtil::getRegionIndex (pos); int maxCount = mWorldMap->mXWidth * mWorldMap->mZWidth; static int nextAdd[4][2] = { { +1, 0 }, { 0, +1 }, { -1, 0 }, { 0, -1 }}; int direction = 0; int runLength = 1; int twosCounter = 0; // check under the player if (!mWorldMap->isColumnLoaded(regionIndex.x, regionIndex.z)) { loadColumn(regionIndex.x, regionIndex.z, true); } for (int count = 1; count < maxCount; /*count++*/ ) { for (int i = 0; i < runLength; i++) { // move to the next column region regionIndex.x += nextAdd[direction][0]; regionIndex.z += nextAdd[direction][1]; // check it if (!mWorldMap->isColumnLoaded(regionIndex.x, regionIndex.z)) { numColumnsLoaded += loadColumn(regionIndex.x, regionIndex.z, true); // v3di_print("loaded", regionIndex); if (++numColumnsLoaded > 1) { return numColumnsLoaded; } } count++; if (count == maxCount) { return 0; } } direction = (direction + 1) % 4; if (++twosCounter == 2) { runLength++; twosCounter = 0; } } return numColumnsLoaded; }
void WMLoadBrowserColumnZero(WMBrowser * bPtr) { if (!bPtr->flags.loaded) { /* create column 0 */ WMAddBrowserColumn(bPtr); loadColumn(bPtr, 0); /* make column 0 visible */ scrollToColumn(bPtr, 0, True); bPtr->flags.loaded = 1; } }
int World::loadColumn(int xIndex, int zIndex, const int *heightMap) { int columnIndex = mWorldMap->getColumnIndexByRegionCoords (xIndex, zIndex); int numBlocks = loadColumn(mWorldMap->mColumns[columnIndex], xIndex, zIndex, heightMap, false); mWorldMap->mColumns[columnIndex].mNeedShadowVolume = true; mWorldMap->mColumns[columnIndex].mNeedLightingApplied = false; mWorldMap->mColumns[columnIndex].mNeedVisibility = false; mWorldMap->mColumns[columnIndex].mNeedDisplayList = false; // prevent fluids from starting... // FIXME: this is a hack to compensate for a crappy // fluid sim mWorldMap->removeFromChangedList(columnIndex); return numBlocks; }
static void listCallback(void *self, void *clientData) { WMBrowser *bPtr = (WMBrowser *) clientData; WMList *lPtr = (WMList *) self; WMListItem *item; int i, selNo; static WMListItem *oldItem = NULL; static int oldSelNo = 0; item = WMGetListSelectedItem(lPtr); selNo = WMGetArrayItemCount(WMGetListSelectedItems(lPtr)); if (oldItem == NULL || oldItem != item || oldSelNo != selNo) { for (i = 0; i < bPtr->columnCount; i++) { if (lPtr == bPtr->columns[i]) break; } assert(i < bPtr->columnCount); bPtr->selectedColumn = i; /* columns at right must be cleared */ removeColumn(bPtr, i + 1); /* open directory */ if (item && item->isBranch && selNo == 1) { WMAddBrowserColumn(bPtr); } if (bPtr->usedColumnCount < bPtr->maxVisibleColumns) i = 0; else i = bPtr->usedColumnCount - bPtr->maxVisibleColumns; scrollToColumn(bPtr, i, True); if (item && item->isBranch && selNo == 1) { loadColumn(bPtr, bPtr->usedColumnCount - 1); } } /* call callback for click */ if (bPtr->action) (*bPtr->action) (bPtr, bPtr->clientData); oldItem = item; oldSelNo = selNo; }
int World::loadColumn(int xIndex, int zIndex, bool doOutcroppings) { int columnIndex = mWorldMap->getColumnIndexByRegionCoords(xIndex, zIndex); if (xIndex == mWorldMap->mColumns[columnIndex].mWorldIndex.x && zIndex == mWorldMap->mColumns[columnIndex].mWorldIndex.z) { printf ("World::loadColumn() - tried to load a column that is already loaded\n"); return 0; } mWorldMap->clearColumn(columnIndex); int numBlocks; // try to load from the inactive columns if (mWorldMap->mInactiveColumnManager.loadFromInactiveColumns(xIndex, zIndex, mWorldMap->mColumns[columnIndex]) == 0) { // printf ("loaded column from InactiveColumnManager\n"); numBlocks = 0; } else { // generate this column fresh from the Periodics int worldX = xIndex * WORLD_CHUNK_SIDE; int worldZ = zIndex * WORLD_CHUNK_SIDE; int heightMap[(WORLD_CHUNK_SIDE + 2) * (WORLD_CHUNK_SIDE + 2)]; for (int k = 0; k < (WORLD_CHUNK_SIDE + 2); k++) { for (int i = 0; i < (WORLD_CHUNK_SIDE + 2); i++) { heightMap[i + (k * (WORLD_CHUNK_SIDE + 2))] = mPeriodics.getTerrainHeight(worldX + i - 1, worldZ + k - 1); } } numBlocks = loadColumn(mWorldMap->mColumns[columnIndex], xIndex, zIndex, heightMap, doOutcroppings); } // prevent fluids from starting... // FIXME: this is a hack to compensate for a crappy // fluid sim mWorldMap->removeFromChangedList(columnIndex); return numBlocks; }
char *WMSetBrowserPath(WMBrowser * bPtr, char *path) { int i; char *str; char *tmp, *retPtr = NULL; int item; WMListItem *listItem; /* WMLoadBrowserColumnZero must be call first */ if (!bPtr->flags.loaded) { return False; } removeColumn(bPtr, 1); WMSelectListItem(bPtr->columns[0], -1); WMSetListPosition(bPtr->columns[0], 0); i = 0; str = wstrdup(path); tmp = strtok(str, bPtr->pathSeparator); while (tmp) { /* select it in the column */ item = WMFindRowOfListItemWithTitle(bPtr->columns[i], tmp); if (item < 0) { retPtr = &path[(int)(tmp - str)]; break; } WMSelectListItem(bPtr->columns[i], item); WMSetListPosition(bPtr->columns[i], item); listItem = WMGetListItem(bPtr->columns[i], item); if (!listItem || !listItem->isBranch) { break; } /* load next column */ WMAddBrowserColumn(bPtr); loadColumn(bPtr, i + 1); tmp = strtok(NULL, bPtr->pathSeparator); i++; } wfree(str); for (i = bPtr->usedColumnCount - 1; (i > -1) && !WMGetListSelectedItem(bPtr->columns[i]); i--) ; bPtr->selectedColumn = i; if (bPtr->columnCount < bPtr->maxVisibleColumns) { int i = bPtr->maxVisibleColumns - bPtr->columnCount; int curUsedColumnCount = bPtr->usedColumnCount; bPtr->usedColumnCount = bPtr->columnCount; while (i--) { WMAddBrowserColumn(bPtr); } bPtr->usedColumnCount = curUsedColumnCount; } scrollToColumn(bPtr, bPtr->columnCount - bPtr->maxVisibleColumns, True); return retPtr; }