public void GenerateChunksWithin(Rect frameDisc, Rect frameCont) { for (float y = frameDisc.y; y < frameDisc.y + frameDisc.height; y++) { for (float x = frameDisc.x; x < frameDisc.x + frameDisc.width; x++) { ChunkTexture chunk = null; if (chunks[((int)y + radiusChunks) * radiusChunks * 2 + ((int)x + radiusChunks)] != null) { chunk = chunks[((int)y + radiusChunks) * radiusChunks * 2 + ((int)x + radiusChunks)]; } else { Vector3 chunkPos = new Vector3(x * GameManager.CHUNK_SIZE, y * GameManager.CHUNK_SIZE, 0f); chunk = (ChunkTexture)Instantiate(chunkTexture, chunkPos, Quaternion.identity); chunk.Init(); chunk.transform.parent = gameObject.transform; // chunk.FillTextureTrans(); chunks[((int)y + radiusChunks) * radiusChunks * 2 + ((int)x + radiusChunks)] = chunk; } Rect chunkBox = new Rect(x, y, 1f, 1f); Rect overlapBox = MathTests.GetOverlappingBox(frameCont, chunkBox); Rect chunkDivBox = GetChunkDivisionBox(chunkBox, overlapBox, div); GenParts(chunk, chunkDivBox); } } }
private void GenerateBatch() { int length = 2; length = (int)Mathf.Min(length, query.Count); List <ChunkTexture> chunkList = new List <ChunkTexture>(); for (int i = 0; i < length; i++) { DictionaryEntry entry = query.Dequeue(); ChunkTexture chunk = (ChunkTexture)entry.Key; Rect pixelsBox = (Rect)entry.Value; chunk.FillTexturePlanet(pixelsBox); chunk.UpdateColliders(pixelsBox); if (!chunkList.Contains(chunk)) { chunkList.Add(chunk); } } foreach (ChunkTexture chunk in chunkList) { chunk.chunkTexture.Apply(); } }
public void ApplyRadial(Vector3 point, float radius) { point = Camera.main.ScreenToWorldPoint(point); Rect dmgBox = new Rect(point.x - radius, point.y - radius, radius * 2, radius * 2f); Rect chunkRange = MathTests.GetOverlappingBox(planetFrame, dmgBox); Rect chunkRangeUnits = MathTests.BoxChunkUnits(chunkRange); Rect chunkRangeUnitsDisc = MathTests.BoxToGrid(chunkRangeUnits); for (float y = chunkRangeUnitsDisc.y; y < chunkRangeUnitsDisc.y + chunkRangeUnitsDisc.height; y++) { for (float x = chunkRangeUnitsDisc.x; x < chunkRangeUnitsDisc.x + chunkRangeUnitsDisc.width; x++) { ChunkTexture chunk = chunks[((int)y + radiusChunks) * radiusChunks * 2 + ((int)x + radiusChunks)]; Rect chunkBox = new Rect(x, y, 1f, 1f); Rect overlapBox = MathTests.GetOverlappingBox(chunkRangeUnits, chunkBox); Rect pixelsBox = GetPixelsBox(chunkBox, overlapBox); chunk.ApplyRadial(point, radius, pixelsBox); chunk.UpdateColliders(pixelsBox); } } }
public void Init() { left = null; up = null; right = null; down = null; chunkData = new byte[GameManager.CHUNK_SIZE * GameManager.CHUNK_SIZE]; colliders = new CircleCollider2D[GameManager.CHUNK_SIZE * GameManager.CHUNK_SIZE]; chunkTexture = new Texture2D(GameManager.CHUNK_SIZE, GameManager.CHUNK_SIZE); chunkTexture.filterMode = FilterMode.Point; meshRenderer = (MeshRenderer)gameObject.AddComponent <MeshRenderer>(); meshRenderer.material = new Material(Shader.Find("Unlit/Transparent")); meshRenderer.material.mainTexture = chunkTexture; meshFilter = (MeshFilter)gameObject.AddComponent <MeshFilter>(); mesh = new Mesh(); List <Vector3> vertices = new List <Vector3>(); List <int> triangles = new List <int>(); List <Vector2> uvs = new List <Vector2>(); vertices.Add(new Vector3(0f, 0f, 0f)); vertices.Add(new Vector3(0f, GameManager.CHUNK_SIZE, 0f)); vertices.Add(new Vector3(GameManager.CHUNK_SIZE, GameManager.CHUNK_SIZE, 0f)); vertices.Add(new Vector3(GameManager.CHUNK_SIZE, 0f, 0f)); triangles.Add(0); triangles.Add(1); triangles.Add(2); triangles.Add(2); triangles.Add(3); triangles.Add(0); uvs.Add(new Vector2(0f, 0f)); uvs.Add(new Vector2(0f, 1f)); uvs.Add(new Vector2(1f, 1f)); uvs.Add(new Vector2(1f, 0f)); mesh.vertices = vertices.ToArray(); mesh.triangles = triangles.ToArray(); mesh.uv = uvs.ToArray(); mesh.RecalculateBounds(); mesh.RecalculateNormals(); mesh.Optimize(); meshFilter.sharedMesh = mesh; }
public void UpdateColliders(Rect frame) { Planet planet = transform.parent.GetComponent <Planet>(); Vector2 chunkCoor = new Vector2(transform.position.x / GameManager.CHUNK_SIZE + planet.radiusChunks, transform.position.y / GameManager.CHUNK_SIZE + planet.radiusChunks); if (chunkCoor.x > 0) { left = planet.chunks[(int)(chunkCoor.y * planet.radiusChunks * 2 + (chunkCoor.x - 1))]; } if (chunkCoor.x < planet.radiusChunks * 2 - 1) { right = planet.chunks[(int)(chunkCoor.y * planet.radiusChunks * 2 + (chunkCoor.x + 1))]; } if (chunkCoor.y > 0) { down = planet.chunks[(int)((chunkCoor.y - 1) * planet.radiusChunks * 2 + (chunkCoor.x))]; } if (chunkCoor.y < planet.radiusChunks * 2 - 1) { up = planet.chunks[(int)((chunkCoor.y + 1) * planet.radiusChunks * 2 + (chunkCoor.x))]; } for (float y = frame.y; y < frame.y + frame.height; y++) { for (float x = frame.x; x < frame.x + frame.width; x++) { int index = (int)(y * GameManager.CHUNK_SIZE + x); if (chunkData[index] > 1 && colliders[index] == null) { ColliderAt(x, y); } else if (chunkData[index] <= 1 && colliders[index] != null) { Destroy(colliders[index]); colliders[index] = null; } } } }
private void GenParts(ChunkTexture chunk, Rect genBox) { int xPos = (int)(chunk.transform.position.x / (GameManager.CHUNK_SIZE / div) + radiusChunks * div); int yPos = (int)(chunk.transform.position.y / (GameManager.CHUNK_SIZE / div) + radiusChunks * div); int pixelsPart = (int)(GameManager.CHUNK_SIZE / div); for (float y = genBox.y; y < genBox.y + genBox.height; y++) { for (float x = genBox.x; x < genBox.x + genBox.width; x++) { int index = (int)((yPos + y) * (radiusChunks * div * 2) + (xPos + x)); if (genChunks[index] == 0) { Rect partPixelsBox = new Rect(x * pixelsPart, y * pixelsPart, pixelsPart, pixelsPart); query.Enqueue(new DictionaryEntry(chunk, partPixelsBox)); genChunks[index] = 1; } } } }