//build a full tree public SamplerNode(int sub, Vector3 center, Vector2 size, Vector2 uv, Vector2 uvstep) { mVertex = new SampleVertexData(); mVertex.Position = center; mVertex.UV = uv; Vector2 subsize = 0.5f * size; Vector2 subuvstep = 0.5f * uvstep; if (sub > 1) { Children[0] = new SamplerNode(sub - 1, new Vector3(center.x - 0.5f * subsize.x, center.y, center.z - 0.5f * subsize.y), subsize, new Vector2(uv.x - 0.5f * subuvstep.x, uv.y - 0.5f * subuvstep.y), subuvstep); Children[1] = new SamplerNode(sub - 1, new Vector3(center.x + 0.5f * subsize.x, center.y, center.z - 0.5f * subsize.y), subsize, new Vector2(uv.x + 0.5f * subuvstep.x, uv.y - 0.5f * subuvstep.y), subuvstep); Children[2] = new SamplerNode(sub - 1, new Vector3(center.x - 0.5f * subsize.x, center.y, center.z + 0.5f * subsize.y), subsize, new Vector2(uv.x - 0.5f * subuvstep.x, uv.y + 0.5f * subuvstep.y), subuvstep); Children[3] = new SamplerNode(sub - 1, new Vector3(center.x + 0.5f * subsize.x, center.y, center.z + 0.5f * subsize.y), subsize, new Vector2(uv.x + 0.5f * subuvstep.x, uv.y + 0.5f * subuvstep.y), subuvstep); } else { Children[0] = new SamplerLeaf(new Vector3(center.x - 0.5f * subsize.x, center.y, center.z - 0.5f * subsize.y), new Vector2(uv.x - 0.5f * subuvstep.x, uv.y - 0.5f * subuvstep.y)); Children[1] = new SamplerLeaf(new Vector3(center.x + 0.5f * subsize.x, center.y, center.z - 0.5f * subsize.y), new Vector2(uv.x + 0.5f * subuvstep.x, uv.y - 0.5f * subuvstep.y)); Children[2] = new SamplerLeaf(new Vector3(center.x - 0.5f * subsize.x, center.y, center.z + 0.5f * subsize.y), new Vector2(uv.x - 0.5f * subuvstep.x, uv.y + 0.5f * subuvstep.y)); Children[3] = new SamplerLeaf(new Vector3(center.x + 0.5f * subsize.x, center.y, center.z + 0.5f * subsize.y), new Vector2(uv.x + 0.5f * subuvstep.x, uv.y + 0.5f * subuvstep.y)); } }
private void CombineTree(float angleErr) { if (mNode is SamplerNode) { SamplerNode node = (SamplerNode)mNode; node.CombineNode(angleErr); if (node.isFullLeaf) { SamplerLeaf leaf = node.Combine(angleErr); if (leaf != null) { mNode = leaf; } } } }
public void CombineNode(float angleErr) { for (int i = 0; i < 4; ++i) { if (Children[i] is SamplerNode) { SamplerNode subNode = (SamplerNode)Children[i]; subNode.CombineNode(angleErr); if (subNode.isFullLeaf) { SamplerLeaf replacedLeaf = subNode.Combine(angleErr); if (replacedLeaf != null) { Children[i] = replacedLeaf; } } } } }
public SamplerLeaf Combine(float angleErr) { for (int i = 0; i < Children.Length; ++i) { if (Children[i] == null || !(Children[i] is SamplerLeaf)) { return(null); } } for (int i = 0; i < Children.Length; ++i) { SamplerLeaf l = (SamplerLeaf)Children[i]; float dot = Vector3.Dot(l.Normal.normalized, mVertex.Normal.normalized); if (Mathf.Rad2Deg * Mathf.Acos(dot) >= angleErr) { return(null); } } SamplerLeaf leaf = new SamplerLeaf(mVertex); for (int i = 0; i < Children.Length; ++i) { SamplerLeaf l = (SamplerLeaf)Children[i]; foreach (var k in l.Boundaries.Keys) { if (Boundaries.ContainsKey(k)) { Boundaries[k].Merge(l.Boundaries[k]); } else { Boundaries.Add(k, l.Boundaries[k]); } } } leaf.Boundaries = Boundaries; return(leaf); }