private MapChunkData _initChunkBuffers(IMapGrid grid, IMapChunk chunk) { var vao = (uint)GL.GenVertexArray(); GL.BindVertexArray(vao); var vboSize = _verticesPerChunk(chunk) * Vertex2D.SizeOf; var eboSize = _indicesPerChunk(chunk) * sizeof(ushort); var vbo = new GLBuffer(this, BufferTarget.ArrayBuffer, BufferUsageHint.DynamicDraw, vboSize, $"Grid {grid.Index} chunk {chunk.Indices} VBO"); var ebo = new GLBuffer(this, BufferTarget.ElementArrayBuffer, BufferUsageHint.DynamicDraw, eboSize, $"Grid {grid.Index} chunk {chunk.Indices} EBO"); ObjectLabelMaybe(ObjectLabelIdentifier.VertexArray, vao, $"Grid {grid.Index} chunk {chunk.Indices} VAO"); // Vertex Coords GL.VertexAttribPointer(0, 2, VertexAttribPointerType.Float, false, Vertex2D.SizeOf, 0); GL.EnableVertexAttribArray(0); // Texture Coords. GL.VertexAttribPointer(1, 2, VertexAttribPointerType.Float, false, Vertex2D.SizeOf, 2 * sizeof(float)); GL.EnableVertexAttribArray(1); // Assign VBO and EBO to VAO. // OpenGL 3.x is such a good API. vbo.Use(); ebo.Use(); var datum = new MapChunkData(vao, vbo, ebo) { Dirty = true }; _mapChunkData[grid.Index].Add(chunk.Indices, datum); return(datum); }
// Start is called before the first frame update void Start() { _sLib = GameObject.FindGameObjectWithTag(Constants.TAG_SPRITE_LIBRARY).GetComponent <SpriteLibraryScript>(); if (_chunkHeightAndWidth % 2 == 0) { _chunkHeightAndWidth++; } _mapChunks = new MapChunkData[_chunkHeightAndWidth, _chunkHeightAndWidth]; _mapChunkControllers = new GameObject[_chunkHeightAndWidth, _chunkHeightAndWidth]; for (int x = 0; x < _chunkHeightAndWidth; x++) { for (int y = 0; y < _chunkHeightAndWidth; y++) { _mapChunks[x, y] = new MapChunkData(x, y); } } for (int x = 0; x < _chunkHeightAndWidth; x++) { for (int y = 0; y < _chunkHeightAndWidth; y++) { var go = Instantiate(_mapChunkPrefab, new Vector3Int(_mapChunks[x, y]._x, _mapChunks[x, y]._y, 0), Quaternion.identity, transform); var chunk = go.GetComponent <MapChunkController>(); chunk._chunkData = _mapChunks[x, y]; _mapChunkControllers[x, y] = go; // Set Borders to spawner chunks if (x == 0 || y == 0 || x == _chunkHeightAndWidth - 1 || y == _chunkHeightAndWidth - 1) { go.GetComponent <SpriteRenderer>().sprite = _sLib.GetChunkSpriteByIndex((int)Enums.MapChunkType.MonsterSpawner); _mapChunks[x, y].SetMapChunkType(Enums.MapChunkType.MonsterSpawner); go.tag = Constants.TAG_SPAWNER_CHUNK; } // Check middle chunk to player start else if (x == _chunkHeightAndWidth / 2 && y == _chunkHeightAndWidth / 2) { go.GetComponent <SpriteRenderer>().sprite = _sLib.GetChunkSpriteByIndex((int)Enums.MapChunkType.Initial); _mapChunks[x, y].SetMapChunkType(Enums.MapChunkType.Initial); go.tag = Constants.TAG_PLAYER_CHUNK; } else { go.GetComponent <SpriteRenderer>().sprite = _sLib.GetChunkSpriteByIndex((int)Enums.MapChunkType.Empty_Buildable); _mapChunks[x, y].SetMapChunkType(Enums.MapChunkType.Empty_Buildable); } } } }
void SpawnEnemies(MapChunkData chunkData, MapChunk chunk) { var budget = CurrentLevelBudget; if (chunkData.Enemies != null) { while (budget > 0) { var enemy = chunkData.Enemies.Sample(Level, chunkData.Type, budget); if (enemy == null) { Debug.LogWarning("Cant spawn more enemies"); break; } chunk.Spawn(enemy.Prefab); budget -= enemy.BudgetConsume; } } }
public void SpawnNextChunk(MapChunkData chunkData) { if (chunkData == null) { Debug.LogWarningFormat("Chunk is null"); return; } // World-spaced entry position and rotation Vector3 entryPosition; Quaternion entryRotation; if (_lastChunk != null) { entryPosition = _lastChunk.ExitPosition; entryRotation = _lastChunk.ExitRotation; } else { entryPosition = transform.position; entryRotation = transform.rotation; } var pMapChunk = chunkData.Prefab.GetComponent <MapChunk>(); // Instantiate new chunk so that exit of the last chunk matches the entry of the new one // Assuming that prefabs are at zero /* * var chunkObject = Instantiate(chunkData.Prefab, * entryPosition - pMapChunk.EntryPosition, * entryRotation * Quaternion.Inverse(pMapChunk.EntryRotation)); */ var entryOffset = pMapChunk.EntryPosition; var entryRotationOffset = pMapChunk.EntryRotation; var chunkObject = Instantiate(chunkData.Prefab, entryPosition + entryRotation * Quaternion.Inverse(entryRotationOffset) * (-pMapChunk.EntryPosition), entryRotation * Quaternion.Inverse(entryRotationOffset)); var chunk = chunkObject.GetComponent <MapChunk>(); if (chunk == null) { Debug.LogWarning("Failed to instantiate next chunk"); return; } chunk.name = $"Chunk_{_chunksSpawned}"; _lastChunk = chunk; _lastChunkData = chunkData; Debugger.Default.Display("Last chunk position", _lastChunk.transform.position.ToString()); Debugger.Default.DrawCircleSphere(chunk.EntryPosition, 2f, Color.blue, 1000f); Debugger.Default.DrawAxis(chunk.EntryPosition, chunk.EntryRotation, 1000f); Debugger.Default.DrawCircleSphere(chunk.ExitPosition, 2f, Color.red, 1000f); Debugger.Default.DrawAxis(chunk.ExitPosition, chunk.ExitRotation, 1000f); Debugger.Default.DrawCircleSphere(chunk.transform.position, 2f, Color.white, 1000f); Debugger.Default.DrawAxis(chunk.transform.position, chunk.transform.rotation, 1000f); _surface.BuildNavMesh(); SpawnEnemies(_lastChunkData, _lastChunk); _chunksSpawned += 1; }
// Sets chunkdata public void SetChunkData(MapChunkData chunkData) { _chunkData = chunkData; }