fixed bug in shapes/Plane which would return negative results, fixed bug in main/Scene which would not check for shape to be non-null after calling getRayClosestHit()
git-svn-id: svn://anubis/fart/trunk@161 7f9b0f55-74a9-4bce-be96-3c2cd072584d
This commit is contained in:
parent
c78e5941c8
commit
9ef826df43
@ -10,25 +10,26 @@ using namespace std;
|
|||||||
|
|
||||||
void Scene::load(const char * filename)
|
void Scene::load(const char * filename)
|
||||||
{
|
{
|
||||||
refptr<Node> node = parse(filename);
|
|
||||||
processNode(node);
|
|
||||||
|
|
||||||
|
|
||||||
/* TODO: parse file somehow */
|
/* TODO: parse file somehow */
|
||||||
refptr<Shape> plane = new Plane(0, 0, 1, -2);
|
// refptr<Node> node = parse(filename);
|
||||||
m_shapes.push_back(plane);
|
// processNode(node);
|
||||||
|
|
||||||
|
|
||||||
|
refptr<Shape> shape = new Plane(0, 0, 1, 2);
|
||||||
|
shape->setTransform(m_transform);
|
||||||
|
m_shapes.push_back(shape);
|
||||||
|
|
||||||
|
m_transform.translate(1.0, 5.0, 0.5);
|
||||||
refptr<Material> m = new Material();
|
refptr<Material> m = new Material();
|
||||||
m->setDiffuseColor(Color::red);
|
m->setDiffuseColor(Color::red);
|
||||||
m->setAmbientColor(Color::red);
|
m->setAmbientColor(Color::red);
|
||||||
|
shape = new Sphere(1.0);
|
||||||
refptr<Shape> shape = new Sphere(1.0);
|
|
||||||
m_transform.translate(1.0, 5.0, 0.5);
|
|
||||||
shape->setTransform(m_transform);
|
shape->setTransform(m_transform);
|
||||||
shape->setMaterial(m);
|
shape->setMaterial(m);
|
||||||
m_shapes.push_back(shape);
|
m_shapes.push_back(shape);
|
||||||
|
m_transform.translate(-1.0, -5.0, -0.5);
|
||||||
|
|
||||||
m_transform.translate(-2, -2, -1);
|
m_transform.translate(-1, 3, -0.5);
|
||||||
refptr<Shape> shape1 = new Sphere(0.8);
|
refptr<Shape> shape1 = new Sphere(0.8);
|
||||||
shape1->setMaterial(m);
|
shape1->setMaterial(m);
|
||||||
shape1->setTransform(m_transform);
|
shape1->setTransform(m_transform);
|
||||||
@ -41,66 +42,64 @@ void Scene::load(const char * filename)
|
|||||||
shape2->setTransform(m_transform);
|
shape2->setTransform(m_transform);
|
||||||
shape = new Intersect(shape1, shape2);
|
shape = new Intersect(shape1, shape2);
|
||||||
m_shapes.push_back(shape);
|
m_shapes.push_back(shape);
|
||||||
|
|
||||||
m_transform.rotate(-20, 0, 1, 0);
|
m_transform.rotate(-20, 0, 1, 0);
|
||||||
m_transform.translate(2, 2, 1);
|
m_transform.translate(1, -3, 0.5);
|
||||||
|
|
||||||
|
m_transform.translate(1.5, 3.2, -0.7);
|
||||||
|
m_transform.rotate(15, 0, 0, 1);
|
||||||
m = new Material();
|
m = new Material();
|
||||||
m->setDiffuseColor(Color::magenta);
|
m->setDiffuseColor(Color::magenta);
|
||||||
m->setAmbientColor(Color::magenta);
|
m->setAmbientColor(Color::magenta);
|
||||||
|
|
||||||
m_transform.translate(2.5, 1, -1.5);
|
|
||||||
shape1 = new Box(new Vector(1, 1, 1));
|
shape1 = new Box(new Vector(1, 1, 1));
|
||||||
shape1->setMaterial(m);
|
shape1->setMaterial(m);
|
||||||
shape1->setTransform(m_transform);
|
shape1->setTransform(m_transform);
|
||||||
|
|
||||||
m = new Material();
|
m = new Material();
|
||||||
m->setDiffuseColor(Color::yellow);
|
m->setDiffuseColor(Color::yellow);
|
||||||
m->setAmbientColor(Color::yellow);
|
m->setAmbientColor(Color::yellow);
|
||||||
|
|
||||||
shape2 = new Sphere(0.6);
|
shape2 = new Sphere(0.6);
|
||||||
m_transform.translate(-0.5, -0.5, 0.5);
|
m_transform.translate(-0.5, -0.5, 0.5);
|
||||||
shape2->setTransform(m_transform);
|
shape2->setTransform(m_transform);
|
||||||
shape2->setMaterial(m);
|
shape2->setMaterial(m);
|
||||||
|
|
||||||
shape = new Subtract(shape1, shape2);
|
shape = new Subtract(shape1, shape2);
|
||||||
m_shapes.push_back(shape);
|
m_shapes.push_back(shape);
|
||||||
|
m_transform.rotate(-15, 0, 0, 1);
|
||||||
|
m_transform.translate(-1.0, -2.7, 0.2);
|
||||||
|
|
||||||
m_transform.translate(-2.0, 0.5, 1.0);
|
m_transform.translate(1, 5, -1.5);
|
||||||
|
|
||||||
m = new Material();
|
m = new Material();
|
||||||
m->setDiffuseColor(Color::blue);
|
m->setDiffuseColor(Color::blue);
|
||||||
m->setAmbientColor(Color::blue);
|
m->setAmbientColor(Color::blue);
|
||||||
|
|
||||||
shape = new Box(new Vector(1.8, 1.8, 0.5));
|
shape = new Box(new Vector(1.8, 1.8, 0.5));
|
||||||
m_transform.translate(0, 0, -2.0);
|
|
||||||
shape->setTransform(m_transform);
|
shape->setTransform(m_transform);
|
||||||
shape->setMaterial(m);
|
shape->setMaterial(m);
|
||||||
m_shapes.push_back(shape);
|
m_shapes.push_back(shape);
|
||||||
|
m_transform.translate(-1, -5, 1.5);
|
||||||
|
|
||||||
|
m_transform.translate(0.2, 6.5, 1.5);
|
||||||
|
m_transform.rotate(45, 1, 0, 0);
|
||||||
m = new Material();
|
m = new Material();
|
||||||
m->setDiffuseColor(Color::cyan);
|
m->setDiffuseColor(Color::cyan);
|
||||||
m->setAmbientColor(Color::cyan);
|
m->setAmbientColor(Color::cyan);
|
||||||
|
|
||||||
shape = new Cyl(1.0, 0.0, 2.0);
|
shape = new Cyl(1.0, 0.0, 2.0);
|
||||||
m_transform.translate(-1.3, 2.5, 3.5);
|
|
||||||
m_transform.rotate(45, 1, 0, 0);
|
|
||||||
shape->setTransform(m_transform);
|
shape->setTransform(m_transform);
|
||||||
shape->setMaterial(m);
|
shape->setMaterial(m);
|
||||||
m_shapes.push_back(shape);
|
m_shapes.push_back(shape);
|
||||||
|
m_transform.rotate(-45, 1, 0, 0);
|
||||||
|
m_transform.translate(-0.2, -6.5, -1.5);
|
||||||
|
|
||||||
|
m_transform.translate(-1.5, 5.0, 2.5);
|
||||||
|
m_transform.rotate(45, 0, 0, 1);
|
||||||
|
m_transform.rotate(45, 1, 0, 0);
|
||||||
m = new Material();
|
m = new Material();
|
||||||
m->setDiffuseColor(Color::yellow);
|
m->setDiffuseColor(Color::yellow);
|
||||||
m->setAmbientColor(Color::yellow);
|
m->setAmbientColor(Color::yellow);
|
||||||
|
|
||||||
shape = new Box(new Vector(1, 1, 1));
|
shape = new Box(new Vector(1, 1, 1));
|
||||||
m_transform.rotate(-45, 1, 0, 0);
|
|
||||||
m_transform.translate(-1.7, -0.5, -2.0);
|
|
||||||
m_transform.rotate(45, 0, 0, 1);
|
|
||||||
m_transform.rotate(45, 1, 0, 0);
|
|
||||||
shape->setTransform(m_transform);
|
shape->setTransform(m_transform);
|
||||||
shape->setMaterial(m);
|
shape->setMaterial(m);
|
||||||
m_shapes.push_back(shape);
|
m_shapes.push_back(shape);
|
||||||
|
m_transform.rotate(-45, 1, 0, 0);
|
||||||
|
m_transform.rotate(-45, 0, 0, 1);
|
||||||
|
m_transform.translate(1.5, -5.0, -2.5);
|
||||||
|
|
||||||
refptr<Light> light = new PointLight();
|
refptr<Light> light = new PointLight();
|
||||||
light->setPosition(Vector(2, -1, 2));
|
light->setPosition(Vector(2, -1, 2));
|
||||||
|
@ -147,17 +147,20 @@ Color Scene::traceRayDepth(const Ray & ray, int depth)
|
|||||||
|
|
||||||
ShapeDistance hit = getRayClosestHit(ray);
|
ShapeDistance hit = getRayClosestHit(ray);
|
||||||
|
|
||||||
/* compute the Phong lighting for each hit */
|
if ( ! hit.shape.isNull() )
|
||||||
refptr<Material> material = hit.shape->getMaterial();
|
{
|
||||||
|
/* compute the Phong lighting for each hit */
|
||||||
|
refptr<Material> material = hit.shape->getMaterial();
|
||||||
|
|
||||||
Vector surfacePoint = ray[hit.dist];
|
Vector surfacePoint = ray[hit.dist];
|
||||||
|
|
||||||
color += Lighting::computePhong(material,
|
color += Lighting::computePhong(material,
|
||||||
m_lights,
|
m_lights,
|
||||||
ray,
|
ray,
|
||||||
surfacePoint,
|
surfacePoint,
|
||||||
hit.shape->getNormalAt(surfacePoint),
|
hit.shape->getNormalAt(surfacePoint),
|
||||||
m_ambient_light);
|
m_ambient_light);
|
||||||
|
}
|
||||||
|
|
||||||
return color;
|
return color;
|
||||||
}
|
}
|
||||||
|
@ -38,8 +38,11 @@ Shape::IntersectionList Plane::intersect(refptr<Shape> _this, const Ray & ray)
|
|||||||
Solver::Result solutions = solver.solve();
|
Solver::Result solutions = solver.solve();
|
||||||
if (solutions.numResults > 0)
|
if (solutions.numResults > 0)
|
||||||
{
|
{
|
||||||
Vector isect_point = ray_inv[solutions.results[0]];
|
if (solutions.results[0] > 0.0)
|
||||||
res.add(Intersection(_this, m_transform.transform_point(isect_point)));
|
{
|
||||||
|
Vector isect_point = ray_inv[solutions.results[0]];
|
||||||
|
res.add(Intersection(_this, m_transform.transform_point(isect_point)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,11 @@ Solver::~Solver()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Solver::Result::Result()
|
||||||
|
{
|
||||||
|
numResults = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* LinearSolver methods *
|
* LinearSolver methods *
|
||||||
@ -120,7 +125,3 @@ Solver::Result QuarticSolver::solve()
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
Solver::Result::Result()
|
|
||||||
{
|
|
||||||
numResults = 0;
|
|
||||||
}
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user