00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #if defined(_MSC_VER)
00025 #pragma once
00026 #endif
00027
00028 #ifndef PBRT_CORE_SHAPE_H
00029 #define PBRT_CORE_SHAPE_H
00030
00031
00032 #include "pbrt.h"
00033 #include "geometry.h"
00034 #include "transform.h"
00035 #include "diffgeom.h"
00036 #include "memory.h"
00037
00038
00039 class Shape : public ReferenceCounted {
00040 public:
00041
00042 Shape(const Transform *o2w, const Transform *w2o, bool ro);
00043 virtual ~Shape();
00044 virtual BBox ObjectBound() const = 0;
00045 virtual BBox WorldBound() const;
00046 virtual bool CanIntersect() const;
00047 virtual void Refine(vector<Reference<Shape> > &refined) const;
00048 virtual bool Intersect(const Ray &ray, float *tHit,
00049 float *rayEpsilon, DifferentialGeometry *dg) const;
00050 virtual bool IntersectP(const Ray &ray) const;
00051 virtual void GetShadingGeometry(const Transform &obj2world,
00052 const DifferentialGeometry &dg,
00053 DifferentialGeometry *dgShading) const {
00054 *dgShading = dg;
00055 }
00056 virtual float Area() const;
00057 virtual Point Sample(float u1, float u2, Normal *Ns) const {
00058 Severe("Unimplemented Shape::Sample() method called");
00059 return Point();
00060 }
00061 virtual float Pdf(const Point &Pshape) const {
00062 return 1.f / Area();
00063 }
00064 virtual Point Sample(const Point &P, float u1, float u2,
00065 Normal *Ns) const {
00066 return Sample(u1, u2, Ns);
00067 }
00068 virtual float Pdf(const Point &p, const Vector &wi) const;
00069
00070
00071 const Transform *ObjectToWorld, *WorldToObject;
00072 const bool ReverseOrientation, TransformSwapsHandedness;
00073 const uint32_t shapeId;
00074 static uint32_t nextshapeId;
00075 };
00076
00077
00078
00079 #endif // PBRT_CORE_SHAPE_H