示例#1
0
        public static IEnumerable <Value> Intersect(BVH <Value> t, FastBounds bb)
        {
            if (t == null || !t.bb.Intersects(bb))
            {
                yield break;
            }

            if (!t.IsLeaf())
            {
                foreach (var s in t.ch)
                {
                    if (s != null)
                    {
                        foreach (var r in Intersect(s, bb))
                        {
                            yield return(r);
                        }
                    }
                }
            }

            foreach (var v in t.Values)
            {
                if (v != null)
                {
                    yield return(v);
                }
            }
        }
示例#2
0
        public static FastBounds EncapsulateInTargetSpace(this FastBounds local, Matrix4x4 localToTargetMat)
        {
            var absMat = localToTargetMat.Absolute();
            var center = localToTargetMat.MultiplyPoint3x4(local.Center);
            var extent = absMat.MultiplyVector(local.Extents);

            return(new Bounds(center, 2f * extent));
        }
示例#3
0
        public OBB3(FastBounds localBounds, Matrix4x4 modelMatrix)
        {
            this.localBounds = localBounds;

            this.modelMatrix   = modelMatrix;
            this.modelITMatrix = modelMatrix.inverse.transpose;

            this.worldBounds = localBounds.EncapsulateInTargetSpace(modelMatrix);
        }
示例#4
0
        public void EditorTest()
        {
            var delta = 1e-4f;
            var n     = 4;

            var bounds = new FastBounds[n];
            var vals   = new Value[n];

            for (var i = 0; i < n; i++)
            {
                bounds [i] = new Bounds(Vector3.one * i, Vector3.one);
                vals [i]   = new Value()
                {
                    id = i
                };
            }

            var bvh = new MortonBVHController <Value> ();

            bvh.Build(bounds, vals);

            var nodeCount  = bvh.Count();
            var valueCount = bvh.CountValues();

            bvh.Build(bounds, vals);
            Assert.AreEqual(nodeCount, bvh.Count());
            Assert.AreEqual(valueCount, bvh.CountValues());

            Assert.AreEqual(0, bvh.Root.offset);
            Assert.AreEqual(n, bvh.Root.length);
            for (var i = 0; i < 3; i++)
            {
                Assert.AreEqual(1.5f, bvh.Root.bb.Center [i], delta);
                Assert.AreEqual(2f, bvh.Root.bb.Extents [i], delta);
            }

            Assert.AreEqual(0, bvh.Root.ch [0].offset);
            Assert.AreEqual(2, bvh.Root.ch [0].length);

            Assert.AreEqual(2, bvh.Root.ch [1].offset);
            Assert.AreEqual(2, bvh.Root.ch [1].length);

            for (var j = 0; j < n; j++)
            {
                var s = (j & 2) != 0 ? 1 : 0;
                var t = (j & 1) != 0 ? 1 : 0;

                Assert.AreEqual(1, bvh.Root.ch [s].ch [t].Values.Count);
                Assert.AreEqual(j, bvh.Root.ch [s].ch [t].Values.First.Value.id);

                for (var i = 0; i < 3; i++)
                {
                    Assert.AreEqual(j, bvh.Root.ch [s].ch [t].bb.Center [i], delta);
                    Assert.AreEqual(1f, bvh.Root.ch [s].ch [t].bb.Size [i], delta);
                }
            }
        }
示例#5
0
        public static Vector3 SampleIn(this FastBounds fb, float uv_x, float uv_y, float uv_z)
        {
            var min  = fb.Min;
            var max  = fb.Max;
            var size = fb.Size;

            return(new Vector3(
                       Mathf.Lerp(min.x, max.x, uv_x),
                       Mathf.Lerp(min.y, max.y, uv_y),
                       Mathf.Lerp(min.z, max.z, uv_z)));
        }
示例#6
0
文件: Frustum.cs 项目: nickshen/Recon
        public Frustum(Vector3 head, Vector3 farBottomLeft, float nearPlane, float farPlane, Quaternion axis)
        {
            farBottomLeft *= 1f / farBottomLeft.z;

            this.farBottomLeft  = farPlane * farBottomLeft;
            this.nearBottomLeft = nearPlane * farBottomLeft;

            this.modelMatrix   = Matrix4x4.TRS(head, axis, Vector3.one);
            this.modelITMatrix = modelMatrix.inverse.transpose;
            this.worldBounds   = Vertices().Encapsulate();
        }
    static Matrix4x4 CalculateViewUvToViewLocal(FastBounds viewBounds)
    {
        var size = viewBounds.Size;
        var min  = viewBounds.Min;
        var m    = Matrix4x4.zero;

        m [0]  = size.x;
        m [12] = min.x;
        m [5]  = size.y;
        m [13] = min.y;
        m [10] = size.z;
        m [14] = min.z;
        m [15] = 1f;
        return(m);
    }
示例#8
0
 public FastBounds Build(IReadOnlyList <FastBounds> bounds, IReadOnlyList <Value> values)
 {
     if (IsLeaf())
     {
         bb = bounds.Range(offset, length).Encapsulate();
         foreach (var v in values.Range(offset, length))
         {
             Values.AddLast(v);
         }
     }
     else
     {
         bb.Encapsulate(ch.Where(t => t != null).Select(t => t.Build(bounds, values)).Encapsulate());
     }
     return(bb);
 }
示例#9
0
        public static IList <Value> Intersect(BVH <Value> t, FastBounds bb, IList <Value> result)
        {
            if (t != null && t.bb.Intersects(bb))
            {
                Intersect(t.ch[0], bb, result);
                Intersect(t.ch[1], bb, result);

                foreach (var v in t.Values)
                {
                    if (v != null)
                    {
                        result.Add(v);
                    }
                }
            }
            return(result);
        }
示例#10
0
 public static IEnumerable <Volume> Broadphase(BaseBVHController <Volume> bvh, FastBounds bb)
 {
     foreach (var v in bvh.Intersect(bb))
     {
         yield return(v);
     }
 }
示例#11
0
 public virtual IList <Value> Intersect(FastBounds bb, IList <Value> result)
 {
     return(Intersect(_root, bb, result));
 }
示例#12
0
        public static FastBounds EncapsulateInWorldSpace(this Transform tr, FastBounds local)
        {
            var local2world = tr.localToWorldMatrix;

            return(local.EncapsulateInTargetSpace(local2world));
        }
示例#13
0
 public static Vector3 SampleIn(this FastBounds fb)
 {
     return(fb.SampleIn(Random.value, Random.value, Random.value));
 }
示例#14
0
 public static IList <Volume> Broadphase(BaseBVHController <Volume> bvh, FastBounds bb, IList <Volume> result)
 {
     return(bvh.Intersect(bb, result));
 }
示例#15
0
 public virtual IEnumerable <Value> Intersect(FastBounds bb)
 {
     return(Intersect(_root, bb));
 }
示例#16
0
 public AABB3 Set(FastBounds fb)
 {
     return(Set(fb.Min, fb.Max));
 }
示例#17
0
 public static OBB3 Create(Transform tr, FastBounds localBounds)
 {
     return(new OBB3(localBounds, tr.localToWorldMatrix));
 }