test mesh
This commit is contained in:
@@ -30,18 +30,18 @@ public class Chunk : MonoBehaviour
|
||||
// Порядок по часовой стрелке, смотрим снаружи
|
||||
static readonly Vector3[][] FaceVerts =
|
||||
{
|
||||
// Top (Y+)
|
||||
// Top (Y+) — нормаль (0,+1,0) ✓
|
||||
new[] { new Vector3(0,1,0), new Vector3(0,1,1), new Vector3(1,1,1), new Vector3(1,1,0) },
|
||||
// Bottom (Y-)
|
||||
// Bottom (Y-) — нормаль (0,-1,0) ✓
|
||||
new[] { new Vector3(0,0,0), new Vector3(1,0,0), new Vector3(1,0,1), new Vector3(0,0,1) },
|
||||
// Front (Z+)
|
||||
new[] { new Vector3(1,0,1), new Vector3(0,0,1), new Vector3(0,1,1), new Vector3(1,1,1) },
|
||||
// Back (Z-)
|
||||
new[] { new Vector3(0,0,0), new Vector3(1,0,0), new Vector3(1,1,0), new Vector3(0,1,0) },
|
||||
// Right (X+)
|
||||
new[] { new Vector3(1,0,0), new Vector3(1,0,1), new Vector3(1,1,1), new Vector3(1,1,0) },
|
||||
// Left (X-)
|
||||
new[] { new Vector3(0,0,1), new Vector3(0,0,0), new Vector3(0,1,0), new Vector3(0,1,1) }
|
||||
// Front (Z+) — нормаль (0,0,+1), исправлен порядок вершин
|
||||
new[] { new Vector3(0,0,1), new Vector3(1,0,1), new Vector3(1,1,1), new Vector3(0,1,1) },
|
||||
// Back (Z-) — нормаль (0,0,-1), исправлен порядок вершин
|
||||
new[] { new Vector3(1,0,0), new Vector3(0,0,0), new Vector3(0,1,0), new Vector3(1,1,0) },
|
||||
// Right (X+) — нормаль (+1,0,0), исправлен порядок вершин
|
||||
new[] { new Vector3(1,0,1), new Vector3(1,0,0), new Vector3(1,1,0), new Vector3(1,1,1) },
|
||||
// Left (X-) — нормаль (-1,0,0), исправлен порядок вершин
|
||||
new[] { new Vector3(0,0,0), new Vector3(0,0,1), new Vector3(0,1,1), new Vector3(0,1,0) }
|
||||
};
|
||||
|
||||
// UV для каждой из 4 вершин грани
|
||||
@@ -63,11 +63,11 @@ public class Chunk : MonoBehaviour
|
||||
_filter.sharedMesh = _mesh;
|
||||
}
|
||||
|
||||
public void Initialise(ChunkData data, Material chunkMaterial)
|
||||
public void Initialise(ChunkData data, Material chunkMaterial, bool buildMesh = true)
|
||||
{
|
||||
Data = data;
|
||||
_renderer.sharedMaterial = chunkMaterial;
|
||||
RebuildMesh();
|
||||
if (buildMesh) RebuildMesh();
|
||||
}
|
||||
|
||||
// ── Публичный API ─────────────────────────────────────────────────────────
|
||||
@@ -92,10 +92,10 @@ public class Chunk : MonoBehaviour
|
||||
{
|
||||
if (Data == null) return;
|
||||
|
||||
var verts = new List<Vector3>();
|
||||
var tris = new List<int>();
|
||||
var uvs = new List<Vector2>(); // UV0: координаты на грани 0-1
|
||||
var texCoord1 = new List<Vector2>(); // UV1: x = индекс в Texture2DArray
|
||||
var verts = new List<Vector3>();
|
||||
var tris = new List<int>();
|
||||
var uvs = new List<Vector2>(); // UV0: координаты на грани 0-1
|
||||
var texCoord1 = new List<Vector2>(); // UV1: x = texIndex, y = face brightness
|
||||
|
||||
for (int x = 0; x < ChunkData.SIZE; x++)
|
||||
for (int y = 0; y < ChunkData.HEIGHT; y++)
|
||||
@@ -114,19 +114,23 @@ public class Chunk : MonoBehaviour
|
||||
// Face culling: пропускаем грань если сосед — твёрдый блок
|
||||
if (HasSolidNeighbour(neighbour)) continue;
|
||||
|
||||
// Индекс текстуры для этой грани
|
||||
int texIndex = f == 0 ? def.topIndex :
|
||||
f == 1 ? def.bottomIndex :
|
||||
def.sideIndex;
|
||||
// Индекс текстуры и яркость грани (Minecraft-стиль)
|
||||
int texIndex = f == 0 ? def.topIndex :
|
||||
f == 1 ? def.bottomIndex :
|
||||
def.sideIndex;
|
||||
float bright = f == 0 ? 1.0f : // top
|
||||
f == 1 ? 0.5f : // bottom
|
||||
0.8f; // sides
|
||||
|
||||
int baseVert = verts.Count;
|
||||
var origin = new Vector3(x, y, z);
|
||||
|
||||
var faceUV = new Vector2(texIndex, bright); // одна аллокация на грань, не на вершину
|
||||
for (int v = 0; v < 4; v++)
|
||||
{
|
||||
verts.Add(origin + FaceVerts[f][v]);
|
||||
uvs.Add(FaceUVs[v]);
|
||||
texCoord1.Add(new Vector2(texIndex, 0));
|
||||
texCoord1.Add(faceUV);
|
||||
}
|
||||
|
||||
// Два треугольника на грань
|
||||
|
||||
Reference in New Issue
Block a user