/// <summary> /// Used to first generate the plane's verts, uvs and tris /// If already generated, turns on this CubeFace's renderer and collider (makes it active on the planet) /// </summary> public void Generate() { int vertCount = 0; int cNeighborState = 0; int nowValue = terrain.GetQuadMatrixData(terrain.GetQuadX(this), terrain.GetQuadZ(this)); // forward int forwardZ = terrain.GetQuadZ(this) + (int)this.scale; if (forwardZ < terrain.quadSize) { if (terrain.GetQuadMatrixData(terrain.GetQuadX(this), forwardZ) != 255 && terrain.GetQuadMatrixData(terrain.GetQuadX(this), forwardZ) != 0) { cNeighborState |= (int)Neighbor.forward; vertCount++; } } int backZ = terrain.GetQuadZ(this) - (int)this.scale; if (backZ >= 0) { if (terrain.GetQuadMatrixData(terrain.GetQuadX(this), backZ) != 255 && terrain.GetQuadMatrixData(terrain.GetQuadX(this), backZ) != 0) { cNeighborState |= (int)Neighbor.back; vertCount++; } } // left int leftX = terrain.GetQuadX(this) + (int)this.scale; if (leftX < terrain.quadSize) { if (terrain.GetQuadMatrixData(leftX, terrain.GetQuadZ(this)) != 255 && terrain.GetQuadMatrixData(leftX, terrain.GetQuadZ(this)) != 0) { cNeighborState |= (int)Neighbor.left; vertCount++; } } int rightX = terrain.GetQuadX(this) - (int)this.scale; if (rightX >= 0) { if (terrain.GetQuadMatrixData(rightX, terrain.GetQuadZ(this)) != 255 && terrain.GetQuadMatrixData(rightX, terrain.GetQuadZ(this)) != 0) { cNeighborState |= (int)Neighbor.right; vertCount++; } } renderer.enabled = true; if (generated && cNeighborState == neighborState) { //if (parent != null) // parent.collider.enabled = false; //collider.enabled = true; return; } neighborState = cNeighborState; finalized = false; // 如果是lod最大值,即scale == 2,那么如果旁边是更高的scale,则跳过这个点即可 // 如果不是,获得,上右,上左,下左,下右是否有子树,如果都没有子树,那么与lod最大值同理 mesh = new Mesh(); mesh.name = "Mesh_" + gameObject.name; int size = 2; var verts = new Vector3[(size + 1) * (size + 1) - vertCount]; var tris = new int[size * size * 6 - vertCount * 3]; var uvs = new Vector2[(size + 1) * (size + 1) - vertCount]; var uvFactor = 1.0f / size; int cx = 1; int cz = 1; var px = (float)cx / size; var pz = (float)cz / size; var vx = left * px * scale; var vz = forward * pz * scale; uvs[0] = new Vector2(cx * uvFactor, cz * uvFactor); verts[0] = position + vx + vz; int i = 1; int x = 0; int z = 0; px = (float)(x) / size; pz = (float)z / size; vx = left * px * scale; vz = forward * pz * scale; uvs[i] = new Vector2(x * uvFactor, z * uvFactor); verts[i] = position + vx + vz; i++; if ((cNeighborState & ((int)Neighbor.back)) == 0) { x = 1; z = 0; px = (float)(x) / size; pz = (float)z / size; vx = left * px * scale; vz = forward * pz * scale; uvs[i] = new Vector2(x * uvFactor, z * uvFactor); verts[i] = position + vx + vz; i++; } x = 2; z = 0; px = (float)(x) / size; pz = (float)z / size; vx = left * px * scale; vz = forward * pz * scale; uvs[i] = new Vector2(x * uvFactor, z * uvFactor); verts[i] = position + vx + vz; i++; if ((cNeighborState & ((int)Neighbor.left)) == 0) { x = 2; z = 1; px = (float)(x) / size; pz = (float)z / size; vx = left * px * scale; vz = forward * pz * scale; uvs[i] = new Vector2(x * uvFactor, z * uvFactor); verts[i] = position + vx + vz; i++; } x = 2; z = 2; px = (float)(x) / size; pz = (float)z / size; vx = left * px * scale; vz = forward * pz * scale; uvs[i] = new Vector2(x * uvFactor, z * uvFactor); verts[i] = position + vx + vz; i++; if ((cNeighborState & ((int)Neighbor.forward)) == 0) { x = 1; z = 2; px = (float)(x) / size; pz = (float)z / size; vx = left * px * scale; vz = forward * pz * scale; uvs[i] = new Vector2(x * uvFactor, z * uvFactor); verts[i] = position + vx + vz; i++; } x = 0; z = 2; px = (float)(x) / size; pz = (float)z / size; vx = left * px * scale; vz = forward * pz * scale; uvs[i] = new Vector2(x * uvFactor, z * uvFactor); verts[i] = position + vx + vz; i++; if ((cNeighborState & ((int)Neighbor.right)) == 0) { x = 0; z = 1; px = (float)(x) / size; pz = (float)z / size; vx = left * px * scale; vz = forward * pz * scale; uvs[i] = new Vector2(x * uvFactor, z * uvFactor); verts[i] = position + vx + vz; } // Calculate tris int ti = 0; for (int vi = 1; vi < verts.Length - 1; ti += 3, vi += 1) { tris[ti] = 0; tris[ti + 1] = vi + 1; tris[ti + 2] = vi; } tris[ti] = 0; tris[ti + 1] = 1; tris[ti + 2] = verts.Length - 1; mesh.vertices = verts; mesh.uv = uvs; mesh.triangles = tris; if (parent != null) { parent.Dispose(); } generated = true; }