Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections.Generic;
- using System.Linq;
- using UnityEngine;
- internal class Geometry
- {
- private readonly List<Vector3> _vertices;
- private readonly List<Vector3> _normals;
- private readonly List<Color> _colors;
- private readonly List<Vector2> _uvs;
- private readonly List<int> _triangles;
- public Geometry()
- {
- _vertices = new List<Vector3>();
- _normals = new List<Vector3>();
- _colors = new List<Color>();
- _uvs = new List<Vector2>();
- _triangles = new List<int>();
- }
- public Geometry(Mesh unityMesh)
- {
- _vertices = new List<Vector3>(unityMesh.vertices);
- _normals = new List<Vector3>(unityMesh.normals);
- _colors = new List<Color>(unityMesh.colors);
- _uvs = new List<Vector2>(unityMesh.uv);
- _triangles = new List<int>(unityMesh.triangles);
- }
- public bool IsEmpty()
- {
- return _vertices.Count == 0;
- }
- public void Clear()
- {
- _vertices.Clear();
- _normals.Clear();
- _colors.Clear();
- _uvs.Clear();
- _triangles.Clear();
- }
- public static Mesh ConvertToUnityMeshWithSubmeshes(List<Geometry> geometries)
- {
- var vertices = new List<Vector3>();
- var uvs = new List<Vector2>();
- var normals = new List<Vector3>();
- var colors = new List<Color>();
- var tangents = new List<Vector4>();
- foreach (var geometry in geometries)
- {
- vertices.AddRange(geometry._vertices);
- uvs.AddRange(geometry._uvs);
- normals.AddRange(geometry._normals);
- colors.AddRange(geometry._colors);
- tangents.AddRange(geometry.CalculateTangents());
- }
- var mesh = new Mesh
- {
- vertices = vertices.ToArray(),
- uv = uvs.ToArray(),
- normals = normals.ToArray(),
- colors = colors.ToArray(),
- tangents = tangents.ToArray(),
- subMeshCount = geometries.Count,
- };
- int vertexShift = 0;
- for (int submeshIndex = 0; submeshIndex < geometries.Count; submeshIndex++)
- {
- var geometry = geometries[submeshIndex];
- var triangles = geometry._triangles.Select(t => t + vertexShift).ToArray();
- mesh.SetTriangles(triangles, submeshIndex);
- vertexShift += geometry._vertices.Count;
- }
- return mesh;
- }
- public Mesh ConvertToUnityMesh()
- {
- var mesh = new Mesh
- {
- vertices = _vertices.ToArray(),
- triangles = _triangles.ToArray()
- };
- if (_uvs != null)
- {
- mesh.normals = _normals.ToArray();
- mesh.uv = _uvs.ToArray();
- mesh.colors = _colors.ToArray();
- if (_uvs.Count == _vertices.Count)
- {
- mesh.tangents = CalculateTangents();
- }
- }
- return mesh;
- }
- public void AppendFace(FaceDirection direction, float x, float y, float z, LightColor c1, LightColor c2, LightColor c3, LightColor c4, float u, float v)
- {
- switch (direction)
- {
- case FaceDirection.Up:
- AppendUpFace(x, y + 1, z, 1, 1, c1, c2, c3, c4, u, v);
- break;
- case FaceDirection.Down:
- AppendDownFace(x, y, z, 1, 1, c1, c2, c3, c4, u, v);
- break;
- case FaceDirection.North:
- AppendNorthFace(x, y, z + 1, 1, 1, c1, c2, c3, c4, u, v);
- break;
- case FaceDirection.South:
- AppendSouthFace(x, y, z, 1, 1, c1, c2, c3, c4, u, v);
- break;
- case FaceDirection.East:
- AppendEastFace(x + 1, y, z, 1, 1, c1, c2, c3, c4, u, v);
- break;
- case FaceDirection.West:
- AppendWestFace(x, y, z, 1, 1, c1, c2, c3, c4, u, v);
- break;
- }
- }
- public int AppendGeometry(Vector3 position, Geometry geometry)
- {
- return AppendGeometry(position, geometry._vertices, geometry._normals, geometry._uvs, geometry._colors, geometry._triangles);
- }
- /// <param name = "textureShift">Must be between 0 and 0.5</param>
- public void AppendGrassBillboard1(float x, float y, float z, float height, float textureShift, LightColor c1, LightColor c2, LightColor c3, LightColor c4)
- {
- var v1 = _vertices.Count;
- _vertices.Add(new Vector3(x + 0, y + 0, z + 0));
- _vertices.Add(new Vector3(x + 1, y + 0, z + 1));
- _vertices.Add(new Vector3(x + 1, y + height, z + 1));
- _vertices.Add(new Vector3(x + 0, y + height, z + 0));
- var v2 = _vertices.Count;
- _vertices.Add(new Vector3(x + 0, y + 0, z + 1));
- _vertices.Add(new Vector3(x + 1, y + 0, z + 0));
- _vertices.Add(new Vector3(x + 1, y + height, z + 0));
- _vertices.Add(new Vector3(x + 0, y + height, z + 1));
- _colors.Add((Color)c1);
- _colors.Add((Color)c3);
- _colors.Add((Color)c3);
- _colors.Add((Color)c1);
- _colors.Add((Color)c4);
- _colors.Add((Color)c2);
- _colors.Add((Color)c2);
- _colors.Add((Color)c4);
- _normals.Add(new Vector3(-0.70716f, 0, 0.70716f));
- _normals.Add(new Vector3(-0.70716f, 0, 0.70716f));
- _normals.Add(new Vector3(-0.70716f, 0, 0.70716f));
- _normals.Add(new Vector3(-0.70716f, 0, 0.70716f));
- _normals.Add(new Vector3(0.70716f, 0, 0.70716f));
- _normals.Add(new Vector3(0.70716f, 0, 0.70716f));
- _normals.Add(new Vector3(0.70716f, 0, 0.70716f));
- _normals.Add(new Vector3(0.70716f, 0, 0.70716f));
- _uvs.Add(new Vector2(0 + textureShift, 0));
- _uvs.Add(new Vector2(1 + textureShift, 0));
- _uvs.Add(new Vector2(1 + textureShift, 1));
- _uvs.Add(new Vector2(0 + textureShift, 1));
- _uvs.Add(new Vector2(0 + textureShift, 0));
- _uvs.Add(new Vector2(1 + textureShift, 0));
- _uvs.Add(new Vector2(1 + textureShift, 1));
- _uvs.Add(new Vector2(0 + textureShift, 1));
- _triangles.Add(v1 + 0);
- _triangles.Add(v1 + 3);
- _triangles.Add(v1 + 2);
- _triangles.Add(v1 + 2);
- _triangles.Add(v1 + 1);
- _triangles.Add(v1 + 0);
- _triangles.Add(v2 + 0);
- _triangles.Add(v2 + 3);
- _triangles.Add(v2 + 2);
- _triangles.Add(v2 + 2);
- _triangles.Add(v2 + 1);
- _triangles.Add(v2 + 0);
- }
- /// <param name = "textureShift">Must be between 0 and 0.5</param>
- public void AppendGrassBillboard1ReversedTexture(float x, float y, float z, float height, float textureShift, LightColor c1, LightColor c2, LightColor c3, LightColor c4)
- {
- var v1 = _vertices.Count;
- _vertices.Add(new Vector3(x + 0, y + 0, z + 0));
- _vertices.Add(new Vector3(x + 1, y + 0, z + 1));
- _vertices.Add(new Vector3(x + 1, y + height, z + 1));
- _vertices.Add(new Vector3(x + 0, y + height, z + 0));
- var v2 = _vertices.Count;
- _vertices.Add(new Vector3(x + 0, y + 0, z + 1));
- _vertices.Add(new Vector3(x + 1, y + 0, z + 0));
- _vertices.Add(new Vector3(x + 1, y + height, z + 0));
- _vertices.Add(new Vector3(x + 0, y + height, z + 1));
- _colors.Add((Color)c1);
- _colors.Add((Color)c3);
- _colors.Add((Color)c3);
- _colors.Add((Color)c1);
- _colors.Add((Color)c4);
- _colors.Add((Color)c2);
- _colors.Add((Color)c2);
- _colors.Add((Color)c4);
- _normals.Add(new Vector3(-0.70716f, 0, 0.70716f));
- _normals.Add(new Vector3(-0.70716f, 0, 0.70716f));
- _normals.Add(new Vector3(-0.70716f, 0, 0.70716f));
- _normals.Add(new Vector3(-0.70716f, 0, 0.70716f));
- _normals.Add(new Vector3(0.70716f, 0, 0.70716f));
- _normals.Add(new Vector3(0.70716f, 0, 0.70716f));
- _normals.Add(new Vector3(0.70716f, 0, 0.70716f));
- _normals.Add(new Vector3(0.70716f, 0, 0.70716f));
- _uvs.Add(new Vector2(1 + textureShift, 0));
- _uvs.Add(new Vector2(0 + textureShift, 0));
- _uvs.Add(new Vector2(0 + textureShift, 1));
- _uvs.Add(new Vector2(1 + textureShift, 1));
- _uvs.Add(new Vector2(1 + textureShift, 0));
- _uvs.Add(new Vector2(0 + textureShift, 0));
- _uvs.Add(new Vector2(0 + textureShift, 1));
- _uvs.Add(new Vector2(1 + textureShift, 1));
- _triangles.Add(v1 + 0);
- _triangles.Add(v1 + 3);
- _triangles.Add(v1 + 2);
- _triangles.Add(v1 + 2);
- _triangles.Add(v1 + 1);
- _triangles.Add(v1 + 0);
- _triangles.Add(v2 + 0);
- _triangles.Add(v2 + 3);
- _triangles.Add(v2 + 2);
- _triangles.Add(v2 + 2);
- _triangles.Add(v2 + 1);
- _triangles.Add(v2 + 0);
- }
- /// <param name = "textureShift">Must be between 0 and 0.5</param>
- public void AppendGrassBillboard2(float x, float y, float z, float height, float textureShift, LightColor color)
- {
- var v1 = _vertices.Count;
- _vertices.Add(new Vector3(x + 0, y + 0, z + .5f));
- _vertices.Add(new Vector3(x + 1, y + 0, z + .5f));
- _vertices.Add(new Vector3(x + 1, y + height, z + .5f));
- _vertices.Add(new Vector3(x + 0, y + height, z + .5f));
- var v2 = _vertices.Count;
- _vertices.Add(new Vector3(x + .5f, y + 0, z + 1));
- _vertices.Add(new Vector3(x + .5f, y + 0, z + 0));
- _vertices.Add(new Vector3(x + .5f, y + height, z + 0));
- _vertices.Add(new Vector3(x + .5f, y + height, z + 1));
- _colors.Add((Color)color);
- _colors.Add((Color)color);
- _colors.Add((Color)color);
- _colors.Add((Color)color);
- _colors.Add((Color)color);
- _colors.Add((Color)color);
- _colors.Add((Color)color);
- _colors.Add((Color)color);
- _normals.Add(Vector3.forward);
- _normals.Add(Vector3.forward);
- _normals.Add(Vector3.forward);
- _normals.Add(Vector3.forward);
- _normals.Add(Vector3.right);
- _normals.Add(Vector3.right);
- _normals.Add(Vector3.right);
- _normals.Add(Vector3.right);
- _uvs.Add(new Vector2(0 + textureShift, 0));
- _uvs.Add(new Vector2(1 + textureShift, 0));
- _uvs.Add(new Vector2(1 + textureShift, 1));
- _uvs.Add(new Vector2(0 + textureShift, 1));
- _uvs.Add(new Vector2(0 + textureShift, 0));
- _uvs.Add(new Vector2(1 + textureShift, 0));
- _uvs.Add(new Vector2(1 + textureShift, 1));
- _uvs.Add(new Vector2(0 + textureShift, 1));
- _triangles.Add(v1 + 0);
- _triangles.Add(v1 + 3);
- _triangles.Add(v1 + 2);
- _triangles.Add(v1 + 2);
- _triangles.Add(v1 + 1);
- _triangles.Add(v1 + 0);
- _triangles.Add(v2 + 0);
- _triangles.Add(v2 + 3);
- _triangles.Add(v2 + 2);
- _triangles.Add(v2 + 2);
- _triangles.Add(v2 + 1);
- _triangles.Add(v2 + 0);
- }
- /// <param name = "textureShift">Must be between 0 and 0.5</param>
- public void AppendGrassBillboard2ReversedTexture(float x, float y, float z, float height, float textureShift, LightColor color)
- {
- var v1 = _vertices.Count;
- _vertices.Add(new Vector3(x + 0, y + 0, z + .5f));
- _vertices.Add(new Vector3(x + 1, y + 0, z + .5f));
- _vertices.Add(new Vector3(x + 1, y + height, z + .5f));
- _vertices.Add(new Vector3(x + 0, y + height, z + .5f));
- var v2 = _vertices.Count;
- _vertices.Add(new Vector3(x + .5f, y + 0, z + 1));
- _vertices.Add(new Vector3(x + .5f, y + 0, z + 0));
- _vertices.Add(new Vector3(x + .5f, y + height, z + 0));
- _vertices.Add(new Vector3(x + .5f, y + height, z + 1));
- _colors.Add((Color)color);
- _colors.Add((Color)color);
- _colors.Add((Color)color);
- _colors.Add((Color)color);
- _colors.Add((Color)color);
- _colors.Add((Color)color);
- _colors.Add((Color)color);
- _colors.Add((Color)color);
- _normals.Add(Vector3.forward);
- _normals.Add(Vector3.forward);
- _normals.Add(Vector3.forward);
- _normals.Add(Vector3.forward);
- _normals.Add(Vector3.right);
- _normals.Add(Vector3.right);
- _normals.Add(Vector3.right);
- _normals.Add(Vector3.right);
- _uvs.Add(new Vector2(1 + textureShift, 0));
- _uvs.Add(new Vector2(0 + textureShift, 0));
- _uvs.Add(new Vector2(0 + textureShift, 1));
- _uvs.Add(new Vector2(1 + textureShift, 1));
- _uvs.Add(new Vector2(1 + textureShift, 0));
- _uvs.Add(new Vector2(0 + textureShift, 0));
- _uvs.Add(new Vector2(0 + textureShift, 1));
- _uvs.Add(new Vector2(1 + textureShift, 1));
- _triangles.Add(v1 + 0);
- _triangles.Add(v1 + 3);
- _triangles.Add(v1 + 2);
- _triangles.Add(v1 + 2);
- _triangles.Add(v1 + 1);
- _triangles.Add(v1 + 0);
- _triangles.Add(v2 + 0);
- _triangles.Add(v2 + 3);
- _triangles.Add(v2 + 2);
- _triangles.Add(v2 + 2);
- _triangles.Add(v2 + 1);
- _triangles.Add(v2 + 0);
- }
- #region Upper faces
- public void AppendUpFace(float x, float y, float z, int xSize, int zSize, LightColor cSW, LightColor cSE, LightColor cNE, LightColor cNW, float wx, float wz)
- {
- var v = _vertices.Count;
- _vertices.Add(new Vector3(x, y, z));
- _vertices.Add(new Vector3(x + xSize, y, z));
- _vertices.Add(new Vector3(x + xSize, y, z + zSize));
- _vertices.Add(new Vector3(x, y, z + zSize));
- _colors.Add((Color)cSW);
- _colors.Add((Color)cSE);
- _colors.Add((Color)cNE);
- _colors.Add((Color)cNW);
- _normals.Add(Vector3.up);
- _normals.Add(Vector3.up);
- _normals.Add(Vector3.up);
- _normals.Add(Vector3.up);
- _uvs.Add(new Vector2(Low(wx), Low(wz)));
- _uvs.Add(new Vector2(High(wx + xSize), Low(wz)));
- _uvs.Add(new Vector2(High(wx + xSize), High(wz + zSize)));
- _uvs.Add(new Vector2(Low(wx), High(wz + zSize)));
- _triangles.Add(v + 0);
- _triangles.Add(v + 3);
- _triangles.Add(v + 2);
- _triangles.Add(v + 2);
- _triangles.Add(v + 1);
- _triangles.Add(v + 0);
- }
- public void AppendUpFaceWater(float x, float z, float ySW, float ySE, float yNE, float yNW, LightColor cSW, LightColor cSE, LightColor cNE, LightColor cNW, float wx, float wz)
- {
- var v = _vertices.Count;
- _vertices.Add(new Vector3(x, ySW, z));
- _vertices.Add(new Vector3(x + 1, ySE, z));
- _vertices.Add(new Vector3(x + 1, yNE, z + 1));
- _vertices.Add(new Vector3(x, yNW, z + 1));
- _colors.Add((Color)cSW);
- _colors.Add((Color)cSE);
- _colors.Add((Color)cNE);
- _colors.Add((Color)cNW);
- _normals.Add(Vector3.up);
- _normals.Add(Vector3.up);
- _normals.Add(Vector3.up);
- _normals.Add(Vector3.up);
- _uvs.Add(new Vector2(Low(wx), Low(wz)));
- _uvs.Add(new Vector2(High(wx + 1), Low(wz)));
- _uvs.Add(new Vector2(High(wx + 1), High(wz + 1)));
- _uvs.Add(new Vector2(Low(wx), High(wz + 1)));
- _triangles.Add(v + 0);
- _triangles.Add(v + 3);
- _triangles.Add(v + 2);
- _triangles.Add(v + 2);
- _triangles.Add(v + 1);
- _triangles.Add(v + 0);
- }
- public void AppendUpFaceCollider(float x, float y, float z, int xSize, int zSize)
- {
- var v = _vertices.Count;
- _vertices.Add(new Vector3(x, y, z));
- _vertices.Add(new Vector3(x + xSize, y, z));
- _vertices.Add(new Vector3(x + xSize, y, z + zSize));
- _vertices.Add(new Vector3(x, y, z + zSize));
- _triangles.Add(v + 0);
- _triangles.Add(v + 3);
- _triangles.Add(v + 2);
- _triangles.Add(v + 2);
- _triangles.Add(v + 1);
- _triangles.Add(v + 0);
- }
- #endregion
- #region Lower faces
- public void AppendDownFace(float x, float y, float z, int xSize, int zSize, LightColor cSW, LightColor cSE, LightColor cNE, LightColor cNW, float wx, float wz)
- {
- var v = _vertices.Count;
- _vertices.Add(new Vector3(x, y, z));
- _vertices.Add(new Vector3(x + xSize, y, z));
- _vertices.Add(new Vector3(x + xSize, y, z + zSize));
- _vertices.Add(new Vector3(x, y, z + zSize));
- _colors.Add((Color)cSW);
- _colors.Add((Color)cSE);
- _colors.Add((Color)cNE);
- _colors.Add((Color)cNW);
- _normals.Add(Vector3.up);
- _normals.Add(Vector3.up);
- _normals.Add(Vector3.up);
- _normals.Add(Vector3.up);
- _uvs.Add(new Vector2(Low(wx), High(wz)));
- _uvs.Add(new Vector2(High(wx + xSize), High(wz)));
- _uvs.Add(new Vector2(High(wx + xSize), Low(wz - zSize)));
- _uvs.Add(new Vector2(Low(wx), Low(wz - zSize)));
- _triangles.Add(v + 0);
- _triangles.Add(v + 1);
- _triangles.Add(v + 2);
- _triangles.Add(v + 2);
- _triangles.Add(v + 3);
- _triangles.Add(v + 0);
- }
- public void AppendDownFaceWater(float x, float y, float z, LightColor cSW, LightColor cSE, LightColor cNE, LightColor cNW, float wx, float wz)
- {
- var v = _vertices.Count;
- _vertices.Add(new Vector3(x, y, z));
- _vertices.Add(new Vector3(x + 1, y, z));
- _vertices.Add(new Vector3(x + 1, y, z + 1));
- _vertices.Add(new Vector3(x, y, z + 1));
- _colors.Add((Color)cSW);
- _colors.Add((Color)cSE);
- _colors.Add((Color)cNE);
- _colors.Add((Color)cNW);
- _normals.Add(Vector3.up);
- _normals.Add(Vector3.up);
- _normals.Add(Vector3.up);
- _normals.Add(Vector3.up);
- _uvs.Add(new Vector2(Low(wx), High(wz)));
- _uvs.Add(new Vector2(High(wx + 1), High(wz)));
- _uvs.Add(new Vector2(High(wx + 1), Low(wz - 1)));
- _uvs.Add(new Vector2(Low(wx), Low(wz - 1)));
- _triangles.Add(v + 0);
- _triangles.Add(v + 1);
- _triangles.Add(v + 2);
- _triangles.Add(v + 2);
- _triangles.Add(v + 3);
- _triangles.Add(v + 0);
- }
- public void AppendDownFaceCollider(float x, float y, float z, int xSize, int zSize)
- {
- var v = _vertices.Count;
- _vertices.Add(new Vector3(x, y, z));
- _vertices.Add(new Vector3(x + xSize, y, z));
- _vertices.Add(new Vector3(x + xSize, y, z + zSize));
- _vertices.Add(new Vector3(x, y, z + zSize));
- _triangles.Add(v + 0);
- _triangles.Add(v + 1);
- _triangles.Add(v + 2);
- _triangles.Add(v + 2);
- _triangles.Add(v + 3);
- _triangles.Add(v + 0);
- }
- #endregion
- #region Northern faces
- public void AppendNorthFace(float x, float y, float z, int xSize, int ySize, LightColor cWD, LightColor cED, LightColor cEU, LightColor cWU, float wx, float wy)
- {
- var v = _vertices.Count;
- _vertices.Add(new Vector3(x, y, z));
- _vertices.Add(new Vector3(x + xSize, y, z));
- _vertices.Add(new Vector3(x + xSize, y + ySize, z));
- _vertices.Add(new Vector3(x, y + ySize, z));
- _colors.Add((Color)cWD);
- _colors.Add((Color)cED);
- _colors.Add((Color)cEU);
- _colors.Add((Color)cWU);
- _normals.Add(Vector3.forward);
- _normals.Add(Vector3.forward);
- _normals.Add(Vector3.forward);
- _normals.Add(Vector3.forward);
- _uvs.Add(new Vector2(High(-wx), Low(wy)));
- _uvs.Add(new Vector2(Low(-wx - xSize), Low(wy)));
- _uvs.Add(new Vector2(Low(-wx - xSize), High(wy + ySize)));
- _uvs.Add(new Vector2(High(-wx), High(wy + ySize)));
- _triangles.Add(v + 0);
- _triangles.Add(v + 1);
- _triangles.Add(v + 2);
- _triangles.Add(v + 2);
- _triangles.Add(v + 3);
- _triangles.Add(v + 0);
- }
- public void AppendNorthFaceWater(float x, float z, float yD, float yUW, float yUE, LightColor cWD, LightColor cED, LightColor cEU, LightColor cWU, float wx, float wy)
- {
- var v = _vertices.Count;
- _vertices.Add(new Vector3(x, yD, z));
- _vertices.Add(new Vector3(x + 1, yD, z));
- _vertices.Add(new Vector3(x + 1, yUE, z));
- _vertices.Add(new Vector3(x, yUW, z));
- _colors.Add((Color)cWD);
- _colors.Add((Color)cED);
- _colors.Add((Color)cEU);
- _colors.Add((Color)cWU);
- _normals.Add(Vector3.forward);
- _normals.Add(Vector3.forward);
- _normals.Add(Vector3.forward);
- _normals.Add(Vector3.forward);
- _uvs.Add(new Vector2(High(-wx), Low(wy)));
- _uvs.Add(new Vector2(Low(-wx - 1), Low(wy)));
- _uvs.Add(new Vector2(Low(-wx - 1), High(wy + 1)));
- _uvs.Add(new Vector2(High(-wx), High(wy + 1)));
- _triangles.Add(v + 0);
- _triangles.Add(v + 1);
- _triangles.Add(v + 2);
- _triangles.Add(v + 2);
- _triangles.Add(v + 3);
- _triangles.Add(v + 0);
- }
- public void AppendNorthFaceCollider(float x, float y, float z, int xSize, int ySize)
- {
- var v = _vertices.Count;
- _vertices.Add(new Vector3(x, y, z));
- _vertices.Add(new Vector3(x + xSize, y, z));
- _vertices.Add(new Vector3(x + xSize, y + ySize, z));
- _vertices.Add(new Vector3(x, y + ySize, z));
- _triangles.Add(v + 0);
- _triangles.Add(v + 1);
- _triangles.Add(v + 2);
- _triangles.Add(v + 2);
- _triangles.Add(v + 3);
- _triangles.Add(v + 0);
- }
- #endregion
- #region Southern faces
- public void AppendSouthFace(float x, float y, float z, int xSize, int ySize, LightColor cWD, LightColor cED, LightColor cEU, LightColor cWU, float wx, float wy)
- {
- var v = _vertices.Count;
- _vertices.Add(new Vector3(x, y, z));
- _vertices.Add(new Vector3(x + xSize, y, z));
- _vertices.Add(new Vector3(x + xSize, y + ySize, z));
- _vertices.Add(new Vector3(x, y + ySize, z));
- _colors.Add((Color)cWD);
- _colors.Add((Color)cED);
- _colors.Add((Color)cEU);
- _colors.Add((Color)cWU);
- _normals.Add(Vector3.back);
- _normals.Add(Vector3.back);
- _normals.Add(Vector3.back);
- _normals.Add(Vector3.back);
- _uvs.Add(new Vector2(Low(wx), Low(wy)));
- _uvs.Add(new Vector2(High(wx + xSize), Low(wy)));
- _uvs.Add(new Vector2(High(wx + xSize), High(wy + ySize)));
- _uvs.Add(new Vector2(Low(wx), High(wy + ySize)));
- _triangles.Add(v + 0);
- _triangles.Add(v + 3);
- _triangles.Add(v + 2);
- _triangles.Add(v + 2);
- _triangles.Add(v + 1);
- _triangles.Add(v + 0);
- }
- public void AppendSouthFaceWater(float x, float z, float yD, float yUW, float yUE, LightColor cWD, LightColor cED, LightColor cEU, LightColor cWU, float wx, float wy)
- {
- var v = _vertices.Count;
- _vertices.Add(new Vector3(x, yD, z));
- _vertices.Add(new Vector3(x + 1, yD, z));
- _vertices.Add(new Vector3(x + 1, yUE, z));
- _vertices.Add(new Vector3(x, yUW, z));
- _colors.Add((Color)cWD);
- _colors.Add((Color)cED);
- _colors.Add((Color)cEU);
- _colors.Add((Color)cWU);
- _normals.Add(Vector3.back);
- _normals.Add(Vector3.back);
- _normals.Add(Vector3.back);
- _normals.Add(Vector3.back);
- _uvs.Add(new Vector2(Low(wx), Low(wy)));
- _uvs.Add(new Vector2(High(wx + 1), Low(wy)));
- _uvs.Add(new Vector2(High(wx + 1), High(wy + 1)));
- _uvs.Add(new Vector2(Low(wx), High(wy + 1)));
- _triangles.Add(v + 0);
- _triangles.Add(v + 3);
- _triangles.Add(v + 2);
- _triangles.Add(v + 2);
- _triangles.Add(v + 1);
- _triangles.Add(v + 0);
- }
- public void AppendSouthFaceCollider(float x, float y, float z, int xSize, int ySize)
- {
- var v = _vertices.Count;
- _vertices.Add(new Vector3(x, y, z));
- _vertices.Add(new Vector3(x + xSize, y, z));
- _vertices.Add(new Vector3(x + xSize, y + ySize, z));
- _vertices.Add(new Vector3(x, y + ySize, z));
- _triangles.Add(v + 0);
- _triangles.Add(v + 3);
- _triangles.Add(v + 2);
- _triangles.Add(v + 2);
- _triangles.Add(v + 1);
- _triangles.Add(v + 0);
- }
- #endregion
- #region Western faces
- public void AppendWestFace(float x, float y, float z, int ySize, int zSize, LightColor cSD, LightColor cND, LightColor cNU, LightColor cSU, float wy, float wz)
- {
- var v = _vertices.Count;
- _vertices.Add(new Vector3(x, y, z));
- _vertices.Add(new Vector3(x, y, z + zSize));
- _vertices.Add(new Vector3(x, y + ySize, z + zSize));
- _vertices.Add(new Vector3(x, y + ySize, z));
- _colors.Add((Color)cSD);
- _colors.Add((Color)cND);
- _colors.Add((Color)cNU);
- _colors.Add((Color)cSU);
- _normals.Add(Vector3.left);
- _normals.Add(Vector3.left);
- _normals.Add(Vector3.left);
- _normals.Add(Vector3.left);
- _uvs.Add(new Vector2(High(-wz + zSize), Low(wy)));
- _uvs.Add(new Vector2(Low(-wz), Low(wy)));
- _uvs.Add(new Vector2(Low(-wz), High(wy + ySize)));
- _uvs.Add(new Vector2(High(-wz + zSize), High(wy + ySize)));
- _triangles.Add(v + 0);
- _triangles.Add(v + 1);
- _triangles.Add(v + 2);
- _triangles.Add(v + 2);
- _triangles.Add(v + 3);
- _triangles.Add(v + 0);
- }
- public void AppendWestFaceWater(float x, float z, float yD, float yUS, float yUN, LightColor cSD, LightColor cND, LightColor cNU, LightColor cSU, float wy, float wz)
- {
- var v = _vertices.Count;
- _vertices.Add(new Vector3(x, yD, z));
- _vertices.Add(new Vector3(x, yD, z + 1));
- _vertices.Add(new Vector3(x, yUN, z + 1));
- _vertices.Add(new Vector3(x, yUS, z));
- _colors.Add((Color)cSD);
- _colors.Add((Color)cND);
- _colors.Add((Color)cNU);
- _colors.Add((Color)cSU);
- _normals.Add(Vector3.left);
- _normals.Add(Vector3.left);
- _normals.Add(Vector3.left);
- _normals.Add(Vector3.left);
- _uvs.Add(new Vector2(High(-wz + 1), Low(wy)));
- _uvs.Add(new Vector2(Low(-wz), Low(wy)));
- _uvs.Add(new Vector2(Low(-wz), High(wy + 1)));
- _uvs.Add(new Vector2(High(-wz + 1), High(wy + 1)));
- _triangles.Add(v + 0);
- _triangles.Add(v + 1);
- _triangles.Add(v + 2);
- _triangles.Add(v + 2);
- _triangles.Add(v + 3);
- _triangles.Add(v + 0);
- }
- public void AppendWestFaceCollider(float x, float y, float z, int ySize, int zSize)
- {
- var v = _vertices.Count;
- _vertices.Add(new Vector3(x, y, z));
- _vertices.Add(new Vector3(x, y, z + zSize));
- _vertices.Add(new Vector3(x, y + ySize, z + zSize));
- _vertices.Add(new Vector3(x, y + ySize, z));
- _triangles.Add(v + 0);
- _triangles.Add(v + 1);
- _triangles.Add(v + 2);
- _triangles.Add(v + 2);
- _triangles.Add(v + 3);
- _triangles.Add(v + 0);
- }
- #endregion
- #region Eastern faces
- public void AppendEastFace(float x, float y, float z, int ySize, int zSize, LightColor cSD, LightColor cND, LightColor cNU, LightColor cSU, float wy, float wz)
- {
- var v = _vertices.Count;
- _vertices.Add(new Vector3(x, y, z));
- _vertices.Add(new Vector3(x, y, z + zSize));
- _vertices.Add(new Vector3(x, y + ySize, z + zSize));
- _vertices.Add(new Vector3(x, y + ySize, z));
- _colors.Add((Color)cSD);
- _colors.Add((Color)cND);
- _colors.Add((Color)cNU);
- _colors.Add((Color)cSU);
- _normals.Add(Vector3.right);
- _normals.Add(Vector3.right);
- _normals.Add(Vector3.right);
- _normals.Add(Vector3.right);
- _uvs.Add(new Vector2(Low(wz - zSize), Low(wy)));
- _uvs.Add(new Vector2(High(wz), Low(wy)));
- _uvs.Add(new Vector2(High(wz), High(wy + ySize)));
- _uvs.Add(new Vector2(Low(wz - zSize), High(wy + ySize)));
- _triangles.Add(v + 0);
- _triangles.Add(v + 3);
- _triangles.Add(v + 2);
- _triangles.Add(v + 2);
- _triangles.Add(v + 1);
- _triangles.Add(v + 0);
- }
- public void AppendEastFaceWater(float x, float z, float yD, float yUS, float yUN, LightColor cSD, LightColor cND, LightColor cNU, LightColor cSU, float wy, float wz)
- {
- var v = _vertices.Count;
- _vertices.Add(new Vector3(x, yD, z));
- _vertices.Add(new Vector3(x, yD, z + 1));
- _vertices.Add(new Vector3(x, yUN, z + 1));
- _vertices.Add(new Vector3(x, yUS, z));
- _colors.Add((Color)cSD);
- _colors.Add((Color)cND);
- _colors.Add((Color)cNU);
- _colors.Add((Color)cSU);
- _normals.Add(Vector3.right);
- _normals.Add(Vector3.right);
- _normals.Add(Vector3.right);
- _normals.Add(Vector3.right);
- _uvs.Add(new Vector2(Low(wz - 1), Low(wy)));
- _uvs.Add(new Vector2(High(wz), Low(wy)));
- _uvs.Add(new Vector2(High(wz), High(wy + 1)));
- _uvs.Add(new Vector2(Low(wz - 1), High(wy + 1)));
- _triangles.Add(v + 0);
- _triangles.Add(v + 3);
- _triangles.Add(v + 2);
- _triangles.Add(v + 2);
- _triangles.Add(v + 1);
- _triangles.Add(v + 0);
- }
- public void AppendEastFaceCollider(float x, float y, float z, int ySize, int zSize)
- {
- var v = _vertices.Count;
- _vertices.Add(new Vector3(x, y, z));
- _vertices.Add(new Vector3(x, y, z + zSize));
- _vertices.Add(new Vector3(x, y + ySize, z + zSize));
- _vertices.Add(new Vector3(x, y + ySize, z));
- _triangles.Add(v + 0);
- _triangles.Add(v + 3);
- _triangles.Add(v + 2);
- _triangles.Add(v + 2);
- _triangles.Add(v + 1);
- _triangles.Add(v + 0);
- }
- #endregion
- #region Private
- private Vector4[] CalculateTangents()
- {
- int triangleCount = _triangles.Count;
- int vertexCount = _vertices.Count;
- var tan1 = new Vector3[vertexCount];
- var tan2 = new Vector3[vertexCount];
- var tangents = new Vector4[vertexCount];
- for (int a = 0; a < triangleCount; a += 3)
- {
- int i1 = _triangles[a + 0];
- int i2 = _triangles[a + 1];
- int i3 = _triangles[a + 2];
- var v1 = _vertices[i1];
- var v2 = _vertices[i2];
- var v3 = _vertices[i3];
- var w1 = _uvs[i1];
- var w2 = _uvs[i2];
- var w3 = _uvs[i3];
- float x1 = v2.x - v1.x;
- float x2 = v3.x - v1.x;
- float y1 = v2.y - v1.y;
- float y2 = v3.y - v1.y;
- float z1 = v2.z - v1.z;
- float z2 = v3.z - v1.z;
- float s1 = w2.x - w1.x;
- float s2 = w3.x - w1.x;
- float t1 = w2.y - w1.y;
- float t2 = w3.y - w1.y;
- float r = 1.0f / (s1 * t2 - s2 * t1);
- var sdir = new Vector3((t2 * x1 - t1 * x2) * r, (t2 * y1 - t1 * y2) * r, (t2 * z1 - t1 * z2) * r);
- var tdir = new Vector3((s1 * x2 - s2 * x1) * r, (s1 * y2 - s2 * y1) * r, (s1 * z2 - s2 * z1) * r);
- tan1[i1] += sdir;
- tan1[i2] += sdir;
- tan1[i3] += sdir;
- tan2[i1] += tdir;
- tan2[i2] += tdir;
- tan2[i3] += tdir;
- }
- for (int a = 0; a < vertexCount; ++a)
- {
- var n = _normals[a];
- var t = tan1[a];
- var tmp = (t - n * Vector3.Dot(n, t)).normalized;
- tangents[a] = new Vector4(tmp.x, tmp.y, tmp.z);
- tangents[a].w = Vector3.Dot(Vector3.Cross(n, t), tan2[a]) < 0.0f ? -1.0f : 1.0f;
- }
- return tangents;
- }
- private int AppendGeometry(Vector3 position, IEnumerable<Vector3> vertices, IEnumerable<Vector3> normals, IEnumerable<Vector2> uvs, IEnumerable<Color> colors, IEnumerable<int> triangles)
- {
- var v = _vertices.Count;
- foreach (var vertex in vertices)
- {
- _vertices.Add(position + vertex);
- }
- _colors.AddRange(colors);
- _normals.AddRange(normals);
- _uvs.AddRange(uvs);
- foreach (var triangle in triangles)
- {
- _triangles.Add(v + triangle);
- }
- return v;
- }
- private const float LIMIT = 4;
- private static float Low(float a)
- {
- return (a + 65536) % LIMIT;
- }
- private static float High(float a)
- {
- var b = (a + 65536) % LIMIT;
- if (b < .0001f)
- {
- return LIMIT;
- }
- return b;
- }
- #endregion
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement