void MapBlock::updateMesh(u32 daynight_ratio) { #if 0 /* DEBUG: If mesh has been generated, don't generate it again */ { JMutexAutoLock meshlock(mesh_mutex); if(mesh != NULL) return; } #endif MeshMakeData data; data.fill(daynight_ratio, this); scene::SMesh *mesh_new = makeMapBlockMesh(&data, m_gamedef); /* Replace the mesh */ replaceMesh(mesh_new); }
void Client::addUpdateMeshTask(v3s16 p, bool ack_to_server) { /*infostream<<"Client::addUpdateMeshTask(): " <<"("<<p.X<<","<<p.Y<<","<<p.Z<<")" <<std::endl;*/ MapBlock *b = m_env.getMap().getBlockNoCreateNoEx(p); if(b == NULL) return; /* Create a task to update the mesh of the block */ MeshMakeData *data = new MeshMakeData; { //TimeTaker timer("data fill"); // Release: ~0ms // Debug: 1-6ms, avg=2ms data->fill(getDayNightRatio(), b); } // Debug wait //while(m_mesh_update_thread.m_queue_in.size() > 0) sleep_ms(10); // Add task to queue m_mesh_update_thread.m_queue_in.addBlock(p, data, ack_to_server); /*infostream<<"Mesh update input queue size is " <<m_mesh_update_thread.m_queue_in.size() <<std::endl;*/ #if 0 // Temporary test: make mesh directly in here { //TimeTaker timer("make mesh"); // 10ms scene::SMesh *mesh_new = NULL; mesh_new = makeMapBlockMesh(data); b->replaceMesh(mesh_new); delete data; } #endif /* Mark mesh as non-expired at this point so that it can already be marked as expired again if the data changes */ b->setMeshExpired(false); }
void * MeshUpdateThread::Thread() { ThreadStarted(); log_register_thread("MeshUpdateThread"); DSTACK(__FUNCTION_NAME); BEGIN_DEBUG_EXCEPTION_HANDLER while(getRun()) { /*// Wait for output queue to flush. // Allow 2 in queue, this makes less frametime jitter. // Umm actually, there is no much difference if(m_queue_out.size() >= 2) { sleep_ms(3); continue; }*/ QueuedMeshUpdate *q = m_queue_in.pop(); if(q == NULL) { sleep_ms(3); continue; } ScopeProfiler sp(g_profiler, "Client: Mesh making"); scene::SMesh *mesh_new = NULL; mesh_new = makeMapBlockMesh(q->data); MeshUpdateResult r; r.p = q->p; r.mesh = mesh_new; r.ack_block_to_server = q->ack_block_to_server; /*infostream<<"MeshUpdateThread: Processed " <<"("<<q->p.X<<","<<q->p.Y<<","<<q->p.Z<<")" <<std::endl;*/ m_queue_out.push_back(r); delete q; } END_DEBUG_EXCEPTION_HANDLER(errorstream) return NULL; }