Pārlūkot izejas kodu

Исправлены высоты на стыках квадрантов

Andrey Ushakov 1 nedēļu atpakaļ
vecāks
revīzija
1ae1e1bde3

+ 2 - 2
SpaceCraft.Unity/Assets/_Project/Scenes/Game.unity

@@ -942,8 +942,8 @@ MonoBehaviour:
   m_Name: 
   m_EditorClassIdentifier: '::'
   material: {fileID: 2100000, guid: bdf04b1dd42b18241a6b974938d5e840, type: 2}
-  noiseLevel: 1
-  noiseScale: 1
+  noiseLevel: 0.05
+  noiseScale: 7
 --- !u!33 &1579309478
 MeshFilter:
   m_ObjectHideFlags: 0

+ 154 - 73
SpaceCraft.Unity/Assets/_Project/Scripts/Game/PlaneGenerator.cs

@@ -1,6 +1,9 @@
+using System;
 using System.Collections.Generic;
 using UnityEngine;
 
+using Random = UnityEngine.Random;
+
 public class PlaneGenerator : MonoBehaviour
 {
     public Material material;
@@ -8,7 +11,7 @@ public class PlaneGenerator : MonoBehaviour
     public float noiseLevel = 0.1f;
     public float noiseScale = 0.1f;
 
-    private const int pqsResolution = 8;
+    private const int pqsResolution = 64;
     private const int sphereRadius = 2;
 
     private List<Quad> quads;
@@ -38,48 +41,74 @@ public class PlaneGenerator : MonoBehaviour
         quadY = BuildRootQuad(
             id: 1,
             eulerAngles: new Vector3(0, 0, 0),
-            upperQuad: null, // quadX1,
-            rightQuad: null, // quadZ,
-            lowerQuad: null, // quadX,
-            leftQuad: null); // quadZ1);
-
-        quadZ = BuildRootQuad(
-            id: 3,
-            eulerAngles: new Vector3(-90, 0, 0),
-            upperQuad: null, // quadX,
+            upperQuad: null,
+            getUpperSideNumber: null,
             rightQuad: null,
+            getRightSideNumber: null,
             lowerQuad: null,
-            leftQuad: quadY);
+            getLowerSideNumber: null,
+            leftQuad: null,
+            getLeftSideNumber: null);
 
-        quadZ1 = BuildRootQuad(
-            id: 4,
-            eulerAngles: new Vector3(90, 0, 0),
-            upperQuad: null, // quadX,
-            rightQuad: quadY,
+        quadY1 = BuildRootQuad(
+            id: 2,
+            eulerAngles: new Vector3(180, 0, 0),
+            upperQuad: null,
+            getUpperSideNumber: null,
+            rightQuad: null,
+            getRightSideNumber: null,
             lowerQuad: null,
-            leftQuad: null);
+            getLowerSideNumber: null,
+            leftQuad: null,
+            getLeftSideNumber: null);
 
         quadX = BuildRootQuad(
             id: 5,
             eulerAngles: new Vector3(0, 0, 90),
             upperQuad: quadY,
-            rightQuad: null, // quadZ
-            lowerQuad: null,
-            leftQuad: null); //quadZ1
+            getUpperSideNumber: GetFirstRowNumber,
+            rightQuad: null,
+            getRightSideNumber: null,
+            lowerQuad: quadY1,
+            getLowerSideNumber: GetFirstRowInverseNumber,
+            leftQuad: null,
+            getLeftSideNumber: null);
 
         quadX1 = BuildRootQuad(
             id: 6,
             eulerAngles: new Vector3(0, 0, -90),
-            upperQuad: null,
+            upperQuad: quadY1,
+            getUpperSideNumber: GetLastRowInverseNumber,
             rightQuad: null,
+            getRightSideNumber: null,
             lowerQuad: quadY,
-            leftQuad: null);
+            getLowerSideNumber: GetLastRowNumber,
+            leftQuad: null,
+            getLeftSideNumber: null);
+
+        quadZ = BuildRootQuad(
+            id: 3,
+            eulerAngles: new Vector3(90, 0, 0),
+            upperQuad: quadX1,
+            getUpperSideNumber: GetLastColumnNumber,
+            rightQuad: quadY,
+            getRightSideNumber: GetLastColumnNumber,
+            lowerQuad: quadX,
+            getLowerSideNumber: GetLastColumnInverseNumber,
+            leftQuad: quadY1,
+            getLeftSideNumber: GetLastColumnNumber);
 
