Advertisement
Guest User

Geometry

a guest
Jan 10th, 2012
847
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 28.22 KB | None | 0 0
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using UnityEngine;
  4.  
  5. internal class Geometry
  6. {
  7.     private readonly List<Vector3> _vertices;
  8.     private readonly List<Vector3> _normals;
  9.     private readonly List<Color> _colors;
  10.     private readonly List<Vector2> _uvs;
  11.     private readonly List<int> _triangles;
  12.  
  13.     public Geometry()
  14.     {
  15.         _vertices = new List<Vector3>();
  16.         _normals = new List<Vector3>();
  17.         _colors = new List<Color>();
  18.         _uvs = new List<Vector2>();
  19.         _triangles = new List<int>();
  20.     }
  21.  
  22.     public Geometry(Mesh unityMesh)
  23.     {
  24.         _vertices = new List<Vector3>(unityMesh.vertices);
  25.         _normals = new List<Vector3>(unityMesh.normals);
  26.         _colors = new List<Color>(unityMesh.colors);
  27.         _uvs = new List<Vector2>(unityMesh.uv);
  28.         _triangles = new List<int>(unityMesh.triangles);
  29.     }
  30.  
  31.     public bool IsEmpty()
  32.     {
  33.         return _vertices.Count == 0;
  34.     }
  35.  
  36.     public void Clear()
  37.     {
  38.         _vertices.Clear();
  39.         _normals.Clear();
  40.         _colors.Clear();
  41.         _uvs.Clear();
  42.         _triangles.Clear();
  43.     }
  44.  
  45.     public static Mesh ConvertToUnityMeshWithSubmeshes(List<Geometry> geometries)
  46.     {
  47.         var vertices = new List<Vector3>();
  48.         var uvs = new List<Vector2>();
  49.         var normals = new List<Vector3>();
  50.         var colors = new List<Color>();
  51.         var tangents = new List<Vector4>();
  52.  
  53.         foreach (var geometry in geometries)
  54.         {
  55.             vertices.AddRange(geometry._vertices);
  56.             uvs.AddRange(geometry._uvs);
  57.             normals.AddRange(geometry._normals);
  58.             colors.AddRange(geometry._colors);
  59.             tangents.AddRange(geometry.CalculateTangents());
  60.         }
  61.  
  62.         var mesh = new Mesh
  63.                     {
  64.                         vertices = vertices.ToArray(),
  65.                         uv = uvs.ToArray(),
  66.                         normals = normals.ToArray(),
  67.                         colors = colors.ToArray(),
  68.                         tangents = tangents.ToArray(),
  69.                         subMeshCount = geometries.Count,
  70.                     };
  71.  
  72.         int vertexShift = 0;
  73.         for (int submeshIndex = 0; submeshIndex < geometries.Count; submeshIndex++)
  74.         {
  75.             var geometry = geometries[submeshIndex];
  76.  
  77.             var triangles = geometry._triangles.Select(t => t + vertexShift).ToArray();
  78.             mesh.SetTriangles(triangles, submeshIndex);
  79.  
  80.             vertexShift += geometry._vertices.Count;
  81.         }
  82.  
  83.         return mesh;
  84.     }
  85.  
  86.     public Mesh ConvertToUnityMesh()
  87.     {
  88.         var mesh = new Mesh
  89.                     {
  90.                         vertices = _vertices.ToArray(),
  91.                         triangles = _triangles.ToArray()
  92.                     };
  93.  
  94.         if (_uvs != null)
  95.         {
  96.             mesh.normals = _normals.ToArray();
  97.             mesh.uv = _uvs.ToArray();
  98.             mesh.colors = _colors.ToArray();
  99.             if (_uvs.Count == _vertices.Count)
  100.             {
  101.                 mesh.tangents = CalculateTangents();
  102.             }
  103.         }
  104.  
  105.         return mesh;
  106.     }
  107.  
  108.     public void AppendFace(FaceDirection direction, float x, float y, float z, LightColor c1, LightColor c2, LightColor c3, LightColor c4, float u, float v)
  109.     {
  110.         switch (direction)
  111.         {
  112.             case FaceDirection.Up:
  113.                 AppendUpFace(x, y + 1, z, 1, 1, c1, c2, c3, c4, u, v);
  114.                 break;
  115.             case FaceDirection.Down:
  116.                 AppendDownFace(x, y, z, 1, 1, c1, c2, c3, c4, u, v);
  117.                 break;
  118.             case FaceDirection.North:
  119.                 AppendNorthFace(x, y, z + 1, 1, 1, c1, c2, c3, c4, u, v);
  120.                 break;
  121.             case FaceDirection.South:
  122.                 AppendSouthFace(x, y, z, 1, 1, c1, c2, c3, c4, u, v);
  123.                 break;
  124.             case FaceDirection.East:
  125.                 AppendEastFace(x + 1, y, z, 1, 1, c1, c2, c3, c4, u, v);
  126.                 break;
  127.             case FaceDirection.West:
  128.                 AppendWestFace(x, y, z, 1, 1, c1, c2, c3, c4, u, v);
  129.                 break;
  130.         }
  131.     }
  132.  
  133.     public int AppendGeometry(Vector3 position, Geometry geometry)
  134.     {
  135.         return AppendGeometry(position, geometry._vertices, geometry._normals, geometry._uvs, geometry._colors, geometry._triangles);
  136.     }
  137.  
  138.     /// <param name = "textureShift">Must be between 0 and 0.5</param>
  139.     public void AppendGrassBillboard1(float x, float y, float z, float height, float textureShift, LightColor c1, LightColor c2, LightColor c3, LightColor c4)
  140.     {
  141.         var v1 = _vertices.Count;
  142.         _vertices.Add(new Vector3(x + 0, y + 0, z + 0));
  143.         _vertices.Add(new Vector3(x + 1, y + 0, z + 1));
  144.         _vertices.Add(new Vector3(x + 1, y + height, z + 1));
  145.         _vertices.Add(new Vector3(x + 0, y + height, z + 0));
  146.         var v2 = _vertices.Count;
  147.         _vertices.Add(new Vector3(x + 0, y + 0, z + 1));
  148.         _vertices.Add(new Vector3(x + 1, y + 0, z + 0));
  149.         _vertices.Add(new Vector3(x + 1, y + height, z + 0));
  150.         _vertices.Add(new Vector3(x + 0, y + height, z + 1));
  151.  
  152.         _colors.Add((Color)c1);
  153.         _colors.Add((Color)c3);
  154.         _colors.Add((Color)c3);
  155.         _colors.Add((Color)c1);
  156.         _colors.Add((Color)c4);
  157.         _colors.Add((Color)c2);
  158.         _colors.Add((Color)c2);
  159.         _colors.Add((Color)c4);
  160.  
  161.         _normals.Add(new Vector3(-0.70716f, 0, 0.70716f));
  162.         _normals.Add(new Vector3(-0.70716f, 0, 0.70716f));
  163.         _normals.Add(new Vector3(-0.70716f, 0, 0.70716f));
  164.         _normals.Add(new Vector3(-0.70716f, 0, 0.70716f));
  165.         _normals.Add(new Vector3(0.70716f, 0, 0.70716f));
  166.         _normals.Add(new Vector3(0.70716f, 0, 0.70716f));
  167.         _normals.Add(new Vector3(0.70716f, 0, 0.70716f));
  168.         _normals.Add(new Vector3(0.70716f, 0, 0.70716f));
  169.  
  170.         _uvs.Add(new Vector2(0 + textureShift, 0));
  171.         _uvs.Add(new Vector2(1 + textureShift, 0));
  172.         _uvs.Add(new Vector2(1 + textureShift, 1));
  173.         _uvs.Add(new Vector2(0 + textureShift, 1));
  174.         _uvs.Add(new Vector2(0 + textureShift, 0));
  175.         _uvs.Add(new Vector2(1 + textureShift, 0));
  176.         _uvs.Add(new Vector2(1 + textureShift, 1));
  177.         _uvs.Add(new Vector2(0 + textureShift, 1));
  178.  
  179.         _triangles.Add(v1 + 0);
  180.         _triangles.Add(v1 + 3);
  181.         _triangles.Add(v1 + 2);
  182.         _triangles.Add(v1 + 2);
  183.         _triangles.Add(v1 + 1);
  184.         _triangles.Add(v1 + 0);
  185.         _triangles.Add(v2 + 0);
  186.         _triangles.Add(v2 + 3);
  187.         _triangles.Add(v2 + 2);
  188.         _triangles.Add(v2 + 2);
  189.         _triangles.Add(v2 + 1);
  190.         _triangles.Add(v2 + 0);
  191.     }
  192.  
  193.     /// <param name = "textureShift">Must be between 0 and 0.5</param>
  194.     public void AppendGrassBillboard1ReversedTexture(float x, float y, float z, float height, float textureShift, LightColor c1, LightColor c2, LightColor c3, LightColor c4)
  195.     {
  196.         var v1 = _vertices.Count;
  197.         _vertices.Add(new Vector3(x + 0, y + 0, z + 0));
  198.         _vertices.Add(new Vector3(x + 1, y + 0, z + 1));
  199.         _vertices.Add(new Vector3(x + 1, y + height, z + 1));
  200.         _vertices.Add(new Vector3(x + 0, y + height, z + 0));
  201.         var v2 = _vertices.Count;
  202.         _vertices.Add(new Vector3(x + 0, y + 0, z + 1));
  203.         _vertices.Add(new Vector3(x + 1, y + 0, z + 0));
  204.         _vertices.Add(new Vector3(x + 1, y + height, z + 0));
  205.         _vertices.Add(new Vector3(x + 0, y + height, z + 1));
  206.  
  207.         _colors.Add((Color)c1);
  208.         _colors.Add((Color)c3);
  209.         _colors.Add((Color)c3);
  210.         _colors.Add((Color)c1);
  211.         _colors.Add((Color)c4);
  212.         _colors.Add((Color)c2);
  213.         _colors.Add((Color)c2);
  214.         _colors.Add((Color)c4);
  215.  
  216.         _normals.Add(new Vector3(-0.70716f, 0, 0.70716f));
  217.         _normals.Add(new Vector3(-0.70716f, 0, 0.70716f));
  218.         _normals.Add(new Vector3(-0.70716f, 0, 0.70716f));
  219.         _normals.Add(new Vector3(-0.70716f, 0, 0.70716f));
  220.         _normals.Add(new Vector3(0.70716f, 0, 0.70716f));
  221.         _normals.Add(new Vector3(0.70716f, 0, 0.70716f));
  222.         _normals.Add(new Vector3(0.70716f, 0, 0.70716f));
  223.         _normals.Add(new Vector3(0.70716f, 0, 0.70716f));
  224.  
  225.         _uvs.Add(new Vector2(1 + textureShift, 0));
  226.         _uvs.Add(new Vector2(0 + textureShift, 0));
  227.         _uvs.Add(new Vector2(0 + textureShift, 1));
  228.         _uvs.Add(new Vector2(1 + textureShift, 1));
  229.         _uvs.Add(new Vector2(1 + textureShift, 0));
  230.         _uvs.Add(new Vector2(0 + textureShift, 0));
  231.         _uvs.Add(new Vector2(0 + textureShift, 1));
  232.         _uvs.Add(new Vector2(1 + textureShift, 1));
  233.  
  234.         _triangles.Add(v1 + 0);
  235.         _triangles.Add(v1 + 3);
  236.         _triangles.Add(v1 + 2);
  237.         _triangles.Add(v1 + 2);
  238.         _triangles.Add(v1 + 1);
  239.         _triangles.Add(v1 + 0);
  240.         _triangles.Add(v2 + 0);
  241.         _triangles.Add(v2 + 3);
  242.         _triangles.Add(v2 + 2);
  243.         _triangles.Add(v2 + 2);
  244.         _triangles.Add(v2 + 1);
  245.         _triangles.Add(v2 + 0);
  246.     }
  247.  
  248.     /// <param name = "textureShift">Must be between 0 and 0.5</param>
  249.     public void AppendGrassBillboard2(float x, float y, float z, float height, float textureShift, LightColor color)
  250.     {
  251.         var v1 = _vertices.Count;
  252.         _vertices.Add(new Vector3(x + 0, y + 0, z + .5f));
  253.         _vertices.Add(new Vector3(x + 1, y + 0, z + .5f));
  254.         _vertices.Add(new Vector3(x + 1, y + height, z + .5f));
  255.         _vertices.Add(new Vector3(x + 0, y + height, z + .5f));
  256.         var v2 = _vertices.Count;
  257.         _vertices.Add(new Vector3(x + .5f, y + 0, z + 1));
  258.         _vertices.Add(new Vector3(x + .5f, y + 0, z + 0));
  259.         _vertices.Add(new Vector3(x + .5f, y + height, z + 0));
  260.         _vertices.Add(new Vector3(x + .5f, y + height, z + 1));
  261.  
  262.         _colors.Add((Color)color);
  263.         _colors.Add((Color)color);
  264.         _colors.Add((Color)color);
  265.         _colors.Add((Color)color);
  266.         _colors.Add((Color)color);
  267.         _colors.Add((Color)color);
  268.         _colors.Add((Color)color);
  269.         _colors.Add((Color)color);
  270.  
  271.         _normals.Add(Vector3.forward);
  272.         _normals.Add(Vector3.forward);
  273.         _normals.Add(Vector3.forward);
  274.         _normals.Add(Vector3.forward);
  275.         _normals.Add(Vector3.right);
  276.         _normals.Add(Vector3.right);
  277.         _normals.Add(Vector3.right);
  278.         _normals.Add(Vector3.right);
  279.  
  280.         _uvs.Add(new Vector2(0 + textureShift, 0));
  281.         _uvs.Add(new Vector2(1 + textureShift, 0));
  282.         _uvs.Add(new Vector2(1 + textureShift, 1));
  283.         _uvs.Add(new Vector2(0 + textureShift, 1));
  284.         _uvs.Add(new Vector2(0 + textureShift, 0));
  285.         _uvs.Add(new Vector2(1 + textureShift, 0));
  286.         _uvs.Add(new Vector2(1 + textureShift, 1));
  287.         _uvs.Add(new Vector2(0 + textureShift, 1));
  288.  
  289.         _triangles.Add(v1 + 0);
  290.         _triangles.Add(v1 + 3);
  291.         _triangles.Add(v1 + 2);
  292.         _triangles.Add(v1 + 2);
  293.         _triangles.Add(v1 + 1);
  294.         _triangles.Add(v1 + 0);
  295.         _triangles.Add(v2 + 0);
  296.         _triangles.Add(v2 + 3);
  297.         _triangles.Add(v2 + 2);
  298.         _triangles.Add(v2 + 2);
  299.         _triangles.Add(v2 + 1);
  300.         _triangles.Add(v2 + 0);
  301.     }
  302.  
  303.     /// <param name = "textureShift">Must be between 0 and 0.5</param>
  304.     public void AppendGrassBillboard2ReversedTexture(float x, float y, float z, float height, float textureShift, LightColor color)
  305.     {
  306.         var v1 = _vertices.Count;
  307.         _vertices.Add(new Vector3(x + 0, y + 0, z + .5f));
  308.         _vertices.Add(new Vector3(x + 1, y + 0, z + .5f));
  309.         _vertices.Add(new Vector3(x + 1, y + height, z + .5f));
  310.         _vertices.Add(new Vector3(x + 0, y + height, z + .5f));
  311.         var v2 = _vertices.Count;
  312.         _vertices.Add(new Vector3(x + .5f, y + 0, z + 1));
  313.         _vertices.Add(new Vector3(x + .5f, y + 0, z + 0));
  314.         _vertices.Add(new Vector3(x + .5f, y + height, z + 0));
  315.         _vertices.Add(new Vector3(x + .5f, y + height, z + 1));
  316.  
  317.         _colors.Add((Color)color);
  318.         _colors.Add((Color)color);
  319.         _colors.Add((Color)color);
  320.         _colors.Add((Color)color);
  321.         _colors.Add((Color)color);
  322.         _colors.Add((Color)color);
  323.         _colors.Add((Color)color);
  324.         _colors.Add((Color)color);
  325.  
  326.         _normals.Add(Vector3.forward);
  327.         _normals.Add(Vector3.forward);
  328.         _normals.Add(Vector3.forward);
  329.         _normals.Add(Vector3.forward);
  330.         _normals.Add(Vector3.right);
  331.         _normals.Add(Vector3.right);
  332.         _normals.Add(Vector3.right);
  333.         _normals.Add(Vector3.right);
  334.  
  335.         _uvs.Add(new Vector2(1 + textureShift, 0));
  336.         _uvs.Add(new Vector2(0 + textureShift, 0));
  337.         _uvs.Add(new Vector2(0 + textureShift, 1));
  338.         _uvs.Add(new Vector2(1 + textureShift, 1));
  339.         _uvs.Add(new Vector2(1 + textureShift, 0));
  340.         _uvs.Add(new Vector2(0 + textureShift, 0));
  341.         _uvs.Add(new Vector2(0 + textureShift, 1));
  342.         _uvs.Add(new Vector2(1 + textureShift, 1));
  343.  
  344.         _triangles.Add(v1 + 0);
  345.         _triangles.Add(v1 + 3);
  346.         _triangles.Add(v1 + 2);
  347.         _triangles.Add(v1 + 2);
  348.         _triangles.Add(v1 + 1);
  349.         _triangles.Add(v1 + 0);
  350.         _triangles.Add(v2 + 0);
  351.         _triangles.Add(v2 + 3);
  352.         _triangles.Add(v2 + 2);
  353.         _triangles.Add(v2 + 2);
  354.         _triangles.Add(v2 + 1);
  355.         _triangles.Add(v2 + 0);
  356.     }
  357.  
  358.     #region Upper faces
  359.     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)
  360.     {
  361.         var v = _vertices.Count;
  362.         _vertices.Add(new Vector3(x, y, z));
  363.         _vertices.Add(new Vector3(x + xSize, y, z));
  364.         _vertices.Add(new Vector3(x + xSize, y, z + zSize));
  365.         _vertices.Add(new Vector3(x, y, z + zSize));
  366.  
  367.         _colors.Add((Color)cSW);
  368.         _colors.Add((Color)cSE);
  369.         _colors.Add((Color)cNE);
  370.         _colors.Add((Color)cNW);
  371.  
  372.         _normals.Add(Vector3.up);
  373.         _normals.Add(Vector3.up);
  374.         _normals.Add(Vector3.up);
  375.         _normals.Add(Vector3.up);
  376.  
  377.         _uvs.Add(new Vector2(Low(wx), Low(wz)));
  378.         _uvs.Add(new Vector2(High(wx + xSize), Low(wz)));
  379.         _uvs.Add(new Vector2(High(wx + xSize), High(wz + zSize)));
  380.         _uvs.Add(new Vector2(Low(wx), High(wz + zSize)));
  381.  
  382.         _triangles.Add(v + 0);
  383.         _triangles.Add(v + 3);
  384.         _triangles.Add(v + 2);
  385.         _triangles.Add(v + 2);
  386.         _triangles.Add(v + 1);
  387.         _triangles.Add(v + 0);
  388.     }
  389.  
  390.     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)
  391.     {
  392.         var v = _vertices.Count;
  393.         _vertices.Add(new Vector3(x, ySW, z));
  394.         _vertices.Add(new Vector3(x + 1, ySE, z));
  395.         _vertices.Add(new Vector3(x + 1, yNE, z + 1));
  396.         _vertices.Add(new Vector3(x, yNW, z + 1));
  397.  
  398.         _colors.Add((Color)cSW);
  399.         _colors.Add((Color)cSE);
  400.         _colors.Add((Color)cNE);
  401.         _colors.Add((Color)cNW);
  402.  
  403.         _normals.Add(Vector3.up);
  404.         _normals.Add(Vector3.up);
  405.         _normals.Add(Vector3.up);
  406.         _normals.Add(Vector3.up);
  407.  
  408.         _uvs.Add(new Vector2(Low(wx), Low(wz)));
  409.         _uvs.Add(new Vector2(High(wx + 1), Low(wz)));
  410.         _uvs.Add(new Vector2(High(wx + 1), High(wz + 1)));
  411.         _uvs.Add(new Vector2(Low(wx), High(wz + 1)));
  412.  
  413.         _triangles.Add(v + 0);
  414.         _triangles.Add(v + 3);
  415.         _triangles.Add(v + 2);
  416.         _triangles.Add(v + 2);
  417.         _triangles.Add(v + 1);
  418.         _triangles.Add(v + 0);
  419.     }
  420.  
  421.     public void AppendUpFaceCollider(float x, float y, float z, int xSize, int zSize)
  422.     {
  423.         var v = _vertices.Count;
  424.         _vertices.Add(new Vector3(x, y, z));
  425.         _vertices.Add(new Vector3(x + xSize, y, z));
  426.         _vertices.Add(new Vector3(x + xSize, y, z + zSize));
  427.         _vertices.Add(new Vector3(x, y, z + zSize));
  428.  
  429.         _triangles.Add(v + 0);
  430.         _triangles.Add(v + 3);
  431.         _triangles.Add(v + 2);
  432.         _triangles.Add(v + 2);
  433.         _triangles.Add(v + 1);
  434.         _triangles.Add(v + 0);
  435.     }
  436.     #endregion
  437.  
  438.     #region Lower faces
  439.     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)
  440.     {
  441.         var v = _vertices.Count;
  442.         _vertices.Add(new Vector3(x, y, z));
  443.         _vertices.Add(new Vector3(x + xSize, y, z));
  444.         _vertices.Add(new Vector3(x + xSize, y, z + zSize));
  445.         _vertices.Add(new Vector3(x, y, z + zSize));
  446.  
  447.         _colors.Add((Color)cSW);
  448.         _colors.Add((Color)cSE);
  449.         _colors.Add((Color)cNE);
  450.         _colors.Add((Color)cNW);
  451.  
  452.         _normals.Add(Vector3.up);
  453.         _normals.Add(Vector3.up);
  454.         _normals.Add(Vector3.up);
  455.         _normals.Add(Vector3.up);
  456.  
  457.         _uvs.Add(new Vector2(Low(wx), High(wz)));
  458.         _uvs.Add(new Vector2(High(wx + xSize), High(wz)));
  459.         _uvs.Add(new Vector2(High(wx + xSize), Low(wz - zSize)));
  460.         _uvs.Add(new Vector2(Low(wx), Low(wz - zSize)));
  461.  
  462.         _triangles.Add(v + 0);
  463.         _triangles.Add(v + 1);
  464.         _triangles.Add(v + 2);
  465.         _triangles.Add(v + 2);
  466.         _triangles.Add(v + 3);
  467.         _triangles.Add(v + 0);
  468.     }
  469.  
  470.     public void AppendDownFaceWater(float x, float y, float z, LightColor cSW, LightColor cSE, LightColor cNE, LightColor cNW, float wx, float wz)
  471.     {
  472.         var v = _vertices.Count;
  473.         _vertices.Add(new Vector3(x, y, z));
  474.         _vertices.Add(new Vector3(x + 1, y, z));
  475.         _vertices.Add(new Vector3(x + 1, y, z + 1));
  476.         _vertices.Add(new Vector3(x, y, z + 1));
  477.  
  478.         _colors.Add((Color)cSW);
  479.         _colors.Add((Color)cSE);
  480.         _colors.Add((Color)cNE);
  481.         _colors.Add((Color)cNW);
  482.  
  483.         _normals.Add(Vector3.up);
  484.         _normals.Add(Vector3.up);
  485.         _normals.Add(Vector3.up);
  486.         _normals.Add(Vector3.up);
  487.  
  488.         _uvs.Add(new Vector2(Low(wx), High(wz)));
  489.         _uvs.Add(new Vector2(High(wx + 1), High(wz)));
  490.         _uvs.Add(new Vector2(High(wx + 1), Low(wz - 1)));
  491.         _uvs.Add(new Vector2(Low(wx), Low(wz - 1)));
  492.  
  493.         _triangles.Add(v + 0);
  494.         _triangles.Add(v + 1);
  495.         _triangles.Add(v + 2);
  496.         _triangles.Add(v + 2);
  497.         _triangles.Add(v + 3);
  498.         _triangles.Add(v + 0);
  499.     }
  500.  
  501.     public void AppendDownFaceCollider(float x, float y, float z, int xSize, int zSize)
  502.     {
  503.         var v = _vertices.Count;
  504.         _vertices.Add(new Vector3(x, y, z));
  505.         _vertices.Add(new Vector3(x + xSize, y, z));
  506.         _vertices.Add(new Vector3(x + xSize, y, z + zSize));
  507.         _vertices.Add(new Vector3(x, y, z + zSize));
  508.  
  509.         _triangles.Add(v + 0);
  510.         _triangles.Add(v + 1);
  511.         _triangles.Add(v + 2);
  512.         _triangles.Add(v + 2);
  513.         _triangles.Add(v + 3);
  514.         _triangles.Add(v + 0);
  515.     }
  516.     #endregion
  517.  
  518.     #region Northern faces
  519.     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)
  520.     {
  521.         var v = _vertices.Count;
  522.         _vertices.Add(new Vector3(x, y, z));
  523.         _vertices.Add(new Vector3(x + xSize, y, z));
  524.         _vertices.Add(new Vector3(x + xSize, y + ySize, z));
  525.         _vertices.Add(new Vector3(x, y + ySize, z));
  526.  
  527.         _colors.Add((Color)cWD);
  528.         _colors.Add((Color)cED);
  529.         _colors.Add((Color)cEU);
  530.         _colors.Add((Color)cWU);
  531.  
  532.         _normals.Add(Vector3.forward);
  533.         _normals.Add(Vector3.forward);
  534.         _normals.Add(Vector3.forward);
  535.         _normals.Add(Vector3.forward);
  536.  
  537.         _uvs.Add(new Vector2(High(-wx), Low(wy)));
  538.         _uvs.Add(new Vector2(Low(-wx - xSize), Low(wy)));
  539.         _uvs.Add(new Vector2(Low(-wx - xSize), High(wy + ySize)));
  540.         _uvs.Add(new Vector2(High(-wx), High(wy + ySize)));
  541.  
  542.         _triangles.Add(v + 0);
  543.         _triangles.Add(v + 1);
  544.         _triangles.Add(v + 2);
  545.         _triangles.Add(v + 2);
  546.         _triangles.Add(v + 3);
  547.         _triangles.Add(v + 0);
  548.     }
  549.  
  550.     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)
  551.     {
  552.         var v = _vertices.Count;
  553.         _vertices.Add(new Vector3(x, yD, z));
  554.         _vertices.Add(new Vector3(x + 1, yD, z));
  555.         _vertices.Add(new Vector3(x + 1, yUE, z));
  556.         _vertices.Add(new Vector3(x, yUW, z));
  557.  
  558.         _colors.Add((Color)cWD);
  559.         _colors.Add((Color)cED);
  560.         _colors.Add((Color)cEU);
  561.         _colors.Add((Color)cWU);
  562.  
  563.         _normals.Add(Vector3.forward);
  564.         _normals.Add(Vector3.forward);
  565.         _normals.Add(Vector3.forward);
  566.         _normals.Add(Vector3.forward);
  567.  
  568.         _uvs.Add(new Vector2(High(-wx), Low(wy)));
  569.         _uvs.Add(new Vector2(Low(-wx - 1), Low(wy)));
  570.         _uvs.Add(new Vector2(Low(-wx - 1), High(wy + 1)));
  571.         _uvs.Add(new Vector2(High(-wx), High(wy + 1)));
  572.  
  573.         _triangles.Add(v + 0);
  574.         _triangles.Add(v + 1);
  575.         _triangles.Add(v + 2);
  576.         _triangles.Add(v + 2);
  577.         _triangles.Add(v + 3);
  578.         _triangles.Add(v + 0);
  579.     }
  580.  
  581.     public void AppendNorthFaceCollider(float x, float y, float z, int xSize, int ySize)
  582.     {
  583.         var v = _vertices.Count;
  584.         _vertices.Add(new Vector3(x, y, z));
  585.         _vertices.Add(new Vector3(x + xSize, y, z));
  586.         _vertices.Add(new Vector3(x + xSize, y + ySize, z));
  587.         _vertices.Add(new Vector3(x, y + ySize, z));
  588.  
  589.         _triangles.Add(v + 0);
  590.         _triangles.Add(v + 1);
  591.         _triangles.Add(v + 2);
  592.         _triangles.Add(v + 2);
  593.         _triangles.Add(v + 3);
  594.         _triangles.Add(v + 0);
  595.     }
  596.     #endregion
  597.  
  598.     #region Southern faces
  599.     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)
  600.     {
  601.         var v = _vertices.Count;
  602.         _vertices.Add(new Vector3(x, y, z));
  603.         _vertices.Add(new Vector3(x + xSize, y, z));
  604.         _vertices.Add(new Vector3(x + xSize, y + ySize, z));
  605.         _vertices.Add(new Vector3(x, y + ySize, z));
  606.  
  607.         _colors.Add((Color)cWD);
  608.         _colors.Add((Color)cED);
  609.         _colors.Add((Color)cEU);
  610.         _colors.Add((Color)cWU);
  611.  
  612.         _normals.Add(Vector3.back);
  613.         _normals.Add(Vector3.back);
  614.         _normals.Add(Vector3.back);
  615.         _normals.Add(Vector3.back);
  616.  
  617.         _uvs.Add(new Vector2(Low(wx), Low(wy)));
  618.         _uvs.Add(new Vector2(High(wx + xSize), Low(wy)));
  619.         _uvs.Add(new Vector2(High(wx + xSize), High(wy + ySize)));
  620.         _uvs.Add(new Vector2(Low(wx), High(wy + ySize)));
  621.  
  622.         _triangles.Add(v + 0);
  623.         _triangles.Add(v + 3);
  624.         _triangles.Add(v + 2);
  625.         _triangles.Add(v + 2);
  626.         _triangles.Add(v + 1);
  627.         _triangles.Add(v + 0);
  628.     }
  629.  
  630.     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)
  631.     {
  632.         var v = _vertices.Count;
  633.         _vertices.Add(new Vector3(x, yD, z));
  634.         _vertices.Add(new Vector3(x + 1, yD, z));
  635.         _vertices.Add(new Vector3(x + 1, yUE, z));
  636.         _vertices.Add(new Vector3(x, yUW, z));
  637.  
  638.         _colors.Add((Color)cWD);
  639.         _colors.Add((Color)cED);
  640.         _colors.Add((Color)cEU);
  641.         _colors.Add((Color)cWU);
  642.  
  643.         _normals.Add(Vector3.back);
  644.         _normals.Add(Vector3.back);
  645.         _normals.Add(Vector3.back);
  646.         _normals.Add(Vector3.back);
  647.  
  648.         _uvs.Add(new Vector2(Low(wx), Low(wy)));
  649.         _uvs.Add(new Vector2(High(wx + 1), Low(wy)));
  650.         _uvs.Add(new Vector2(High(wx + 1), High(wy + 1)));
  651.         _uvs.Add(new Vector2(Low(wx), High(wy + 1)));
  652.  
  653.         _triangles.Add(v + 0);
  654.         _triangles.Add(v + 3);
  655.         _triangles.Add(v + 2);
  656.         _triangles.Add(v + 2);
  657.         _triangles.Add(v + 1);
  658.         _triangles.Add(v + 0);
  659.     }
  660.  
  661.     public void AppendSouthFaceCollider(float x, float y, float z, int xSize, int ySize)
  662.     {
  663.         var v = _vertices.Count;
  664.         _vertices.Add(new Vector3(x, y, z));
  665.         _vertices.Add(new Vector3(x + xSize, y, z));
  666.         _vertices.Add(new Vector3(x + xSize, y + ySize, z));
  667.         _vertices.Add(new Vector3(x, y + ySize, z));
  668.  
  669.         _triangles.Add(v + 0);
  670.         _triangles.Add(v + 3);
  671.         _triangles.Add(v + 2);
  672.         _triangles.Add(v + 2);
  673.         _triangles.Add(v + 1);
  674.         _triangles.Add(v + 0);
  675.     }
  676.     #endregion
  677.  
  678.     #region Western faces
  679.     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)
  680.     {
  681.         var v = _vertices.Count;
  682.         _vertices.Add(new Vector3(x, y, z));
  683.         _vertices.Add(new Vector3(x, y, z + zSize));
  684.         _vertices.Add(new Vector3(x, y + ySize, z + zSize));
  685.         _vertices.Add(new Vector3(x, y + ySize, z));
  686.  
  687.         _colors.Add((Color)cSD);
  688.         _colors.Add((Color)cND);
  689.         _colors.Add((Color)cNU);
  690.         _colors.Add((Color)cSU);
  691.  
  692.         _normals.Add(Vector3.left);
  693.         _normals.Add(Vector3.left);
  694.         _normals.Add(Vector3.left);
  695.         _normals.Add(Vector3.left);
  696.  
  697.         _uvs.Add(new Vector2(High(-wz + zSize), Low(wy)));
  698.         _uvs.Add(new Vector2(Low(-wz), Low(wy)));
  699.         _uvs.Add(new Vector2(Low(-wz), High(wy + ySize)));
  700.         _uvs.Add(new Vector2(High(-wz + zSize), High(wy + ySize)));
  701.  
  702.         _triangles.Add(v + 0);
  703.         _triangles.Add(v + 1);
  704.         _triangles.Add(v + 2);
  705.         _triangles.Add(v + 2);
  706.         _triangles.Add(v + 3);
  707.         _triangles.Add(v + 0);
  708.     }
  709.  
  710.     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)
  711.     {
  712.         var v = _vertices.Count;
  713.         _vertices.Add(new Vector3(x, yD, z));
  714.         _vertices.Add(new Vector3(x, yD, z + 1));
  715.         _vertices.Add(new Vector3(x, yUN, z + 1));
  716.         _vertices.Add(new Vector3(x, yUS, z));
  717.  
  718.         _colors.Add((Color)cSD);
  719.         _colors.Add((Color)cND);
  720.         _colors.Add((Color)cNU);
  721.         _colors.Add((Color)cSU);
  722.  
  723.         _normals.Add(Vector3.left);
  724.         _normals.Add(Vector3.left);
  725.         _normals.Add(Vector3.left);
  726.         _normals.Add(Vector3.left);
  727.  
  728.         _uvs.Add(new Vector2(High(-wz + 1), Low(wy)));
  729.         _uvs.Add(new Vector2(Low(-wz), Low(wy)));
  730.         _uvs.Add(new Vector2(Low(-wz), High(wy + 1)));
  731.         _uvs.Add(new Vector2(High(-wz + 1), High(wy + 1)));
  732.  
  733.         _triangles.Add(v + 0);
  734.         _triangles.Add(v + 1);
  735.         _triangles.Add(v + 2);
  736.         _triangles.Add(v + 2);
  737.         _triangles.Add(v + 3);
  738.         _triangles.Add(v + 0);
  739.     }
  740.  
  741.     public void AppendWestFaceCollider(float x, float y, float z, int ySize, int zSize)
  742.     {
  743.         var v = _vertices.Count;
  744.         _vertices.Add(new Vector3(x, y, z));
  745.         _vertices.Add(new Vector3(x, y, z + zSize));
  746.         _vertices.Add(new Vector3(x, y + ySize, z + zSize));
  747.         _vertices.Add(new Vector3(x, y + ySize, z));
  748.  
  749.         _triangles.Add(v + 0);
  750.         _triangles.Add(v + 1);
  751.         _triangles.Add(v + 2);
  752.         _triangles.Add(v + 2);
  753.         _triangles.Add(v + 3);
  754.         _triangles.Add(v + 0);
  755.     }
  756.     #endregion
  757.  
  758.     #region Eastern faces
  759.     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)
  760.     {
  761.         var v = _vertices.Count;
  762.         _vertices.Add(new Vector3(x, y, z));
  763.         _vertices.Add(new Vector3(x, y, z + zSize));
  764.         _vertices.Add(new Vector3(x, y + ySize, z + zSize));
  765.         _vertices.Add(new Vector3(x, y + ySize, z));
  766.  
  767.         _colors.Add((Color)cSD);
  768.         _colors.Add((Color)cND);
  769.         _colors.Add((Color)cNU);
  770.         _colors.Add((Color)cSU);
  771.  
  772.         _normals.Add(Vector3.right);
  773.         _normals.Add(Vector3.right);
  774.         _normals.Add(Vector3.right);
  775.         _normals.Add(Vector3.right);
  776.  
  777.         _uvs.Add(new Vector2(Low(wz - zSize), Low(wy)));
  778.         _uvs.Add(new Vector2(High(wz), Low(wy)));
  779.         _uvs.Add(new Vector2(High(wz), High(wy + ySize)));
  780.         _uvs.Add(new Vector2(Low(wz - zSize), High(wy + ySize)));
  781.  
  782.         _triangles.Add(v + 0);
  783.         _triangles.Add(v + 3);
  784.         _triangles.Add(v + 2);
  785.         _triangles.Add(v + 2);
  786.         _triangles.Add(v + 1);
  787.         _triangles.Add(v + 0);
  788.     }
  789.  
  790.     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)
  791.     {
  792.         var v = _vertices.Count;
  793.         _vertices.Add(new Vector3(x, yD, z));
  794.         _vertices.Add(new Vector3(x, yD, z + 1));
  795.         _vertices.Add(new Vector3(x, yUN, z + 1));
  796.         _vertices.Add(new Vector3(x, yUS, z));
  797.  
  798.         _colors.Add((Color)cSD);
  799.         _colors.Add((Color)cND);
  800.         _colors.Add((Color)cNU);
  801.         _colors.Add((Color)cSU);
  802.  
  803.         _normals.Add(Vector3.right);
  804.         _normals.Add(Vector3.right);
  805.         _normals.Add(Vector3.right);
  806.         _normals.Add(Vector3.right);
  807.  
  808.         _uvs.Add(new Vector2(Low(wz - 1), Low(wy)));
  809.         _uvs.Add(new Vector2(High(wz), Low(wy)));
  810.         _uvs.Add(new Vector2(High(wz), High(wy + 1)));
  811.         _uvs.Add(new Vector2(Low(wz - 1), High(wy + 1)));
  812.  
  813.         _triangles.Add(v + 0);
  814.         _triangles.Add(v + 3);
  815.         _triangles.Add(v + 2);
  816.         _triangles.Add(v + 2);
  817.         _triangles.Add(v + 1);
  818.         _triangles.Add(v + 0);
  819.     }
  820.  
  821.     public void AppendEastFaceCollider(float x, float y, float z, int ySize, int zSize)
  822.     {
  823.         var v = _vertices.Count;
  824.         _vertices.Add(new Vector3(x, y, z));
  825.         _vertices.Add(new Vector3(x, y, z + zSize));
  826.         _vertices.Add(new Vector3(x, y + ySize, z + zSize));
  827.         _vertices.Add(new Vector3(x, y + ySize, z));
  828.  
  829.         _triangles.Add(v + 0);
  830.         _triangles.Add(v + 3);
  831.         _triangles.Add(v + 2);
  832.         _triangles.Add(v + 2);
  833.         _triangles.Add(v + 1);
  834.         _triangles.Add(v + 0);
  835.     }
  836.     #endregion
  837.  
  838.     #region Private
  839.  
  840.     private Vector4[] CalculateTangents()
  841.     {
  842.         int triangleCount = _triangles.Count;
  843.         int vertexCount = _vertices.Count;
  844.  
  845.         var tan1 = new Vector3[vertexCount];
  846.         var tan2 = new Vector3[vertexCount];
  847.  
  848.         var tangents = new Vector4[vertexCount];
  849.  
  850.         for (int a = 0; a < triangleCount; a += 3)
  851.         {
  852.             int i1 = _triangles[a + 0];
  853.             int i2 = _triangles[a + 1];
  854.             int i3 = _triangles[a + 2];
  855.  
  856.             var v1 = _vertices[i1];
  857.             var v2 = _vertices[i2];
  858.             var v3 = _vertices[i3];
  859.  
  860.             var w1 = _uvs[i1];
  861.             var w2 = _uvs[i2];
  862.             var w3 = _uvs[i3];
  863.  
  864.             float x1 = v2.x - v1.x;
  865.             float x2 = v3.x - v1.x;
  866.             float y1 = v2.y - v1.y;
  867.             float y2 = v3.y - v1.y;
  868.             float z1 = v2.z - v1.z;
  869.             float z2 = v3.z - v1.z;
  870.  
  871.             float s1 = w2.x - w1.x;
  872.             float s2 = w3.x - w1.x;
  873.             float t1 = w2.y - w1.y;
  874.             float t2 = w3.y - w1.y;
  875.  
  876.             float r = 1.0f / (s1 * t2 - s2 * t1);
  877.  
  878.             var sdir = new Vector3((t2 * x1 - t1 * x2) * r, (t2 * y1 - t1 * y2) * r, (t2 * z1 - t1 * z2) * r);
  879.             var tdir = new Vector3((s1 * x2 - s2 * x1) * r, (s1 * y2 - s2 * y1) * r, (s1 * z2 - s2 * z1) * r);
  880.  
  881.             tan1[i1] += sdir;
  882.             tan1[i2] += sdir;
  883.             tan1[i3] += sdir;
  884.  
  885.             tan2[i1] += tdir;
  886.             tan2[i2] += tdir;
  887.             tan2[i3] += tdir;
  888.         }
  889.  
  890.  
  891.         for (int a = 0; a < vertexCount; ++a)
  892.         {
  893.             var n = _normals[a];
  894.             var t = tan1[a];
  895.  
  896.             var tmp = (t - n * Vector3.Dot(n, t)).normalized;
  897.             tangents[a] = new Vector4(tmp.x, tmp.y, tmp.z);
  898.             tangents[a].w = Vector3.Dot(Vector3.Cross(n, t), tan2[a]) < 0.0f ? -1.0f : 1.0f;
  899.         }
  900.  
  901.         return tangents;
  902.     }
  903.  
  904.     private int AppendGeometry(Vector3 position, IEnumerable<Vector3> vertices, IEnumerable<Vector3> normals, IEnumerable<Vector2> uvs, IEnumerable<Color> colors, IEnumerable<int> triangles)
  905.     {
  906.         var v = _vertices.Count;
  907.  
  908.         foreach (var vertex in vertices)
  909.         {
  910.             _vertices.Add(position + vertex);
  911.         }
  912.  
  913.         _colors.AddRange(colors);
  914.         _normals.AddRange(normals);
  915.         _uvs.AddRange(uvs);
  916.  
  917.         foreach (var triangle in triangles)
  918.         {
  919.             _triangles.Add(v + triangle);
  920.         }
  921.  
  922.         return v;
  923.     }
  924.  
  925.     private const float LIMIT = 4;
  926.  
  927.     private static float Low(float a)
  928.     {
  929.         return (a + 65536) % LIMIT;
  930.     }
  931.  
  932.     private static float High(float a)
  933.     {
  934.         var b = (a + 65536) % LIMIT;
  935.         if (b < .0001f)
  936.         {
  937.             return LIMIT;
  938.         }
  939.         return b;
  940.     }
  941.  
  942.     #endregion
  943. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement