예제 #1
0
	/**
	 * SetIsectPt
	 *
	 * @param isectpt
	 */
	protected void SetIsectPt(IntersectPt isectpt)
	{
		t = isectpt.GetT();
		Enter = isectpt.GetEnter();
		IntersectObj = isectpt.GetIntersectObj();
		OriginalObjID = isectpt.GetOriginal();
		Intersection.Set(isectpt.GetIntersection().GetX(), isectpt.GetIntersection().GetY(), isectpt.GetIntersection().GetZ());
	}
예제 #2
0
 /**
  * SetIsectPt
  *
  * @param isectpt
  */
 protected void SetIsectPt(IntersectPt isectpt)
 {
     t             = isectpt.GetT();
     Enter         = isectpt.GetEnter();
     IntersectObj  = isectpt.GetIntersectObj();
     OriginalObjID = isectpt.GetOriginal();
     Intersection.Set(isectpt.GetIntersection().GetX(), isectpt.GetIntersection().GetY(), isectpt.GetIntersection().GetZ());
 }
예제 #3
0
    /**
     * Intersect
     *
     * @param ray
     * @param pt
     * @return boolean
     */
    public override bool Intersect(Ray ray, IntersectPt pt)
    {
        Vector OC = new Vector();
        double l2OC, tCA, t2HC;

        OC.Sub(Origin, ray.GetOrigin());
        l2OC = OC.SquaredLength();
        tCA  = OC.Dot(ray.GetDirection());
        if (l2OC >= RadiusSquare && tCA <= 0)
        {
            return(false);
        }
        t2HC = RadiusSquare - l2OC + tCA * tCA;
        if (t2HC < 0)
        {
            return(false);
        }
        if (l2OC <= RadiusSquare)
        {
            pt.SetT(tCA + (double)System.Math.Sqrt(t2HC));
            if (pt.GetT() < pt.GetThreshold())
            {
                return(false);
            }
            pt.SetEnter(false);
            pt.GetIntersection().Combine(ray.GetOrigin(), ray.GetDirection(), 1.0f, pt.GetT());
        }
        else
        {
            pt.SetT(tCA - (double)System.Math.Sqrt(t2HC));
            pt.SetEnter(true);
            if (pt.GetT() < pt.GetThreshold())
            {
                pt.SetT(tCA + (double)System.Math.Sqrt(t2HC));
                pt.SetEnter(false);
            }
            pt.GetIntersection().Combine(ray.GetOrigin(), ray.GetDirection(), 1.0f, pt.GetT());
        }
        pt.SetIntersectObj(this);
        GetCachePt().Set(ray.GetID(), pt);
        return(true);
    }
예제 #4
0
    /**
     * FindLightBlock
     *
     * @param tree
     * @param ray
     * @param maxt
     * @return boolean
     */
    private bool FindLightBlock(OctNode tree, Ray ray, double maxt)
    {
        OctNode     current = tree.FindTreeNode(ray.GetOrigin());
        IntersectPt test    = new IntersectPt();
        Point       testpt  = new Point();

        while (current != null)
        {
            ObjNode currentnode = current.GetList();
            while (currentnode != null)
            {
                bool found = false;
                if (currentnode.GetObj().GetCachePt().GetID() == ray.GetID())
                {
                    found = true;
                }
                if (!found)
                {
                    test.SetOrigID(0);
                    if (currentnode.GetObj().Intersect(ray, test))
                    {
                        if (test.GetT() < maxt)
                        {
                            return(true);
                        }
                    }
                }
                currentnode = currentnode.Next();
            }
            OctNode adjacent = current.Intersect(ray, testpt, test.GetThreshold());
            if (adjacent == null)
            {
                current = null;
            }
            else
            {
                current = adjacent.FindTreeNode(testpt);
            }
        }
        return(false);
    }
예제 #5
0
	/**
	 * Intersect
	 *
	 * @param ray
	 * @param pt
	 * @return boolean
	 */
	public override bool Intersect(Ray ray, IntersectPt pt)
	{
		Vector OC = new Vector();
		double l2OC, tCA, t2HC;

		OC.Sub(Origin, ray.GetOrigin());
		l2OC = OC.SquaredLength();
		tCA = OC.Dot(ray.GetDirection());
		if(l2OC >= RadiusSquare && tCA <= 0)
		{
			return (false);
		}
		t2HC = RadiusSquare - l2OC + tCA * tCA;
		if(t2HC < 0)
		{
			return (false);
		}
		if(l2OC <= RadiusSquare)
		{
			pt.SetT(tCA + (double)System.Math.Sqrt(t2HC));
			if(pt.GetT() < pt.GetThreshold())
			{
				return (false);
			}
			pt.SetEnter(false);
			pt.GetIntersection().Combine(ray.GetOrigin(), ray.GetDirection(), 1.0f, pt.GetT());
		}
		else
		{
			pt.SetT(tCA - (double)System.Math.Sqrt(t2HC));
			pt.SetEnter(true);
			if(pt.GetT() < pt.GetThreshold())
			{
				pt.SetT(tCA + (double)System.Math.Sqrt(t2HC));
				pt.SetEnter(false);
			}
			pt.GetIntersection().Combine(ray.GetOrigin(), ray.GetDirection(), 1.0f, pt.GetT());
		}
		pt.SetIntersectObj(this);
		GetCachePt().Set(ray.GetID(), pt);
		return (true);
	}