-        ////quadY1 = BuildRootQuad(2, new Vector3(180, 0, 0));
-        ////quadZ = BuildRootQuad(3, new Vector3(-90, 0, 0));
-        ////quadZ1 = BuildRootQuad(4, new Vector3(90, 0, 0));
-        ////quadX = BuildRootQuad(5, new Vector3(0, 0, -90));
-        ////quadX1 = BuildRootQuad(6, new Vector3(0, 0, 90));
+        quadZ1 = BuildRootQuad(
+            id: 4,
+            eulerAngles: new Vector3(-90, 0, 0),
+            upperQuad: quadX1,
+            getUpperSideNumber: GetFirstColumnInverseNumber,
+            rightQuad: quadY1,
+            getRightSideNumber: GetFirstColumnNumber,
+            lowerQuad: quadX,
+            getLowerSideNumber: GetFirstColumnNumber,
+            leftQuad: quadY,
+            getLeftSideNumber: GetFirstColumnNumber);
 
         quads = new List<Quad> { quadY, quadY1, quadZ, quadZ1, quadX, quadX1 };
     }
@@ -88,9 +117,13 @@ public class PlaneGenerator : MonoBehaviour
         int id,
         Vector3 eulerAngles,
         Quad? upperQuad,
+        Func<int, int> getUpperSideNumber,
         Quad? rightQuad,
+        Func<int, int> getRightSideNumber,
         Quad? lowerQuad,
-        Quad? leftQuad)
+        Func<int, int> getLowerSideNumber,
+        Quad? leftQuad,
+        Func<int, int> getLeftSideNumber)
     {
         var (vertices, uv) = CreateVertices();
         Rotate(vertices, eulerAngles);
@@ -98,9 +131,13 @@ public class PlaneGenerator : MonoBehaviour
         AddHeights(
             vertices,
             upperQuad,
+            getUpperSideNumber,
             rightQuad,
+            getRightSideNumber,
             lowerQuad,
-            leftQuad);
+            getLowerSideNumber,
+            leftQuad,
+            getLeftSideNumber);
 
         var triangles = CreateTriangles();
 
