Ejemplo n.º 1
0
        //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));
            }
        }
Ejemplo n.º 2
0
 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;
             }
         }
     }
 }
Ejemplo n.º 3
0
 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;
                 }
             }
         }
     }
 }
Ejemplo n.º 4
0
        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);
        }