void HierarchicalPathfinder::Update(Grid<NavcellData>* grid, const Grid<u8>& dirtinessGrid) { PROFILE3("Hierarchical Update"); std::vector<std::pair<int, int> > processedChunks; for (int j = 0; j < dirtinessGrid.m_H; ++j) { for (int i = 0; i < dirtinessGrid.m_W; ++i) { if (!dirtinessGrid.get(i, j)) continue; std::pair<int, int> chunkID(i / CHUNK_SIZE, j / CHUNK_SIZE); for (auto& passClassMask : m_PassClassMasks) { pass_class_t passClass = passClassMask.second; Chunk& a = m_Chunks[passClass].at(chunkID.second*m_ChunksW + chunkID.first); if (std::find(processedChunks.begin(), processedChunks.end(), chunkID) == processedChunks.end()) { processedChunks.push_back(chunkID); a.InitRegions(chunkID.first, chunkID.second, grid, passClass); } } } } // TODO: Also be clever with edges m_Edges.clear(); for (auto& passClassMask : m_PassClassMasks) { pass_class_t passClass = passClassMask.second; EdgesMap& edges = m_Edges[passClass]; for (int cj = 0; cj < m_ChunksH; ++cj) { for (int ci = 0; ci < m_ChunksW; ++ci) { FindEdges(ci, cj, passClass, edges); } } } if (m_DebugOverlay) { PROFILE("debug overlay"); m_DebugOverlayLines.clear(); AddDebugEdges(GetPassabilityClass("default")); } }
bool CacheChunkWalker::nextTile( std::string& chunkName, int16& gridX, int16& gridZ ) { if (xs_.size()==0) return false; int i = xs_.size() - 1; gridX = xs_[i]; gridZ = zs_[i]; chunkID( chunkName, gridX, gridZ ); xs_.pop_back(); zs_.pop_back(); return true; }
bool ModifiedFileChunkWalker::isRelevant( const WIN32_FIND_DATA& fileInfo ) { int16 gridX, gridZ; if (::gridFromThumbnailFileName((unsigned char*)&fileInfo.cFileName[0],gridX,gridZ)) { std::string pathName = WorldManager::instance().chunkDirMapping()->path(); std::string chunkName; chunkID( chunkName, gridX, gridZ ); if( ::thumbnailExists( pathName, chunkName ) ) { uint64 fileTime = SpaceMap::instance().timestampCache().getUint64(fileInfo.ftLastWriteTime); uint64 cacheTime = SpaceMap::instance().timestampCache().cacheTime(gridX, gridZ); if ( cacheTime < fileTime ) { SpaceMapDebug::instance().onConsidered(gridX,gridZ,0x00ff0000); return true; } else { //Green - thumbnail is ok SpaceMapDebug::instance().onConsidered(gridX,gridZ,0x0000ff00); } } else { //Black - thumbnail does not exist on disk! SpaceMapDebug::instance().onConsidered(gridX,gridZ,0x00000000); } } return false; }
int main(void){ static char wave[DATALENGTH*2] ; char filename[16] = "temp.wav" ; char header[46] ; int i; clock_t start,finish ; FILE *fp ; OPLL *opll ; /* Create WAVE header */ chunkID(header,"RIFF") ; DWORD(header+4,DATALENGTH*2+36) ; chunkID(header+8,"WAVE") ; chunkID(header+12,"fmt ") ; DWORD(header+16,16) ; WORD(header+20,1) ; /* WAVE_FORMAT_PCM */ WORD(header+22,1) ; /* channel 1=mono,2=stereo */ DWORD(header+24,SAMPLERATE) ; /* samplesPerSec */ DWORD(header+28,2*SAMPLERATE) ; /* bytesPerSec */ WORD(header+32,2) ; /* blockSize */ WORD(header+34,16) ; /* bitsPerSample */ chunkID(header+36,"data") ; DWORD(header+40,2*DATALENGTH) ; opll = OPLL_new(MSX_CLK,SAMPLERATE) ; OPLL_reset(opll); OPLL_writeReg(opll,0x30,0x30) ; /* select PIANO Voice to ch1. */ OPLL_writeReg(opll,0x10,0x80) ; /* set F-Number(L). */ OPLL_writeReg(opll,0x20,0x15) ; /* set BLK & F-Number(H) and keyon. */ start = clock() ; i=0; for(i=0;i<DATALENGTH;i++) { WORD(wave+i*2,OPLL_calc(opll)); } finish = clock() ; OPLL_delete(opll) ; printf("It has been %f sec to calc %d waves.\n", (double)(finish-start)/CLOCKS_PER_SEC, DATALENGTH) ; printf("%f times faster than real YM2413.\n", ((double)DATALENGTH/SAMPLERATE)/((double)(finish-start)/CLOCKS_PER_SEC)) ; fp = fopen(filename,"wb") ; if(fp == NULL) return 1 ; fwrite(header,46,1,fp) ; fwrite(wave,DATALENGTH,2,fp) ; fclose(fp) ; printf("Wrote : %s\n",filename) ; return 0 ; }