本文整理汇总了C++中ChunkList::end方法的典型用法代码示例。如果您正苦于以下问题:C++ ChunkList::end方法的具体用法?C++ ChunkList::end怎么用?C++ ChunkList::end使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ChunkList
的用法示例。
在下文中一共展示了ChunkList::end方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: UpdateChunksThread
void ChunkManager::UpdateChunksThread() {
while (m_updateThreadActive) {
while (m_stepLockEnabled && m_updateStepLock) {
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
ChunkList updateList;
ChunkList rebuildList;
ChunkCoordKeyList addKeyList;
// STEP 1: PUT ALL CREATED CHUNKS IN `UPDATE LIST`
m_chunkMapMutex.lock();
std::map<ChunkCoordKey, Chunk*>::iterator it;
for (it = m_chunkMap.begin(); it != m_chunkMap.end(); ++it) {
Chunk* chunk = it->second;
if (!chunk->IsUnloading()) {
updateList.push_back(chunk);
}
}
m_chunkMapMutex.unlock();
// STEP 2: FIND CHUNKS TO ADD (OR UNLOAD IF THEY'RE TOO FAR)
int numAddedChunks = 0;
const int MAX_NUM_CHUNKS_ADD = 10;
std::sort(updateList.begin(), updateList.end(), Chunk::ClosestToCamera);
for (unsigned int i = 0; i < updateList.size(); ++i) {
Chunk* chunk = updateList[i];
if (chunk) {
glm::vec3 chunkCenter = chunk->GetCenter();
glm::vec3 cameraPos = m_renderer->GetCamera().GetPosition();
float cameraDistance = glm::length(chunkCenter - cameraPos);
if (cameraDistance > m_loadRadius) {
chunk->SetUnloading();
}
else if (numAddedChunks < MAX_NUM_CHUNKS_ADD) {
ChunkCoordKeyList missing = chunk->GetMissingNeighbors();
if (!chunk->IsEmpty()) {
for (ChunkCoordKey key : missing) {
if (std::find(addKeyList.begin(), addKeyList.end(), key) == addKeyList.end()) {
// Here we are calculating the distance of each
// neighbor chunk to decide if we should add it
glm::vec3 chunkCenter = Chunk::GetWorldCenter(key.x, key.y, key.z);
float cameraDistance = glm::length(chunkCenter - cameraPos);
if (cameraDistance <= m_loadRadius && key.y == 0) {
addKeyList.push_back(key);
++numAddedChunks;
}
}
}
}
}
}
}
updateList.clear();
// STEP 3: ADD CHUNKS
for (unsigned int i = 0; i < addKeyList.size(); ++i) {
ChunkCoordKey key = addKeyList[i];
CreateNewChunk(key.x, key.y, key.z);
}
addKeyList.clear();
// STEP 4: CHECK FOR REBUILD CHUNKS
m_chunkMapMutex.lock();
for (it = m_chunkMap.begin(); it != m_chunkMap.end(); ++it) {
Chunk* chunk = it->second;
if (!chunk->IsUnloading() && chunk->NeedsRebuild()) {
rebuildList.push_back(chunk);
}
}
m_chunkMapMutex.unlock();
// STEP 5: REBUILD CHUNKS
int numRebuildChunks = 0;
const int MAX_NUM_CHUNKS_REBUILD = 30;
for (unsigned int i = 0; i < rebuildList.size() && numRebuildChunks < MAX_NUM_CHUNKS_REBUILD; ++i) {
Chunk* chunk = rebuildList[i];
chunk->RebuildMesh();
++numRebuildChunks;
}
rebuildList.clear();
if (m_stepLockEnabled && !m_updateStepLock) {
m_updateStepLock = true;
}
//.........这里部分代码省略.........
示例2: UpdatingChunksThread
void ChunkManager::UpdatingChunksThread()
{
while (m_updateThreadActive)
{
while (m_pPlayer == NULL)
{
#ifdef _WIN32
Sleep(100);
#else
usleep(100000);
#endif
}
while (m_stepLockEnabled == true && m_updateStepLock == true)
{
#ifdef _WIN32
Sleep(100);
#else
usleep(100000);
#endif
}
ChunkList updateChunkList;
ChunkCoordKeysList addChunkList;
ChunkList rebuildChunkList;
ChunkList unloadChunkList;
m_ChunkMapMutexLock.lock();
typedef map<ChunkCoordKeys, Chunk*>::iterator it_type;
for (it_type iterator = m_chunksMap.begin(); iterator != m_chunksMap.end(); iterator++)
{
Chunk* pChunk = iterator->second;
updateChunkList.push_back(pChunk);
}
m_ChunkMapMutexLock.unlock();
// Updating chunks
int numAddedChunks = 0;
int MAX_NUM_CHUNKS_ADD = 10;
sort(updateChunkList.begin(), updateChunkList.end(), Chunk::ClosestToCamera);
for (unsigned int i = 0; i < (int)updateChunkList.size(); i++)
{
Chunk* pChunk = updateChunkList[i];
if (pChunk != NULL)
{
pChunk->Update(0.01f);
int gridX = pChunk->GetGridX();
int gridY = pChunk->GetGridY();
int gridZ = pChunk->GetGridZ();
float xPos = gridX * Chunk::CHUNK_SIZE * Chunk::BLOCK_RENDER_SIZE*2.0f;
float yPos = gridY * Chunk::CHUNK_SIZE * Chunk::BLOCK_RENDER_SIZE*2.0f;
float zPos = gridZ * Chunk::CHUNK_SIZE * Chunk::BLOCK_RENDER_SIZE*2.0f;
vec3 chunkCenter = vec3(xPos, yPos, zPos) + vec3(Chunk::CHUNK_SIZE*Chunk::BLOCK_RENDER_SIZE, Chunk::CHUNK_SIZE*Chunk::BLOCK_RENDER_SIZE, Chunk::CHUNK_SIZE*Chunk::BLOCK_RENDER_SIZE);
vec3 distanceVec = chunkCenter - m_pPlayer->GetCenter();
float lengthValue = length(distanceVec);
if (lengthValue > m_loaderRadius)
{
unloadChunkList.push_back(pChunk);
}
else
{
if (numAddedChunks < MAX_NUM_CHUNKS_ADD)
{
// Check neighbours
if (pChunk->GetNumNeighbours() < 6 && (pChunk->IsEmpty() == false) || (gridY == 0))
{
if (pChunk->GetxMinus() == NULL)
{
ChunkCoordKeys coordKey;
coordKey.x = gridX - 1;
coordKey.y = gridY;
coordKey.z = gridZ;
float xPos = coordKey.x * Chunk::CHUNK_SIZE * Chunk::BLOCK_RENDER_SIZE*2.0f;
float yPos = coordKey.y * Chunk::CHUNK_SIZE * Chunk::BLOCK_RENDER_SIZE*2.0f;
float zPos = coordKey.z * Chunk::CHUNK_SIZE * Chunk::BLOCK_RENDER_SIZE*2.0f;
vec3 chunkCenter = vec3(xPos, yPos, zPos) + vec3(Chunk::CHUNK_SIZE*Chunk::BLOCK_RENDER_SIZE, Chunk::CHUNK_SIZE*Chunk::BLOCK_RENDER_SIZE, Chunk::CHUNK_SIZE*Chunk::BLOCK_RENDER_SIZE);
vec3 distanceVec = chunkCenter - m_pPlayer->GetCenter();
float lengthValue = length(distanceVec);
if (lengthValue <= m_loaderRadius)
{
addChunkList.push_back(coordKey);
numAddedChunks++;
}
}
if (pChunk->GetxPlus() == NULL)
{
ChunkCoordKeys coordKey;
coordKey.x = gridX + 1;
coordKey.y = gridY;
coordKey.z = gridZ;
float xPos = coordKey.x * Chunk::CHUNK_SIZE * Chunk::BLOCK_RENDER_SIZE*2.0f;
float yPos = coordKey.y * Chunk::CHUNK_SIZE * Chunk::BLOCK_RENDER_SIZE*2.0f;
//.........这里部分代码省略.........
示例3: convert
void convert(const std::string& pInFileName, const std::string& pOutFileName) {
ChunkList* root = ChunkReader::loadFile(pInFileName);
for(ChunksResult res = root->get("scene"); res != root->end(); ++res) {
if( res->first != "scene" ) break;
const ChildList& scene = res->second->getChildList();
const std::string title = asStringChild(scene.childAt(0))->value();
cout << "Converting " << title << ": " << endl;
TiXmlDocument doc;
doc.LinkEndChild( new TiXmlDeclaration( "1.0", "", "" ) );
TiXmlElement* level = new TiXmlElement("level");
for(unsigned long childIndex=0; childIndex < scene.count(); ++childIndex) {
const Child* baseChild = scene.childAt(childIndex);
if( baseChild->getType() == CCT_CHILD ) {
const Chunk* chunk = asChunkChild( baseChild )->getChild();
// is chunk an "entity"
if( chunk->getName().getName() == "objectelement" ) {
const ChildList& entity = chunk->getChildList();
// name
const std::string name = asStringChild(entity.childAt(0))->value();
// type
const std::string type = asStringChild(entity.childAt(1))->value();
TiXmlElement* object = new TiXmlElement("entity");
object->SetAttribute("name", name);
object->SetAttribute("type", type);
TiXmlElement* position = new TiXmlElement("position");
TiXmlElement* rotation = new TiXmlElement("rotation");
{
float x=0, y=0, z=0;
if( entity.has("loc") ) {
const CompoundChild* location = asCompoundChild(entity.at("loc")->getChildList().childAt(0));
x = getRealValue(location->at(0));
y = getRealValue(location->at(1));
z = getRealValue(location->at(2));
}
position->SetAttribute("x", asString(x));
position->SetAttribute("y", asString(y));
position->SetAttribute("z", asString(z));
}
{
float x=0, y=0, z=0, w=1;
if( entity.has("orientation") ) {
const CompoundChild* location = asCompoundChild(entity.at("orientation")->getChildList().childAt(0));
x = getRealValue(location->at(0));
y = getRealValue(location->at(1));
z = getRealValue(location->at(2));
w = getRealValue(location->at(3));
}
rotation->SetAttribute("x", asString(x));
rotation->SetAttribute("y", asString(y));
rotation->SetAttribute("z", asString(z));
rotation->SetAttribute("w", asString(w));
}
object->LinkEndChild(position);
object->LinkEndChild(rotation);
level->LinkEndChild(object);
}
}
}
doc.LinkEndChild( level );
const string saveFile = pOutFileName + title + ".lvl";
cout << "Saving to " << saveFile << endl;
doc.SaveFile( saveFile );
}
}