예제 #6
0
	/**
	 * FindNearestIsect
	 *
	 * @param octree
	 * @param ray
	 * @param originID
	 * @param level
	 * @param isectnode
	 * @return boolean
	 */
	public bool FindNearestIsect(OctNode octree, Ray ray, int originID, int level, OctNode isectnode)
	{
		Point testpt = new Point(ray.GetOrigin());
		OctNode current;
		ObjNode currentnode;
		CacheIntersectPt isectptr;
		IntersectPt test = new IntersectPt();

		if(level == 0)
		{
			testpt.Combine(ray.GetOrigin(), ray.GetDirection(), 1.0f, Threshold);
		}

		current = octree.FindTreeNode(testpt);
		IntersectObj = null;
		while(current != null)
		{
			currentnode = current.GetList();
			while(currentnode != null)
			{
				bool found = false;
				if(currentnode.GetObj().GetCachePt().GetID() == ray.GetID())
				{
					isectptr = currentnode.GetObj().GetCachePt();
					if(current == current.FindTreeNode(isectptr.GetIntersection()))
					{
						if(IntersectObj == null)
						{
							SetIsectPt(isectptr);
							isectnode.Copy(current);
						}
						else
						{
							if(isectptr.GetT() < t)
							{
								SetIsectPt(isectptr);
								isectnode.Copy(current);
							}
						}
						found = true;
					}
				}
				if(!found)
				{
					test.SetOrigID(originID);
					if(currentnode.GetObj().Intersect(ray, test))
					{
						if(current == current.FindTreeNode(test.GetIntersection()))
						{
							if(IntersectObj == null)
							{
								SetIsectPt(test);
								isectnode.Copy(current);
							}
							else
							{
								if(test.GetT() < t)
								{
									SetIsectPt(test);
									isectnode.Copy(current);
								}
							}
						}
					}
				}
				currentnode = currentnode.Next();
			}
			if(IntersectObj == null)
			{
				OctNode adjacent = current.Intersect(ray, testpt, Threshold);
				if(adjacent == null)
				{
					current = null;
				}
				else
				{
					current = adjacent.FindTreeNode(testpt);
				}
			}
			else
			{
				current = null;
			}
		}
		if(IntersectObj == null)
		{
			return (false);
		}
		else
		{
			return (true);
		}
	}
예제 #7
0
    /**
     * FindNearestIsect
     *
     * @param octree
     * @param ray
     * @param originID
     * @param level
     * @param isectnode
     * @return boolean
     */
    public bool FindNearestIsect(OctNode octree, Ray ray, int originID, int level, OctNode isectnode)
    {
        Point            testpt = new Point(ray.GetOrigin());
        OctNode          current;
        ObjNode          currentnode;
        CacheIntersectPt isectptr;
        IntersectPt      test = new IntersectPt();

        if (level == 0)
        {
            testpt.Combine(ray.GetOrigin(), ray.GetDirection(), 1.0f, Threshold);
        }

        current      = octree.FindTreeNode(testpt);
        IntersectObj = null;
        while (current != null)
        {
            currentnode = current.GetList();
            while (currentnode != null)
            {
                bool found = false;
                if (currentnode.GetObj().GetCachePt().GetID() == ray.GetID())
                {
                    isectptr = currentnode.GetObj().GetCachePt();
                    if (current == current.FindTreeNode(isectptr.GetIntersection()))
                    {
                        if (IntersectObj == null)
                        {
                            SetIsectPt(isectptr);
                            isectnode.Copy(current);
                        }
                        else
                        {
                            if (isectptr.GetT() < t)
                            {
                                SetIsectPt(isectptr);
                                isectnode.Copy(current);
                            }
                        }
                        found = true;
                    }
                }
                if (!found)
                {
                    test.SetOrigID(originID);
                    if (currentnode.GetObj().Intersect(ray, test))
                    {
                        if (current == current.FindTreeNode(test.GetIntersection()))
                        {
                            if (IntersectObj == null)
                            {
                                SetIsectPt(test);
                                isectnode.Copy(current);
                            }
                            else
                            {
                                if (test.GetT() < t)
                                {
                                    SetIsectPt(test);
                                    isectnode.Copy(current);
                                }
                            }
                        }
                    }
                }
                currentnode = currentnode.Next();
            }
            if (IntersectObj == null)
            {
                OctNode adjacent = current.Intersect(ray, testpt, Threshold);
                if (adjacent == null)
                {
                    current = null;
                }
                else
                {
                    current = adjacent.FindTreeNode(testpt);
                }
            }
            else
            {
                current = null;
            }
        }
        if (IntersectObj == null)
        {
            return(false);
        }
        else
        {
            return(true);
        }
    }
예제 #8
0
파일: Scene.cs 프로젝트: lewurm/benchmarker
	/**
	 * FindLightBlock
	 *
	 * @param tree
	 * @param ray
	 * @param maxt
	 * @return boolean
	 */
	private bool FindLightBlock(OctNode tree, Ray ray, double maxt)
	{
		OctNode current = tree.FindTreeNode(ray.GetOrigin());
		IntersectPt test = new IntersectPt();
		Point testpt = new Point();

		while(current != null)
		{
			ObjNode currentnode = current.GetList();
			while(currentnode != null)
			{
				bool found = false;
				if(currentnode.GetObj().GetCachePt().GetID() == ray.GetID())
				{
					found = true;
				}
				if(!found)
				{
					test.SetOrigID(0);
					if(currentnode.GetObj().Intersect(ray, test))
					{
						if(test.GetT() < maxt)
						{
							return (true);
						}
					}
				}
				currentnode = currentnode.Next();
			}
			OctNode adjacent = current.Intersect(ray, testpt, test.GetThreshold());
			if(adjacent == null)
			{
				current = null;
			}
			else
			{
				current = adjacent.FindTreeNode(testpt);
			}
		}
		return (false);
	}