示例#1
0
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);

}
示例#2
0
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);
}