Parent Directory
|
Revision Log
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 |