ChunkManager::ChunkManager(void) { std::thread chunkLoadThread(&ChunkManager::chunkLoaderThread, this); chunkLoadThread.detach(); AABB unitBox(vec(-1000,-1000,-1000), vec(1000,1000,1000)); boost::shared_ptr<Chunk> pChunk = boost::make_shared<Chunk>(unitBox, 1, this); pChunk->generateTerrain(); pChunk->generateMesh(); m_pOctTree.reset(new ChunkTree(nullptr, nullptr, pChunk, 1, cube::corner_t::get(0, 0, 0))); pChunk->m_pTree = m_pOctTree.get(); m_pOctTree->split(); for(auto& corner : cube::corner_t::all()) { initTree1(m_pOctTree->getChild(corner)); m_visibles.insert(m_pOctTree->getChild(corner).getValue()); } updateVisibles(*m_pOctTree); }
Mesh item3DImage(TextureDescriptor td, float thickness) { assert(td); assert(td.maxU <= 1 && td.minU >= 0 && td.maxV <= 1 && td.minV >= 0); Image image = td.image; unsigned iw = image.width(); unsigned ih = image.height(); float fMinX = iw * td.minU; float fMaxX = iw * td.maxU; float fMinY = ih * (1 - td.maxV); float fMaxY = ih * (1 - td.minV); int minX = ifloor(1e-5f + fMinX); int maxX = ifloor(-1e-5f + fMaxX); int minY = ifloor(1e-5f + fMinY); int maxY = ifloor(-1e-5f + fMaxY); assert(minX <= maxX && minY <= maxY); float scale = std::min<float>(1.0f / (1 + maxX - minX), 1.0f / (1 + maxY - minY)); if(thickness <= 0) thickness = scale; TextureDescriptor backTD = td; backTD.maxU = td.minU; backTD.minU = td.maxU; float faceMinX = scale * (fMinX - minX); float faceMinY = scale * (maxY - fMaxY + 1); float faceMaxX = faceMinX + scale * (fMaxX - fMinX); float faceMaxY = faceMinY + scale * (fMaxY - fMinY); Mesh retval = transform(Matrix::translate(faceMinX, faceMinY, -0.5f).concat(Matrix::scale(faceMaxX - faceMinX, faceMaxY - faceMinY, thickness)), unitBox(TextureDescriptor(), TextureDescriptor(), TextureDescriptor(), TextureDescriptor(), backTD, td)); for(int iy = minY; iy <= maxY; iy++) { for(int ix = minX; ix <= maxX; ix++) { bool transparent = isPixelTransparent(image.getPixel(ix, iy)); if(transparent) continue; bool transparentNIX = true, transparentPIX = true, transparentNIY = true, transparentPIY = true; // image transparent for negative and positive image coordinates if(ix > minX) transparentNIX = isPixelTransparent(image.getPixel(ix - 1, iy)); if(ix < maxX) transparentPIX = isPixelTransparent(image.getPixel(ix + 1, iy)); if(iy > minY) transparentNIY = isPixelTransparent(image.getPixel(ix, iy - 1)); if(iy < maxY) transparentPIY = isPixelTransparent(image.getPixel(ix, iy + 1)); float pixelU = (ix + 0.5f) / iw; float pixelV = 1.0f - (iy + 0.5f) / ih; TextureDescriptor pixelTD = TextureDescriptor(image, pixelU, pixelU, pixelV, pixelV); TextureDescriptor nx, px, ny, py; if(transparentNIX) nx = pixelTD; if(transparentPIX) px = pixelTD; if(transparentNIY) py = pixelTD; if(transparentPIY) ny = pixelTD; Matrix tform = Matrix::translate(static_cast<float>(ix - minX), static_cast<float>(maxY - iy), -0.5f).concat(Matrix::scale(scale, scale, thickness)); retval.append(transform(tform, unitBox(nx, px, ny, py, TextureDescriptor(), TextureDescriptor()))); } } return std::move(retval); }