@@ -247,27 +284,31 @@ public class PlaneGenerator : MonoBehaviour
     private void AddHeights(
         Vector3[] vertices,
         Quad? upperQuad,
+        Func<int, int> getUpperSideNumber,
         Quad? rightQuad,
+        Func<int, int> getRightSideNumber,
         Quad? lowerQuad,
-        Quad? leftQuad)
+        Func<int, int> getLowerSideNumber,
+        Quad? leftQuad,
+        Func<int, int> getLeftSideNumber)
     {
         for (int x = 0, vertex = 0; x <= pqsResolution; x++)
         {
             for (int z = 0; z <= pqsResolution; z++, vertex++)
             {
-                if (x == 0 && lowerQuad?.Vertices != null)
+                if (x == 0 && lowerQuad?.Vertices != null && getLowerSideNumber != null)
                 {
-                    vertices[vertex] = lowerQuad.Value.Vertices[(pqsResolution + 1) * pqsResolution + z]; //+
+                    vertices[vertex] = lowerQuad.Value.Vertices[getLowerSideNumber(z)]; //+
                 }
-                else if (x == pqsResolution && upperQuad?.Vertices != null)
+                else if (x == pqsResolution && upperQuad?.Vertices != null && getUpperSideNumber != null)
                 {
-                    vertices[vertex] = upperQuad.Value.Vertices[z];
+                    vertices[vertex] = upperQuad.Value.Vertices[getUpperSideNumber(z)]; //[z];
                 }
-                else if (z == 0 && rightQuad?.Vertices != null)
+                else if (z == 0 && rightQuad?.Vertices != null && getRightSideNumber != null)
                 {
                     vertices[vertex] = rightQuad.Value.Vertices[(pqsResolution + 1) * (x + 1) - 1]; //+
                 }
-                else if (z == pqsResolution && leftQuad?.Vertices != null)
+                else if (z == pqsResolution && leftQuad?.Vertices != null && getLeftSideNumber != null)
                 {
                     vertices[vertex] = leftQuad.Value.Vertices[x * (pqsResolution + 1)]; //+
                 }
@@ -280,44 +321,84 @@ public class PlaneGenerator : MonoBehaviour
         }
     }
 
-    private void OnDrawGizmos()
+    private int GetFirstColumnNumber(int x)
     {
-        var gizmoSize = 0.05f;
-        if (quads != null)
-        {
-            foreach (var quad in quads)
-            {
-                if (quad.Vertices == null)
-                    continue;
+        return x * (pqsResolution + 1);
+    }
 
-                for (int x = 0, vertex = 0; x <= pqsResolution; x++)
-                {
-                    for (int z = 0; z <= pqsResolution; z++, vertex++)
-                    {
-                        if (x == 0)
-                        {
-                            Gizmos.DrawSphere(quad.Vertices[vertex], gizmoSize);
-                        }
-                        else if (x == pqsResolution)
-                        {
-                            Gizmos.DrawWireSphere(quad.Vertices[vertex], gizmoSize);
-                        }
-                        else if (z == 0)
-                        {
-                            Gizmos.DrawCube(quad.Vertices[vertex], new Vector3(gizmoSize, gizmoSize, gizmoSize));
-                        }
-                        else if (z == pqsResolution)
-                        {
-                            Gizmos.DrawWireCube(quad.Vertices[vertex], new Vector3(gizmoSize, gizmoSize, gizmoSize));
-                        }
-                        else
-                        {
-                            var noise = 1; // 1 + GetNoise(Random.value, Random.value);
-                                           //vertices[vertex] = noise * sphereRadius * vertices[vertex];
-                        }
-                    }
-                }
-            }
-        }
+    private int GetFirstColumnInverseNumber(int x)
+    {
+        return (pqsResolution - x) * (pqsResolution + 1);
     }
+
+    private int GetLastColumnNumber(int x)
+    {
+        return (pqsResolution + 1) * (x + 1) - 1;
+    }
+
+    private int GetLastColumnInverseNumber(int x)
+    {
+        return (pqsResolution + 1) * (pqsResolution - x + 1) - 1;
+    }
+
+    private int GetFirstRowNumber(int x)
+    {
+        return x;
+    }
+
+    private int GetFirstRowInverseNumber(int x)
+    {
+        return pqsResolution - x;
+    }
+
+    private int GetLastRowNumber(int x)
+    {
+        return (pqsResolution + 1) * pqsResolution + x;
+    }
+
+    private int GetLastRowInverseNumber(int x)
+    {
+        return  (pqsResolution + 1) * (pqsResolution + 1) - 1 - x;
+    }
+
+    ////private void OnDrawGizmos()
+    ////{
+    ////    var gizmoSize = 0.05f;
+    ////    if (quads != null)
+    ////    {
+    ////        foreach (var quad in quads)
+    ////        {
+    ////            if (quad.Vertices == null)
+    ////                continue;
+
+    ////            for (int x = 0, vertex = 0; x <= pqsResolution; x++)
+    ////            {
+    ////                for (int z = 0; z <= pqsResolution; z++, vertex++)
+    ////                {
+    ////                    if (x == 0)
+    ////                    {
+    ////                        Gizmos.DrawSphere(quad.Vertices[vertex], gizmoSize);
+    ////                    }
+    ////                    else if (x == pqsResolution)
+    ////                    {
+    ////                        Gizmos.DrawWireSphere(quad.Vertices[vertex], gizmoSize);
+    ////                    }
+    ////                    else if (z == 0)
+    ////                    {
+    ////                        Gizmos.DrawCube(quad.Vertices[vertex], new Vector3(gizmoSize, gizmoSize, gizmoSize));
+    ////                    }
+    ////                    else if (z == pqsResolution)
+    ////                    {
+    ////                        Gizmos.DrawWireCube(quad.Vertices[vertex], new Vector3(gizmoSize, gizmoSize, gizmoSize));
+    ////                    }
+    ////                    else
+    ////                    {
+    ////                        var noise = 1; // 1 + GetNoise(Random.value, Random.value);
+    ////                                       //vertices[vertex] = noise * sphereRadius * vertices[vertex];
+    ////                    }
+    ////                }
+    ////            }
+    ////        }
+    ////    }
+    ////}
 }