void Client::addUpdateMeshTask(v3s16 p, bool ack_to_server, bool urgent) { 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(this, m_cache_enable_shaders); { //TimeTaker timer("data fill"); // Release: ~0ms // Debug: 1-6ms, avg=2ms data->fill(b); data->setCrack(m_crack_level, m_crack_pos); data->setHighlighted(m_highlighted_pos, m_show_highlighted); data->setSmoothLighting(m_cache_smooth_lighting); } // Add task to queue m_mesh_update_thread.enqueueUpdate(p, data, ack_to_server, urgent); }
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 MeshUpdateQueue::fillDataFromMapBlockCache(QueuedMeshUpdate *q) { MeshMakeData *data = new MeshMakeData(m_client, m_cache_enable_shaders, m_cache_use_tangent_vertices); q->data = data; data->fillBlockDataBegin(q->p); std::time_t t_now = std::time(0); // Collect data for 3*3*3 blocks from cache v3s16 dp; for (dp.X = -1; dp.X <= 1; dp.X++) for (dp.Y = -1; dp.Y <= 1; dp.Y++) for (dp.Z = -1; dp.Z <= 1; dp.Z++) { v3s16 p = q->p + dp; CachedMapBlockData *cached_block = getCachedBlock(p); if (cached_block) { cached_block->refcount_from_queue--; cached_block->last_used_timestamp = t_now; if (cached_block->data) data->fillBlockData(dp, cached_block->data); } } data->setCrack(q->crack_level, q->crack_pos); data->setSmoothLighting(m_cache_smooth_lighting); }
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); }