PBRT
/home/felix/UBC/projects/AdaptiveLightfieldSampling/pbrt_v2/src/shapes/trianglemesh.h
00001 
00002 /*
00003     pbrt source code Copyright(c) 1998-2012 Matt Pharr and Greg Humphreys.
00004 
00005     This file is part of pbrt.
00006 
00007     Redistribution and use in source and binary forms, with or without
00008     modification, are permitted provided that the following conditions are
00009     met:
00010 
00011     - Redistributions of source code must retain the above copyright
00012       notice, this list of conditions and the following disclaimer.
00013 
00014     - Redistributions in binary form must reproduce the above copyright
00015       notice, this list of conditions and the following disclaimer in the
00016       documentation and/or other materials provided with the distribution.
00017 
00018     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
00019     IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
00020     TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
00021     PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
00022     HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
00023     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
00024     LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00025     DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00026     THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00027     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00028     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00029 
00030  */
00031 
00032 #if defined(_MSC_VER)
00033 #pragma once
00034 #endif
00035 
00036 #ifndef PBRT_SHAPES_TRIANGLEMESH_H
00037 #define PBRT_SHAPES_TRIANGLEMESH_H
00038 
00039 // shapes/trianglemesh.h*
00040 #include "shape.h"
00041 #include <map>
00042 using std::map;
00043 
00044 // TriangleMesh Declarations
00045 class TriangleMesh : public Shape {
00046 public:
00047     // TriangleMesh Public Methods
00048     TriangleMesh(const Transform *o2w, const Transform *w2o, bool ro,
00049                  int ntris, int nverts, const int *vptr,
00050                  const Point *P, const Normal *N, const Vector *S,
00051                  const float *uv, const Reference<Texture<float> > &atex);
00052     ~TriangleMesh();
00053     BBox ObjectBound() const;
00054     BBox WorldBound() const;
00055     bool CanIntersect() const { return false; }
00056     void Refine(vector<Reference<Shape> > &refined) const;
00057     friend class Triangle;
00058     template <typename T> friend class VertexTexture;
00059 protected:
00060     // TriangleMesh Protected Data
00061     int ntris, nverts;
00062     int *vertexIndex;
00063     Point *p;
00064     Normal *n;
00065     Vector *s;
00066     float *uvs;
00067     Reference<Texture<float> > alphaTexture;
00068 };
00069 
00070 
00071 class Triangle : public Shape {
00072 public:
00073     // Triangle Public Methods
00074     Triangle(const Transform *o2w, const Transform *w2o, bool ro,
00075              TriangleMesh *m, int n)
00076         : Shape(o2w, w2o, ro) {
00077         mesh = m;
00078         v = &mesh->vertexIndex[3*n];
00079         PBRT_CREATED_TRIANGLE(this);
00080     }
00081     BBox ObjectBound() const;
00082     BBox WorldBound() const;
00083     bool Intersect(const Ray &ray, float *tHit, float *rayEpsilon,
00084                    DifferentialGeometry *dg) const;
00085     bool IntersectP(const Ray &ray) const;
00086     void GetUVs(float uv[3][2]) const {
00087         if (mesh->uvs) {
00088             uv[0][0] = mesh->uvs[2*v[0]];
00089             uv[0][1] = mesh->uvs[2*v[0]+1];
00090             uv[1][0] = mesh->uvs[2*v[1]];
00091             uv[1][1] = mesh->uvs[2*v[1]+1];
00092             uv[2][0] = mesh->uvs[2*v[2]];
00093             uv[2][1] = mesh->uvs[2*v[2]+1];
00094         }
00095         else {
00096             uv[0][0] = 0.; uv[0][1] = 0.;
00097             uv[1][0] = 1.; uv[1][1] = 0.;
00098             uv[2][0] = 1.; uv[2][1] = 1.;
00099         }
00100     }
00101     float Area() const;
00102     virtual void GetShadingGeometry(const Transform &obj2world,
00103             const DifferentialGeometry &dg,
00104             DifferentialGeometry *dgShading) const;
00105     Point Sample(float u1, float u2, Normal *Ns) const;
00106 private:
00107     // Triangle Private Data
00108     Reference<TriangleMesh> mesh;
00109     int *v;
00110 };
00111 
00112 
00113 TriangleMesh *CreateTriangleMeshShape(const Transform *o2w, const Transform *w2o,
00114     bool reverseOrientation, const ParamSet &params,
00115     map<string, Reference<Texture<float> > > *floatTextures = NULL);
00116 
00117 #endif // PBRT_SHAPES_TRIANGLEMESH_H