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); }
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 }); } } } } } }
/// <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 }); } }