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_PRIMITIVE_H
00029 #define PBRT_CORE_PRIMITIVE_H
00030
00031
00032 #include "pbrt.h"
00033 #include "shape.h"
00034 #include "material.h"
00035
00036
00037 class Primitive : public ReferenceCounted {
00038 public:
00039
00040 Primitive() : primitiveId(nextprimitiveId++) { }
00041 virtual ~Primitive();
00042 virtual BBox WorldBound() const = 0;
00043 virtual bool CanIntersect() const;
00044 virtual bool Intersect(const Ray &r, Intersection *in) const = 0;
00045 virtual bool IntersectP(const Ray &r) const = 0;
00046 virtual void Refine(vector<Reference<Primitive> > &refined) const;
00047 void FullyRefine(vector<Reference<Primitive> > &refined) const;
00048 virtual const AreaLight *GetAreaLight() const = 0;
00049 virtual BSDF *GetBSDF(const DifferentialGeometry &dg,
00050 const Transform &ObjectToWorld, MemoryArena &arena) const = 0;
00051 virtual BSSRDF *GetBSSRDF(const DifferentialGeometry &dg,
00052 const Transform &ObjectToWorld, MemoryArena &arena) const = 0;
00053
00054
00055 const uint32_t primitiveId;
00056 protected:
00057
00058 static uint32_t nextprimitiveId;
00059 };
00060
00061
00062
00063
00064 class GeometricPrimitive : public Primitive {
00065 public:
00066
00067 bool CanIntersect() const;
00068 void Refine(vector<Reference<Primitive> > &refined) const;
00069 virtual BBox WorldBound() const;
00070 virtual bool Intersect(const Ray &r, Intersection *isect) const;
00071 virtual bool IntersectP(const Ray &r) const;
00072 GeometricPrimitive(const Reference<Shape> &s,
00073 const Reference<Material> &m, AreaLight *a);
00074 const AreaLight *GetAreaLight() const;
00075 BSDF *GetBSDF(const DifferentialGeometry &dg,
00076 const Transform &ObjectToWorld, MemoryArena &arena) const;
00077 BSSRDF *GetBSSRDF(const DifferentialGeometry &dg,
00078 const Transform &ObjectToWorld, MemoryArena &arena) const;
00079 private:
00080
00081 Reference<Shape> shape;
00082 Reference<Material> material;
00083 AreaLight *areaLight;
00084 };
00085
00086
00087
00088
00089 class TransformedPrimitive : public Primitive {
00090 public:
00091
00092 TransformedPrimitive(Reference<Primitive> &prim,
00093 const AnimatedTransform &w2p)
00094 : primitive(prim), WorldToPrimitive(w2p) { }
00095 bool Intersect(const Ray &r, Intersection *in) const;
00096 bool IntersectP(const Ray &r) const;
00097 const AreaLight *GetAreaLight() const { return NULL; }
00098 BSDF *GetBSDF(const DifferentialGeometry &dg,
00099 const Transform &ObjectToWorld, MemoryArena &arena) const {
00100 return NULL;
00101 }
00102 BSSRDF *GetBSSRDF(const DifferentialGeometry &dg,
00103 const Transform &ObjectToWorld, MemoryArena &arena) const {
00104 return NULL;
00105 }
00106 BBox WorldBound() const {
00107 return WorldToPrimitive.MotionBounds(primitive->WorldBound(), true);
00108 }
00109 private:
00110
00111 Reference<Primitive> primitive;
00112 const AnimatedTransform WorldToPrimitive;
00113 };
00114
00115
00116
00117
00118 class Aggregate : public Primitive {
00119 public:
00120
00121 const AreaLight *GetAreaLight() const;
00122 BSDF *GetBSDF(const DifferentialGeometry &dg,
00123 const Transform &, MemoryArena &) const;
00124 BSSRDF *GetBSSRDF(const DifferentialGeometry &dg,
00125 const Transform &, MemoryArena &) const;
00126 };
00127
00128
00129
00130 #endif // PBRT_CORE_PRIMITIVE_H