public void updateDraw(StaticShadowCaster shadowCaster) { var centerPos = Camera.main.transform.position / cellSize; int centerX = (int)Mathf.Floor(centerPos.x + 0.5f); int centerZ = (int)Mathf.Floor(centerPos.z + 0.5f); int shouldX = getShouldPos(centerX, offsetX); int shouldZ = getShouldPos(centerZ, offsetZ); bool lodChange = false; int newlod = centerX == shouldX && centerZ == shouldZ ? 0 : 1; if (newlod != lod) { lod = newlod; lodChange = true; } ////if (lod == 0 || (shouldX == centerX && shouldZ == centerZ)) lodChange = true; if (lodChange || shouldX != currentX || shouldZ != currentZ) { currentX = shouldX; currentZ = shouldZ; var pos = testItem.position; pos.x = currentX * cellSize; pos.z = currentZ * cellSize; testItem.position = pos; if (lod == 0) { currentLod0Index = index; Shader.SetGlobalInt("_shadowmapLod0Index", currentLod0Index); } testItem.GetComponent <Renderer>().sharedMaterial.color = lod == 0?Color.blue : color; shadowCaster.renderWithIndex(lod == 0?0:(index < currentLod0Index?index + 1: index), pos); } }
// Use this for initialization void Start() { _shadowCaster = GetComponent <StaticShadowCaster>(); cells = new ShadowmapCell[3 * 3]; for (int i = 0; i < cells.Length; i++) { int r = i / 3; int c = i % 3; var testItem = GameObject.CreatePrimitive(PrimitiveType.Cube); testItem.GetComponent <Collider>().enabled = false; testItem.transform.localScale = new Vector3(cellSize, 0.01f, cellSize); testItem.GetComponent <Renderer>().shadowCastingMode = ShadowCastingMode.Off; testItem.GetComponent <Renderer>().material.color = new Color((float)r / 3, (float)c / 3, 0); testItem.transform.position = new Vector3(0, 1.4f, 0); cells[i] = new ShadowmapCell(c - 1, r - 1, testItem.transform, cellSize); testItem.GetComponent <Renderer>().enabled = false; } GetComponent <Camera>().orthographicSize = cellSize / 2 * Mathf.Sqrt(2); }