public PngFile() { Header = new IHDR(); FileMagic = new Magic(new byte[] { 137, 80, 78, 71, 13, 10, 26, 10 }); Data = new PolyChunk(); Data.RegisterType(typeof(PLTE)); Data.RegisterType(typeof(gAMA)); Data.RegisterType(typeof(pHYs)); Data.RegisterType(typeof(tEXt)); Data.RegisterType(typeof(IDAT)); Data.RegisterType(typeof(IEND)); Data.FallbackType = typeof(Unknown); }
protected override void SetChunk(PolyChunk chunk, List <List <Vector3> > chunkList, Vector2 min, Vector2 max, Vector3 pos) { chunk.Init(chunkList, min, max, pos, true); }
protected virtual void SetChunk(PolyChunk chunk, List <List <Vector3> > chunkList, Vector2 min, Vector2 max, Vector3 pos) { chunk.Init(chunkList, min, max, pos, false); }
public void GenerateSplitTerrain() { while (lstMeshObj.Count > 0) { GameObject obj = lstMeshObj[0]; lstMeshObj.RemoveAt(0); DestroyImmediate(obj); } lstMeshFilt.Clear(); lstMeshRend.Clear(); // Set up ranges for each square List <List <Vector4> > lstSquares = new List <List <Vector4> >(); // float prevx = 0f; // float prevy = 0f; int tmpNumPointsX = (int)vNumPoints.x; int tmpNumPointsY = (int)vNumPoints.y; int xMult = tmpNumPointsX / iSplitAxisCount; int yMult = tmpNumPointsY / iSplitAxisCount; for (int x = 0; x < iSplitAxisCount; x++) { lstSquares.Add(new List <Vector4>()); //Debug.Log("Range - " + lstSquares[x][0]); for (int y = 0; y < iSplitAxisCount; y++) { Vector2 xRange = new Vector2(0f, 0f); Vector2 yRange = new Vector2(0f, 0f); xRange.x = xMult * x; if (x >= (iSplitAxisCount - 1)) { // Debug.Log(x + ", " + y + " X"); xRange.y = tmpNumPointsX - 1; xRange.x -= 1; } else { xRange.y = xMult * (x + 1); //prevx = xRange.y; } yRange.x = yMult * y; if (y >= (iSplitAxisCount - 1)) { // Debug.Log(x + ", " + y + " Y"); yRange.y = tmpNumPointsY - 1; yRange.x -= 1; } else { yRange.y = yMult * (y + 1); //prevy = yRange.y; } lstSquares[x].Add(new Vector4((int)xRange.x, (int)xRange.y, (int)yRange.x, (int)yRange.y)); } } // Create meshes for each square for (int sqX = 0; sqX < iSplitAxisCount; sqX++) { for (int sqY = 0; sqY < iSplitAxisCount; sqY++) { int maxX = (int)lstSquares[sqX][sqY].y; int minX = (int)lstSquares[sqX][sqY].x; int maxY = (int)lstSquares[sqX][sqY].w; int minY = (int)lstSquares[sqX][sqY].z; int numPointsX = 1 + maxX - minX; int numPointsY = 1 + maxY - minY; Vector3[] vertices = new Vector3[((numPointsX * numPointsY)) + 0]; Vector2[] uvs = new Vector2[vertices.Length]; int[] triangles = new int[(((numPointsX - 1) * (numPointsY - 1)) * 2 * 3) + 0]; List <List <Vector3> > tmpChunkList = new List <List <Vector3> >(); int currTri = 0; int currVert = 0; GameObject gMeshObj = new GameObject(); PolyChunk chunk = gMeshObj.AddComponent <PolyChunk>(); gMeshObj.transform.parent = this.transform; gMeshObj.transform.localPosition = Vector3.zero; gMeshObj.transform.localScale = Vector3.one; gMeshObj.transform.rotation = this.transform.rotation; gMeshObj.transform.name = "Poly Terrain " + lstMeshObj.Count.ToString(); gMeshObj.layer = this.gameObject.layer; MeshFilter tmpFilt = gMeshObj.AddComponent <MeshFilter>(); MeshRenderer tmpRend = gMeshObj.AddComponent <MeshRenderer>(); MeshCollider tmpCol = gMeshObj.AddComponent <MeshCollider>(); tmpRend.sharedMaterial = meshRenderer.sharedMaterial; Mesh tmpMesh = new Mesh(); tmpMesh.name = gMeshObj.transform.name + " MESH"; // Create mesh for (int x = 0; x < numPointsX; x++) // Generate mesh { tmpChunkList.Add(new List <Vector3>()); for (int y = 0; y < numPointsY; y++) { if (bEditor) { vertices[(y * numPointsX) + x] = lstPoints[x + minX][y + minY].transform.localPosition; } else { vertices[(y * numPointsX) + x] = lstVPoints[x + (minX)][y + (minY)]; tmpChunkList[x].Add(lstVPoints[x + (minX)][y + (minY)]); } uvs[(y * numPointsX) + x].x = x / (numPointsX - 10); uvs[(y * numPointsX) + x].y = y / (numPointsY - 10); if ((x < (numPointsX - 1)) && (y < (numPointsY - 1))) { triangles[currTri + 0] = numPointsX + currVert; triangles[currTri + 1] = currVert + 1; triangles[currTri + 2] = currVert; triangles[currTri + 3] = numPointsX + currVert; triangles[currTri + 4] = numPointsX + currVert + 1; triangles[currTri + 5] = currVert + 1; currTri += 6; } currVert++; } } tmpMesh.vertices = vertices; tmpMesh.triangles = triangles; tmpMesh.uv = uvs; tmpMesh.RecalculateBounds(); tmpMesh.RecalculateNormals(); tmpFilt.sharedMesh = tmpMesh; tmpCol.sharedMesh = tmpMesh; // chunk.Init(tmpChunkList, new Vector2(minX, minY), new Vector2(maxX, maxY), this.transform.position, false); SetChunk(chunk, tmpChunkList, new Vector2(minX, minY), new Vector2(maxX, maxY), this.transform.position); lstMeshObj.Add(gMeshObj); } } }