Text archives Help
- From: thiago@sci.utah.edu
- To: manta@sci.utah.edu
- Subject: [Manta] r1847 - in trunk: Core/Geometry Model/Instances Model/Primitives
- Date: Mon, 12 Nov 2007 12:20:18 -0700 (MST)
Author: thiago
Date: Mon Nov 12 12:20:17 2007
New Revision: 1847
Modified:
trunk/Core/Geometry/AffineTransform.h
trunk/Model/Instances/Instance.cc
trunk/Model/Instances/Instance.h
trunk/Model/Primitives/Cone.cc
trunk/Model/Primitives/Cone.h
trunk/Model/Primitives/Torus.cc
trunk/Model/Primitives/Torus.h
Log:
Core/Geometry/AffineTransform.h:
-temporarily made mat public so I could varify it. Once some linking
issues are resolved, this can be private again.
Model/Instances/Instance.cc
Model/Instances/Instance.h
Model/Primitives/Torus.cc
Model/Primitives/Cone.cc
Model/Primitives/Torus.h
Model/Primitives/Cone.h :
-Added cloning and interpolation.
Modified: trunk/Core/Geometry/AffineTransform.h
==============================================================================
--- trunk/Core/Geometry/AffineTransform.h (original)
+++ trunk/Core/Geometry/AffineTransform.h Mon Nov 12 12:20:17 2007
@@ -114,8 +114,10 @@
// computations involving an inverse transpose.
Vector transpose_mult_point(const Vector& point) const;
Vector transpose_mult_vector(const Vector& vec) const;
+
+ Real mat[3][4]; //TODO: Once AffineTransformation is Interpolable,
+ //make this private again!.
private:
- Real mat[3][4];
// Pre-multiplication.
void pre_multiply(Real m[3][3]);
Modified: trunk/Model/Instances/Instance.cc
==============================================================================
--- trunk/Model/Instances/Instance.cc (original)
+++ trunk/Model/Instances/Instance.cc Mon Nov 12 12:20:17 2007
@@ -58,9 +58,60 @@
transform_inv = transform.inverse();
}
+Instance::Instance() : instance(NULL)
+{
+ // By default, use the texture coordinates of the child object
+ tex = this;
+}
+
Instance::~Instance()
{
}
+
+
+Primitive* Instance::clone(CloneDepth depth, Clonable* incoming)
+{
+ Instance *copy;
+ if (incoming)
+ copy = dynamic_cast<Instance*>(incoming);
+ else
+ copy = new Instance();
+
+ copy->tex = tex; //TODO: is this what we want to do with tex when
cloning?
+
+ copy->instance = reinterpret_cast<Object*>(instance->clone(depth,
copy->instance));
+ copy->setTransform(transform);
+ return copy;
+}
+
+Interpolable::InterpErr Instance::serialInterpolate(const
std::vector<keyframe_t> &keyframes)
+{
+ instance->serialInterpolate(keyframes);
+
+ for (int r=0; r<3; ++r)
+ for (int c=0; c<4; ++c)
+ transform.mat[r][c] = 0;
+
+ for (size_t i=0; i < keyframes.size(); ++i) {
+ Interpolable::keyframe_t kt = keyframes[i];
+ Instance *instance = dynamic_cast<Instance*>(keyframes[i].keyframe);
+ if (instance == NULL)
+ return notInterpolable;
+
+ //TODO: This is most likely not the right way to interpolate
+ //between two affine transform matrices. Furthermore, this should
+ //be implemented in the AffineTransform class.
+ for (int r=0; r<3; ++r)
+ for (int c=0; c<4; ++c)
+ transform.mat[r][c] += instance->transform.mat[r][c]*keyframes[i].t;
+ }
+
+ transform_inv = transform.inverse();
+
+ return success;
+}
+
+
void Instance::setTransform(AffineTransform new_transform) {
transform = new_transform;
Modified: trunk/Model/Instances/Instance.h
==============================================================================
--- trunk/Model/Instances/Instance.h (original)
+++ trunk/Model/Instances/Instance.h Mon Nov 12 12:20:17 2007
@@ -44,6 +44,9 @@
Instance(Object* instance, const AffineTransform& transform);
virtual ~Instance();
+ virtual Primitive* clone(CloneDepth depth, Clonable* incoming);
+ virtual InterpErr serialInterpolate(const std::vector<keyframe_t>
&keyframes);
+
// Functions for callbacks (must be pass by value)
void setTransform(AffineTransform new_transform);
@@ -75,6 +78,8 @@
// Transformation and its inverse.
AffineTransform transform;
AffineTransform transform_inv;
+
+ Instance();
};
}
Modified: trunk/Model/Primitives/Cone.cc
==============================================================================
--- trunk/Model/Primitives/Cone.cc (original)
+++ trunk/Model/Primitives/Cone.cc Mon Nov 12 12:20:17 2007
@@ -17,6 +17,38 @@
{
}
+Cone* Cone::clone(CloneDepth depth, Clonable* incoming)
+{
+ Cone *copy;
+ if (incoming)
+ copy = dynamic_cast<Cone*>(incoming);
+ else
+ copy = new Cone();
+
+ PrimitiveCommon::clone(depth, copy);
+ copy->r = r;
+ copy->h = h;
+ return copy;
+}
+
+Interpolable::InterpErr Cone::serialInterpolate(const
std::vector<keyframe_t> &keyframes)
+{
+ PrimitiveCommon::interpolate(keyframes);
+ h = 0.0f;
+ r = 0.0f;
+
+ for (size_t i=0; i < keyframes.size(); ++i) {
+ Interpolable::keyframe_t kt = keyframes[i];
+ Cone *cone = dynamic_cast<Cone*>(keyframes[i].keyframe);
+ if (cone == NULL)
+ return notInterpolable;
+ r += cone->r * keyframes[i].t;
+ h += cone->h * keyframes[i].t;
+ }
+ return success;
+}
+
+
void Cone::computeBounds(const PreprocessContext&, BBox& bbox) const
{
bbox.extendByBox(BBox(Vector(-r,-r,0), Vector(r,r,h)));
@@ -95,7 +127,7 @@
}
void Cone::computeTexCoords2(const RenderContext&,
- RayPacket& rays) const
+ RayPacket& rays) const
{
for(int i=rays.begin();i<rays.end();i++)
rays.setTexCoords(i, rays.scratchpad<Vector>(i));
@@ -103,7 +135,7 @@
}
void Cone::computeTexCoords3(const RenderContext& context,
- RayPacket& rays) const
+ RayPacket& rays) const
{
computeTexCoords2(context, rays);
}
Modified: trunk/Model/Primitives/Cone.h
==============================================================================
--- trunk/Model/Primitives/Cone.h (original)
+++ trunk/Model/Primitives/Cone.h Mon Nov 12 12:20:17 2007
@@ -13,17 +13,21 @@
Cone(Material* mat, Real radius, Real height);
virtual ~Cone();
+ virtual Cone* clone(CloneDepth depth, Clonable* incoming);
+ virtual InterpErr serialInterpolate(const std::vector<keyframe_t>
&keyframes);
+
virtual void computeBounds(const PreprocessContext& context,
BBox& bbox) const;
virtual void intersect(const RenderContext& context, RayPacket& rays)
const;
virtual void computeNormal(const RenderContext& context, RayPacket
&rays) const;
virtual void computeTexCoords2(const RenderContext& context,
- RayPacket& rays) const;
+ RayPacket& rays) const;
virtual void computeTexCoords3(const RenderContext& context,
- RayPacket& rays) const;
+ RayPacket& rays) const;
private:
Real r, h;
+ Cone(){ }
};
}
Modified: trunk/Model/Primitives/Torus.cc
==============================================================================
--- trunk/Model/Primitives/Torus.cc (original)
+++ trunk/Model/Primitives/Torus.cc Mon Nov 12 12:20:17 2007
@@ -137,6 +137,37 @@
{
}
+Torus* Torus::clone(CloneDepth depth, Clonable* incoming)
+{
+ Torus *copy;
+ if (incoming)
+ copy = dynamic_cast<Torus*>(incoming);
+ else
+ copy = new Torus();
+
+ PrimitiveCommon::clone(depth, copy);
+ copy->minor_radius = minor_radius;
+ copy->major_radius = major_radius;
+ return copy;
+}
+
+Interpolable::InterpErr Torus::serialInterpolate(const
std::vector<keyframe_t> &keyframes)
+{
+ PrimitiveCommon::interpolate(keyframes);
+ minor_radius = 0.0f;
+ major_radius = 0.0f;
+
+ for (size_t i=0; i < keyframes.size(); ++i) {
+ Interpolable::keyframe_t kt = keyframes[i];
+ Torus *torus = dynamic_cast<Torus*>(keyframes[i].keyframe);
+ if (torus == NULL)
+ return notInterpolable;
+ minor_radius += torus->minor_radius * keyframes[i].t;
+ major_radius += torus->major_radius * keyframes[i].t;
+ }
+ return success;
+}
+
void Torus::computeBounds(const PreprocessContext&, BBox& bbox) const
{
bbox.extendByBox(BBox( Vector( -major_radius - minor_radius, -major_radius
- minor_radius, -minor_radius ),
Modified: trunk/Model/Primitives/Torus.h
==============================================================================
--- trunk/Model/Primitives/Torus.h (original)
+++ trunk/Model/Primitives/Torus.h Mon Nov 12 12:20:17 2007
@@ -11,6 +11,9 @@
public:
Torus(Material* mat, double minor_radius, double major_radius);
+ virtual Torus* clone(CloneDepth depth, Clonable* incoming);
+ virtual InterpErr serialInterpolate(const std::vector<keyframe_t>
&keyframes);
+
virtual void computeBounds(const PreprocessContext& context,
BBox& bbox) const;
virtual void intersect(const RenderContext& context, RayPacket& rays)
const;
@@ -22,6 +25,7 @@
private:
double minor_radius, major_radius;
+ Torus(){ }
};
}
- [Manta] r1847 - in trunk: Core/Geometry Model/Instances Model/Primitives, thiago, 11/12/2007
Archive powered by MHonArc 2.6.16.