|
|
@@ -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];
|
|
|
+ //// }
|
|
|
+ //// }
|
|
|
+ //// }
|
|
|
+ //// }
|
|
|
+ //// }
|
|
|
+ ////}
|
|
|
}
|