Пример #1
0
        private BlockTileDecorInfo makeBlockTileDecorInfo(TextAsset jsonData, TextAsset atlasData, Texture2D texture)
        {
            BlockTileDecorInfo blockTileDecorInfo = BlockTileDecorInfo.CreateInstance <BlockTileDecorInfo>();
            JObject            parsed             = JObject.Parse(jsonData.text);

            blockTileDecorInfo.sortOrder = parsed["sortOrder"].Value <int>();
            List <BlockTileDecorInfo.Decor> decorList = new List <BlockTileDecorInfo.Decor>();

            foreach (JObject jItem in parsed["decor"]["Array"])
            {
                BlockTileDecorInfo.Decor decor = new BlockTileDecorInfo.Decor();
                decor.name = jItem["name"].Value <string>();
                decor.requiredConnections  = (BlockTileRenderer.Bits)jItem["requiredConnections"].Value <int>();
                decor.forbiddenConnections = (BlockTileRenderer.Bits)jItem["forbiddenConnections"].Value <int>();
                decor.probabilityCutoff    = jItem["probabilityCutoff"].Value <float>();
                decor.sortOrder            = jItem["sortOrder"].Value <int>();
                List <BlockTileDecorInfo.ImageInfo> imageInfoList = new List <BlockTileDecorInfo.ImageInfo>();
                foreach (JObject jImageInfoItem in jItem["variants"]["Array"])
                {
                    BlockTileDecorInfo.ImageInfo imageInfo = new BlockTileDecorInfo.ImageInfo();
                    imageInfo.name   = jImageInfoItem["name"].Value <string>();
                    imageInfo.offset = new Vector3(jImageInfoItem["offset"]["x"].Value <float>(),
                                                   jImageInfoItem["offset"]["y"].Value <float>());
                    imageInfoList.Add(imageInfo);
                }
                decor.variants = imageInfoList.ToArray();
                decorList.Add(decor);
            }
            blockTileDecorInfo.decor = decorList.ToArray();
            TextureAtlas atlas = TextureAtlasHandler.Instance.makeTextureAtlas(atlasData, texture);

            blockTileDecorInfo.atlas = atlas;
            return(blockTileDecorInfo);
        }
Пример #2
0
 private void AddDecor(int x, int y, float z_offset, Bits connection_bits, Color colour, List <Vector3> vertices, List <Vector2> uvs, List <TriangleInfo> triangles, List <Color> colours)
 {
     for (int i = 0; i < decorInfo.decor.Length; i++)
     {
         BlockTileDecorInfo.Decor decor = decorInfo.decor[i];
         if (decor.variants != null && decor.variants.Length != 0)
         {
             bool flag  = (connection_bits & decor.requiredConnections) == decor.requiredConnections;
             bool flag2 = (connection_bits & decor.forbiddenConnections) != (Bits)0;
             if (flag && !flag2)
             {
                 float num = PerlinSimplexNoise.noise((float)(i + x + connection_bits) * simplex_scale.x, (float)(i + y + connection_bits) * simplex_scale.y);
                 if (!(num < decor.probabilityCutoff))
                 {
                     int       num2      = (int)((float)(decor.variants.Length - 1) * num);
                     int       count     = vertices.Count;
                     Vector3   b         = new Vector3((float)x, (float)y, z_offset) + decor.variants[num2].offset;
                     Vector3[] vertices2 = decor.variants[num2].atlasItem.vertices;
                     foreach (Vector3 a in vertices2)
                     {
                         vertices.Add(a + b);
                         colours.Add(colour);
                     }
                     uvs.AddRange(decor.variants[num2].atlasItem.uvs);
                     int[] indices = decor.variants[num2].atlasItem.indices;
                     for (int k = 0; k < indices.Length; k += 3)
                     {
                         triangles.Add(new TriangleInfo
                         {
                             sortOrder = decor.sortOrder,
                             i0        = indices[k] + count,
                             i1        = indices[k + 1] + count,
                             i2        = indices[k + 2] + count
                         });
                     }
                 }
             }
         }
     }
 }
Пример #3
0
        /// <summary>
        /// Generates the vertices for one decor triangle in the mesh.
        /// </summary>
        /// <param name="decor">The decor information to use for rendering.</param>
        /// <param name="x">The bottom left X coordinate.</param>
        /// <param name="y">The bottom left Y coordinate.</param>
        /// <param name="score">The index in the variants list to use for rendering.</param>
        /// <param name="color">The tint color to use when rendering.</param>
        /// <param name="triangles">The current mesh triangle buffer.</param>
        public static void AddDecorVertexInfo(ref BlockTileDecorInfo.Decor decor, int x,
                                              int y, float score, Color color, ICollection <TriangleInfo> triangles)
        {
            var     variants = decor.variants;
            var     vertices = MeshUtil.vertices;
            var     colors   = MeshUtil.colours;
            var     uvs      = MeshUtil.uvs;
            int     index    = (int)((variants.Length - 1) * score);
            var     variant  = variants[index];
            Vector3 offset   = new Vector3(x, y, 0.0f) + variant.offset;

            Vector2[] atlasUVs      = variant.atlasItem.uvs;
            Vector3[] atlasVertices = variant.atlasItem.vertices;
            int[]     atlasIndices  = variant.atlasItem.indices;
            // Copy vertex coordinates with offset
            int n = atlasVertices.Length, order = decor.sortOrder, count = vertices.Count;

            if (n != atlasUVs.Length)
            {
                PUtil.LogError("Atlas UVs and vertices do not match!");
            }
            for (int i = 0; i < n; i++)
            {
                vertices.Add(atlasVertices[i] + offset);
                colors.Add(color);
                uvs.Add(atlasUVs[i]);
            }
            // Generate triangle indexes
            n = atlasIndices.Length;
            for (int i = 0; i < n; i += 3)
            {
                triangles.Add(new TriangleInfo {
                    sortOrder = order,
                    i0        = atlasIndices[i] + count,
                    i1        = atlasIndices[i + 1] + count,
                    i2        = atlasIndices[i + 2] + count
                });
            }
        }