forked from Unity-Technologies/EntityComponentSystemSamples
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCartesianGridOnCubeGeneratorSystem.cs
More file actions
92 lines (73 loc) · 4.88 KB
/
Copy pathCartesianGridOnCubeGeneratorSystem.cs
File metadata and controls
92 lines (73 loc) · 4.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
using Unity.Collections;
using Unity.Entities;
using Unity.Mathematics;
[RequireMatchingQueriesForUpdate]
public unsafe partial class CartesianGridOnCubeSystemGeneratorSystem : SystemBase
{
protected override void OnUpdate()
{
Dependency.Complete();
Entities.WithStructuralChanges().ForEach((Entity entity, ref CartesianGridOnCubeGenerator cartesianGridOnCubeGenerator, in DynamicBuffer<CartesianGridOnCubeGeneratorFloorPrefab> floorPrefabsBuffer) =>
{
var floorPrefabs = new NativeArray<Entity>(floorPrefabsBuffer.Length, Allocator.Temp);
floorPrefabs.CopyFrom(floorPrefabsBuffer.Reinterpret<Entity>().AsNativeArray());
var wallPrefab = cartesianGridOnCubeGenerator.WallPrefab;
var rowCount = cartesianGridOnCubeGenerator.RowCount;
var wallSProbability = cartesianGridOnCubeGenerator.WallSProbability;
var wallWProbability = cartesianGridOnCubeGenerator.WallWProbability;
var floorPrefabCount = floorPrefabs.Length;
if (floorPrefabCount == 0)
return;
var cx = (rowCount * 0.5f);
var cz = (rowCount * 0.5f);
// 4 bits per grid section (bit:0=N,1=S,2=W,3=E)
// One grid for each face.
var gridWallsSize = 6 * (rowCount * (rowCount + 1) / 2);
var blobBuilder = new BlobBuilder(Allocator.Temp);
ref var cartesianGridOnCubeBlob = ref blobBuilder.ConstructRoot<CartesianGridOnCubeBlob>();
var trailingOffsets = blobBuilder.Allocate(ref cartesianGridOnCubeBlob.TrailingOffsets, 4);
var gridWalls = blobBuilder.Allocate(ref cartesianGridOnCubeBlob.Walls, gridWallsSize);
var faceLocalToWorld = blobBuilder.Allocate(ref cartesianGridOnCubeBlob.FaceLocalToWorld, 6);
var faceWorldToLocal = blobBuilder.Allocate(ref cartesianGridOnCubeBlob.FaceWorldToLocal, 6);
var faceLocalToLocal = blobBuilder.Allocate(ref cartesianGridOnCubeBlob.FaceLocalToLocal, 36);
cartesianGridOnCubeBlob.RowCount = (ushort)rowCount;
CartesianGridGeneratorUtility.FillCubeFaceTransforms(rowCount, (float4x4*)faceLocalToWorld.GetUnsafePtr(), (float4x4*)faceWorldToLocal.GetUnsafePtr(), (float4x4*)faceLocalToLocal.GetUnsafePtr());
for (int faceIndex = 0; faceIndex < 6; faceIndex++)
{
var rowStride = (rowCount + 1) / 2;
var faceStride = rowCount * rowStride;
var faceGridWallsOffset = faceIndex * faceStride;
CartesianGridGeneratorUtility.CreateGridPath(rowCount, rowCount, ((byte*)gridWalls.GetUnsafePtr()) + faceGridWallsOffset, wallSProbability, wallWProbability, false);
// Create visible geometry
for (int y = 0; y < rowCount; y++)
for (int x = 0; x < rowCount; x++)
{
var prefabIndex = (x + y) % floorPrefabCount;
var tx = ((float)x) - cx;
var tz = ((float)y) - cz;
CartesianGridGeneratorUtility.CreateFloorPanel(EntityManager, floorPrefabs[prefabIndex], faceLocalToWorld[faceIndex], tx, tz);
var gridWallsIndex = faceGridWallsOffset + ((y * ((rowCount + 1) / 2)) + (x / 2));
var walls = (gridWalls[gridWallsIndex] >> ((x & 1) * 4)) & 0x0f;
if ((walls & 0x02) != 0) // South wall
CartesianGridGeneratorUtility.CreateWallS(EntityManager, wallPrefab, faceLocalToWorld[faceIndex], tx, tz);
if ((walls & 0x04) != 0) // West wall
CartesianGridGeneratorUtility.CreateWallW(EntityManager, wallPrefab, faceLocalToWorld[faceIndex], tx, tz);
if ((y == (rowCount - 1)) && ((walls & 0x01) != 0)) // North wall
CartesianGridGeneratorUtility.CreateWallS(EntityManager, wallPrefab, faceLocalToWorld[faceIndex], tx, tz + 1.0f);
if ((x == (rowCount - 1)) && ((walls & 0x08) != 0)) // East wall
CartesianGridGeneratorUtility.CreateWallW(EntityManager, wallPrefab, faceLocalToWorld[faceIndex], tx + 1.0f, tz);
}
}
trailingOffsets[0] = new float2(cx + 0.0f, cz + -0.5f); // North
trailingOffsets[1] = new float2(cx + 0.0f, cz + 0.5f); // South
trailingOffsets[2] = new float2(cx + 0.5f, cz + 0.0f); // West
trailingOffsets[3] = new float2(cx + -0.5f, cz + 0.0f); // East
EntityManager.AddComponentData(entity, new CartesianGridOnCube
{
Blob = blobBuilder.CreateBlobAssetReference<CartesianGridOnCubeBlob>(Allocator.Persistent)
});
blobBuilder.Dispose();
EntityManager.RemoveComponent<CartesianGridOnCubeGenerator>(entity);
}).Run();
}
}