[svn] / nytr / trunk / libnytrengine / TestSceneGeomMgr.cpp Repository:
ViewVC logotype

View of /nytr/trunk/libnytrengine/TestSceneGeomMgr.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 678 - (download) (as text) (annotate)
Sat Jan 12 07:18:19 2008 UTC (2 years, 7 months ago) by kouhei
File size: 1587 byte(s)
added libnytrengine. buildable
#include <fecti/config.h>

#include "TestSceneGeomMgr.h"

using namespace nytr;

TestSceneGeomMgr::TestSceneGeomMgr()
: GeomMgr(FAABB(FVector3(-10, -10, -10), FVector3(10, 10, 10))), m_pMatSphere(0), m_pMatPlane(0)
{
	/* NOP */
}

TestSceneGeomMgr::~TestSceneGeomMgr()
{
	if(m_pMatPlane != 0)
		delete m_pMatPlane;
	
	if(m_pMatSphere != 0)
		delete m_pMatSphere;
}

bool
TestSceneGeomMgr::getIntersection(DiffGeom* pDG, const FRay& ray)
{
	REAL r = -1.0f;

	// find plane intersection
	{
		FVector3 vN(0, 1, 0);
		REAL d = -1.0f;

		REAL costheta = vN.dotp(ray.vDir);

		if(costheta != 0)
		{
			REAL rPln = (vN.dotp(ray.vPos) + d) / costheta;

			if(rPln > 0)
			{
				r = rPln;

				pDG->vPos = ray.vPos + r * ray.vDir;
				pDG->vNormal = vN;
				pDG->vDPDU = FVector3(0, 1, 0).crossp(pDG->vNormal);
				pDG->vDPDV = pDG->vDPDU.crossp(pDG->vNormal);

				pDG->pMat = m_pMatPlane;
			}
		}
	}

	// find sphere intersection
	{
		FVector3 vC(0, 0, 2);
		REAL r2 = 1.0f;

		FVector3 vTmp = ray.vPos - vC;

		REAL halfb = vTmp.dotp(ray.vDir);
		REAL c = vTmp.norm2() - r2;

		REAL det = halfb*halfb - /* a */1 * c;

		if (!(det < 0))
		{
			REAL rSph = -halfb - sqrtf(det);

			if((rSph > 0) && (r == -1.0f || rSph < r))
			{
				r = rSph;

				pDG->vPos = ray.vPos + r * ray.vDir;
				pDG->vNormal = (pDG->vPos - vC).normalized();
				pDG->vDPDU = FVector3(0, 1, 0).crossp(pDG->vNormal);
				pDG->vDPDV = pDG->vDPDU.crossp(pDG->vNormal);

				pDG->pMat = m_pMatSphere;
			}
		}
	}

	return (r != -1.0f);
}

admin
ViewVC Help
Powered by ViewVC 1.0.5