diff options
Diffstat (limited to 'libdimensionxx/dimensionxx')
-rw-r--r-- | libdimensionxx/dimensionxx/object.hpp | 43 | ||||
-rw-r--r-- | libdimensionxx/dimensionxx/texture.hpp | 115 |
2 files changed, 152 insertions, 6 deletions
diff --git a/libdimensionxx/dimensionxx/object.hpp b/libdimensionxx/dimensionxx/object.hpp index c661fa8..4c9dbff 100644 --- a/libdimensionxx/dimensionxx/object.hpp +++ b/libdimensionxx/dimensionxx/object.hpp @@ -25,10 +25,43 @@ namespace Dimension { - // Abstract base object class. Wraps a dmnsn_object*. + // Type to represent a ray-object intersection + class Intersection + { + public: + Intersection(const Line& ray, double t, const Texture& texture); + explicit Intersection(dmnsn_intersection *intersection); + // Intersection(const Intersection& intersection); + ~Intersection(); + + Line& ray() { return m_ray; } + const Line& ray() const { return m_ray; } + + double t() const { return dmnsn()->t; } + void t(double t) { dmnsn()->t = t; } + + const Texture& texture() const { return m_texture; } + + dmnsn_intersection* dmnsn(); + const dmnsn_intersection* dmnsn() const; + + dmnsn_intersection* release(); + + private: + // Copy-assignment prohibited + Intersection& operator=(const Intersection& intersection); + + std::tr1::shared_ptr<dmnsn_intersection*> m_intersection; + Line m_ray; + const Texture m_texture; + }; + + // Base object class. Wraps a dmnsn_object*. class Object { public: + // Wrap an existing object. + explicit Object(dmnsn_object* object); // Delete the object virtual ~Object(); @@ -37,11 +70,11 @@ namespace Dimension void trans(const Matrix& trans); // Object callbacks - virtual Array<double> intersections(const Line& l); + virtual Intersection intersection(const Line& l); virtual bool inside(const Vector& point); // Shallow-copy a derived object - virtual Object* copy() const = 0; + virtual Object* copy() const; // Access the wrapped C object dmnsn_object* dmnsn(); @@ -52,8 +85,6 @@ namespace Dimension Object(); // Shallow copy Object(const Object& object); - // Wrap an existing object. - explicit Object(dmnsn_object* object); // Is m_object unique? bool unique() const; @@ -75,7 +106,7 @@ namespace Dimension Custom_Object(); virtual ~Custom_Object(); - virtual Array<double> intersections(const Line& l) = 0; + virtual Intersection intersection(const Line& l) = 0; virtual bool inside(const Vector& point) = 0; }; diff --git a/libdimensionxx/dimensionxx/texture.hpp b/libdimensionxx/dimensionxx/texture.hpp new file mode 100644 index 0000000..7f42206 --- /dev/null +++ b/libdimensionxx/dimensionxx/texture.hpp @@ -0,0 +1,115 @@ +/************************************************************************* + * Copyright (C) 2009 Tavian Barnes <tavianator@gmail.com> * + * * + * This file is part of The Dimension Library. * + * * + * The Dimension Library is free software; you can redistribute it and/ * + * or modify it under the terms of the GNU Lesser General Public License * + * as published by the Free Software Foundation; either version 3 of the * + * License, or (at your option) any later version. * + * * + * The Dimension Library is distributed in the hope that it will be * + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty * + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this program. If not, see * + * <http://www.gnu.org/licenses/>. * + *************************************************************************/ + +// dmnsn_texture* wrapper. + +#ifndef DIMENSIONXX_TEXTURE_HPP +#define DIMENSIONXX_TEXTURE_HPP + +namespace Dimension +{ + // Pigment base class. Wraps a dmnsn_pigment*. + class Pigment + { + public: + explicit Pigment(dmnsn_pigment* pigment); + ~Pigment(); + + Pigment* copy() const; + + dmnsn_pigment* dmnsn(); + const dmnsn_pigment* dmnsn() const; + + protected: + // No-op + Pigment(); + // Shallow copy + Pigment(const Pigment& pigment); + + // Is m_pigment unique? + bool unique() const; + + private: + // Copy-assignment prohibited + Pigment& operator=(const Pigment&); + + std::tr1::shared_ptr<dmnsn_pigment*> m_pigment; + }; + + // Texture class. Wraps a dmnsn_texture*. + class Texture + { + public: + Texture(const Pigment& pigment); + explicit Texture(dmnsn_texture* texture); + // Texture(const Texture& texture); + ~Texture(); + + dmnsn_texture* dmnsn(); + const dmnsn_texture* dmnsn() const; + + private: + // Copy-assignment prohibited + Texture& operator=(const Texture&); + + std::tr1::shared_ptr<dmnsn_texture*> m_texture; + std::tr1::shared_ptr<Pigment> m_pigment; + }; + + // Array_Element specializations + + template <> + class Array_Element<Pigment> + : public Polymorphic_Array_Element<Pigment, dmnsn_pigment*> + { + public: + typedef dmnsn_pigment* C_Type; + + Array_Element() { } + Array_Element(Pigment& pigment) + : Polymorphic_Array_Element<Pigment, dmnsn_pigment*>(pigment) { } + Array_Element(C_Type c) + : Polymorphic_Array_Element<Pigment, dmnsn_pigment*>(c) { } + // Array_Element(const Array_Element& ae); + // ~Array_Element(); + + // Array_Element& operator=(const Array_Element& ae); + }; + + template <> + class Array_Element<Texture> + : public DMNSN_Array_Element<Texture, dmnsn_texture*> + { + public: + typedef dmnsn_texture* C_Type; + + Array_Element() { } + Array_Element(Texture& texture) + : DMNSN_Array_Element<Texture, dmnsn_texture*>(texture) { } + Array_Element(C_Type c) + : DMNSN_Array_Element<Texture, dmnsn_texture*>(c) { } + // Array_Element(const Array_Element& ae); + // ~Array_Element(); + + // Array_Element& operator=(const Array_Element& ae); + }; +} + +#endif /* DIMENSIONXX_TEXTURE_HPP */ |