Ejemplo n.º 1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="texelX"></param>
        /// <param name="texelY"></param>
        /// <param name="mipLevel"></param>
        /// <returns></returns>
        void SampleMegatextureQ4(TileSamplerCache cache, int texelX, int texelY, int mipLevel, ref Color a, ref Color b, ref Color c)
        {
            int textureSize = VTConfig.TextureSize >> mipLevel;

            texelX = MathUtil.Clamp(0, texelX, textureSize);
            texelY = MathUtil.Clamp(0, texelY, textureSize);

            int pageX = texelX / VTConfig.PageSize;
            int pageY = texelY / VTConfig.PageSize;
            int x     = texelX % VTConfig.PageSize;
            int y     = texelY % VTConfig.PageSize;
            int pbw   = VTConfig.PageBorderWidth;

            var address = new VTAddress(pageX, pageY, mipLevel);

            cache.LoadImage(address).SampleQ4(x + pbw, y + pbw, ref a, ref b, ref c);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Generates mip levels for all tiles.
        /// </summary>
        /// <param name="buildContext"></param>
        /// <param name="pageTable"></param>
        /// <param name="sourceMipLevel"></param>
        /// <param name="mapStorage"></param>
        void GenerateMipLevels(BuildContext buildContext, VTTextureTable pageTable, int sourceMipLevel, IStorage mapStorage)
        {
            if (sourceMipLevel >= VTConfig.MipCount)
            {
                throw new ArgumentOutOfRangeException("mipLevel");
            }

            //int count   = VTConfig.VirtualPageCount >> sourceMipLevel;
            int sizeB = VTConfig.PageSizeBordered;
            var cache = new TileSamplerCache(mapStorage);

            foreach (var vttex in pageTable.SourceTextures)
            {
                if (!vttex.TilesDirty)
                {
                    continue;
                }

                int startX = RoundDown2(vttex.AddressX, sourceMipLevel);
                int startY = RoundDown2(vttex.AddressY, sourceMipLevel);

                int wTiles = (vttex.Width / VTConfig.PageSize);
                int hTiles = (vttex.Width / VTConfig.PageSize);

                int endExX = RoundUp2(vttex.AddressX + wTiles, sourceMipLevel);
                int endExY = RoundUp2(vttex.AddressY + hTiles, sourceMipLevel);

                for (int pageX = startX; pageX < endExX; pageX += 2)
                {
                    for (int pageY = startY; pageY < endExY; pageY += 2)
                    {
                        var address00 = new VTAddress(pageX + 0, pageY + 0, sourceMipLevel);
                        var address01 = new VTAddress(pageX + 0, pageY + 1, sourceMipLevel);
                        var address10 = new VTAddress(pageX + 1, pageY + 0, sourceMipLevel);
                        var address11 = new VTAddress(pageX + 1, pageY + 1, sourceMipLevel);

                        //	there are no images touching target mip-level.
                        //	NOTE: we can skip images that are touched by border.
                        //if ( !pageTable.IsAnyExists( address00, address01, address10, address11 ) ) {
                        //	continue;
                        //}

                        var address = new VTAddress(pageX / 2, pageY / 2, sourceMipLevel + 1);

                        var tile = new VTTile(address);

                        var offsetX = (pageX) * VTConfig.PageSize;
                        var offsetY = (pageY) * VTConfig.PageSize;
                        var border  = VTConfig.PageBorderWidth;

                        var colorValue    = Color.Zero;
                        var normalValue   = Color.Zero;
                        var specularValue = Color.Zero;

                        for (int x = 0; x < sizeB; x++)
                        {
                            for (int y = 0; y < sizeB; y++)
                            {
                                int srcX = offsetX + x * 2 - border * 2;
                                int srcY = offsetY + y * 2 - border * 2;

                                SampleMegatextureQ4(cache, srcX, srcY, sourceMipLevel, ref colorValue, ref normalValue, ref specularValue);

                                tile.SetValues(x, y, ref colorValue, ref normalValue, ref specularValue);
                            }
                        }

                        pageTable.SaveTile(address, mapStorage, tile);
                    }
                }
            }
        }