Text archives Help
- From: abe@sci.utah.edu
- To: rtrt@sci.utah.edu
- Subject: [MANTA] r274 - branches/newPointVector/Model/Instances
- Date: Tue, 10 May 2005 13:38:31 -0600 (MDT)
Author: abe
Date: Tue May 10 13:38:30 2005
New Revision: 274
Modified:
branches/newPointVector/Model/Instances/Instance.cc
branches/newPointVector/Model/Instances/InstanceRST.cc
branches/newPointVector/Model/Instances/InstanceRT.cc
branches/newPointVector/Model/Instances/InstanceRT.h
branches/newPointVector/Model/Instances/InstanceST.cc
branches/newPointVector/Model/Instances/InstanceST.h
branches/newPointVector/Model/Instances/InstanceT.cc
Log:
Changes so Instances/ code compiles with new AffineTransform
Modified: branches/newPointVector/Model/Instances/Instance.cc
==============================================================================
--- branches/newPointVector/Model/Instances/Instance.cc (original)
+++ branches/newPointVector/Model/Instances/Instance.cc Tue May 10 13:38:30
2005
@@ -35,14 +35,14 @@
instance->computeBounds(context, ibox);
// Transform the eight corners of the child bounding box
- bbox.extend(transform * Point(ibox[0][0], ibox[0][1], ibox[0][2]));
- bbox.extend(transform * Point(ibox[0][0], ibox[0][1], ibox[1][2]));
- bbox.extend(transform * Point(ibox[0][0], ibox[1][1], ibox[0][2]));
- bbox.extend(transform * Point(ibox[0][0], ibox[1][1], ibox[1][2]));
- bbox.extend(transform * Point(ibox[1][0], ibox[0][1], ibox[0][2]));
- bbox.extend(transform * Point(ibox[1][0], ibox[0][1], ibox[1][2]));
- bbox.extend(transform * Point(ibox[1][0], ibox[1][1], ibox[0][2]));
- bbox.extend(transform * Point(ibox[1][0], ibox[1][1], ibox[1][2]));
+ bbox.extend(transform * Point(ibox.getMin()[0], ibox.getMin()[1],
ibox.getMin()[2]));
+ bbox.extend(transform * Point(ibox.getMin()[0], ibox.getMin()[1],
ibox.getMax()[2]));
+ bbox.extend(transform * Point(ibox.getMin()[0], ibox.getMax()[1],
ibox.getMin()[2]));
+ bbox.extend(transform * Point(ibox.getMin()[0], ibox.getMax()[1],
ibox.getMax()[2]));
+ bbox.extend(transform * Point(ibox.getMax()[0], ibox.getMin()[1],
ibox.getMin()[2]));
+ bbox.extend(transform * Point(ibox.getMax()[0], ibox.getMin()[1],
ibox.getMax()[2]));
+ bbox.extend(transform * Point(ibox.getMax()[0], ibox.getMax()[1],
ibox.getMin()[2]));
+ bbox.extend(transform * Point(ibox.getMax()[0], ibox.getMax()[1],
ibox.getMax()[2]));
}
void Instance::intersect(const RenderContext& context, RayPacket& rays) const
@@ -143,7 +143,7 @@
e.ray = old_rays[i];
e.hitInfo.overrideT(old_minT[i]);
- e.normal = transform * e.normal;
+ e.normal = transpose_mult(transform_inv,e.normal);
e.normal.normalize();
}
rays.resetFlag(RayPacket::HaveHitPositions);
Modified: branches/newPointVector/Model/Instances/InstanceRST.cc
==============================================================================
--- branches/newPointVector/Model/Instances/InstanceRST.cc (original)
+++ branches/newPointVector/Model/Instances/InstanceRST.cc Tue May 10
13:38:30 2005
@@ -51,14 +51,14 @@
instance->computeBounds(context, ibox);
// Transform the eight corners of the child bounding box
- bbox.extend(transform * Point(ibox[0][0], ibox[0][1], ibox[0][2]));
- bbox.extend(transform * Point(ibox[0][0], ibox[0][1], ibox[1][2]));
- bbox.extend(transform * Point(ibox[0][0], ibox[1][1], ibox[0][2]));
- bbox.extend(transform * Point(ibox[0][0], ibox[1][1], ibox[1][2]));
- bbox.extend(transform * Point(ibox[1][0], ibox[0][1], ibox[0][2]));
- bbox.extend(transform * Point(ibox[1][0], ibox[0][1], ibox[1][2]));
- bbox.extend(transform * Point(ibox[1][0], ibox[1][1], ibox[0][2]));
- bbox.extend(transform * Point(ibox[1][0], ibox[1][1], ibox[1][2]));
+ bbox.extend(transform * Point(ibox.getMin()[0], ibox.getMin()[1],
ibox.getMin()[2]));
+ bbox.extend(transform * Point(ibox.getMin()[0], ibox.getMin()[1],
ibox.getMax()[2]));
+ bbox.extend(transform * Point(ibox.getMin()[0], ibox.getMax()[1],
ibox.getMin()[2]));
+ bbox.extend(transform * Point(ibox.getMin()[0], ibox.getMax()[1],
ibox.getMax()[2]));
+ bbox.extend(transform * Point(ibox.getMax()[0], ibox.getMin()[1],
ibox.getMin()[2]));
+ bbox.extend(transform * Point(ibox.getMax()[0], ibox.getMin()[1],
ibox.getMax()[2]));
+ bbox.extend(transform * Point(ibox.getMax()[0], ibox.getMax()[1],
ibox.getMin()[2]));
+ bbox.extend(transform * Point(ibox.getMax()[0], ibox.getMax()[1],
ibox.getMax()[2]));
}
void InstanceRST::intersect(const RenderContext& context, RayPacket& rays)
const
@@ -145,7 +145,7 @@
e.ray = old_rays[i];
e.hitInfo.overrideT(old_minT[i]);
- e.normal = transform_inv * e.normal;
+ e.normal = transpose_mult(transform_inv,e.normal);
e.normal *= scale;
}
rays.resetFlag(RayPacket::HaveHitPositions);
Modified: branches/newPointVector/Model/Instances/InstanceRT.cc
==============================================================================
--- branches/newPointVector/Model/Instances/InstanceRT.cc (original)
+++ branches/newPointVector/Model/Instances/InstanceRT.cc Tue May 10
13:38:30 2005
@@ -9,26 +9,27 @@
using namespace Manta;
-InstanceRT::InstanceRT(Object* instance, const AffineTransform& transform)
- : instance(instance), transform(transform)
+InstanceRT::InstanceRT(Object* instance, const AffineTransform& transform_ )
+ : instance(instance), transform( transform_ ), transform_inv(
transform_.inverse() )
{
// By default, use the texture coordinates and material of the child object
tex = this;
material = this;
- transform.compute_imat();
+
// Determine the scale of the matrix. We could use eigenvalue analysis,
// but this seems easier: pass in the three axes and make sure that the
// transformed lengths are all the same
- Vector v1 = transform.project(Vector(1,0,0));
+ Vector v1 = transform * Vector(1,0,0);
double l1 = v1.normalize();
- Vector v2 = transform.project(Vector(0,1,0));
+ Vector v2 = transform * Vector(0,1,0);
double l2 = v2.normalize();
- Vector v3 = transform.project(Vector(0,0,1));
+ Vector v3 = transform * Vector(0,0,1);
double l3 = v3.normalize();
- if(Abs(l1-1) > 1.e-10 || Abs(l2-1) > 1.e-10 || Abs(l3-1) > 1.e-10){
+
+ if(SCIRun::Abs(l1-1) > 1.e-10 || SCIRun::Abs(l2-1) > 1.e-10 ||
SCIRun::Abs(l3-1) > 1.e-10){
ostringstream msg;
msg << "Nonuniform scale for InstanceRT, scalefactor=[" << l1 << ' '
- << l2 << ' ' << l3 << ']';
+ << l2 << ' ' << l3 << ']';
throw BadPrimitive(msg.str());
}
@@ -49,14 +50,15 @@
instance->computeBounds(context, ibox);
// Transform the eight corners of the child bounding box
- bbox.extend(transform.project(Point(ibox.min().x(), ibox.min().y(),
ibox.min().z())));
- bbox.extend(transform.project(Point(ibox.min().x(), ibox.min().y(),
ibox.max().z())));
- bbox.extend(transform.project(Point(ibox.min().x(), ibox.max().y(),
ibox.min().z())));
- bbox.extend(transform.project(Point(ibox.min().x(), ibox.max().y(),
ibox.max().z())));
- bbox.extend(transform.project(Point(ibox.max().x(), ibox.min().y(),
ibox.min().z())));
- bbox.extend(transform.project(Point(ibox.max().x(), ibox.min().y(),
ibox.max().z())));
- bbox.extend(transform.project(Point(ibox.max().x(), ibox.max().y(),
ibox.min().z())));
- bbox.extend(transform.project(Point(ibox.max().x(), ibox.max().y(),
ibox.max().z())));
+ bbox.extend(transform * Point(ibox.getMin()[0], ibox.getMin()[1],
ibox.getMin()[2]));
+ bbox.extend(transform * Point(ibox.getMin()[0], ibox.getMin()[1],
ibox.getMax()[2]));
+ bbox.extend(transform * Point(ibox.getMin()[0], ibox.getMax()[1],
ibox.getMin()[2]));
+ bbox.extend(transform * Point(ibox.getMin()[0], ibox.getMax()[1],
ibox.getMax()[2]));
+ bbox.extend(transform * Point(ibox.getMax()[0], ibox.getMin()[1],
ibox.getMin()[2]));
+ bbox.extend(transform * Point(ibox.getMax()[0], ibox.getMin()[1],
ibox.getMax()[2]));
+ bbox.extend(transform * Point(ibox.getMax()[0], ibox.getMax()[1],
ibox.getMin()[2]));
+ bbox.extend(transform * Point(ibox.getMax()[0], ibox.getMax()[1],
ibox.getMax()[2]));
+
}
void InstanceRT::intersect(const RenderContext& context, RayPacket& rays)
const
@@ -67,25 +69,27 @@
if(rays.getFlags() & RayPacket::ConstantOrigin){
RayPacket::Element& e0 = rays.get(0);
- Point O;
- transform.unproject(e0.ray.origin(), O);
+
+ Point o = transform_inv * e0.ray.origin();
+
for(int i = 0;i<rays.getSize();i++){
RayPacket::Element& e = rays.get(i);
RayPacket::Element& te = instance_rays.get(i);
- Vector dir;
- transform.unproject(e.ray.direction(), dir);
- te.ray.set(O, dir);
+
+ Vector dir = transform_inv * e.ray.direction();
+
+ te.ray.set(o, dir);
te.hitInfo.reset(e.hitInfo.minT());
}
} else {
for(int i = 0;i<rays.getSize();i++){
RayPacket::Element& e = rays.get(i);
RayPacket::Element& te = instance_rays.get(i);
- Point O;
- transform.unproject(e.ray.origin(), O);
- Vector dir;
- transform.unproject(e.ray.direction(), dir);
- te.ray.set(O, dir);
+
+ Point o = transform_inv * e.ray.origin();
+ Vector dir = transform_inv * e.ray.direction();
+
+ te.ray.set(o, dir);
te.hitInfo.reset(e.hitInfo.minT());
}
}
@@ -113,11 +117,11 @@
for(int i=0;i<rays.getSize();i++){
RayPacket::Element& e = rays.get(i);
old_rays[i] = e.ray;
- Point O;
- transform.unproject(e.ray.origin(), O);
- Vector dir;
- transform.unproject(e.ray.direction(), dir);
- e.ray.set(O, dir);
+
+ Point o = transform_inv * e.ray.origin();
+ Vector dir = transform_inv * e.ray.direction();
+
+ e.ray.set(o, dir);
}
rays.resetFlag(RayPacket::HaveHitPositions);
for(int i=0;i<rays.getSize();){
@@ -135,7 +139,7 @@
for(int i=0;i<rays.getSize();i++){
RayPacket::Element& e = rays.get(i);
e.ray = old_rays[i];
- transform.project_normal_inplace(e.normal);
+ e.normal = transpose_mult(transform_inv,e.normal);
}
rays.resetFlag(RayPacket::HaveHitPositions);
}
@@ -169,11 +173,11 @@
for(int i=0;i<rays.getSize();i++){
RayPacket::Element& e = rays.get(i);
old_rays[i] = e.ray;
- Point O;
- transform.unproject(e.ray.origin(), O);
- Vector dir;
- transform.unproject(e.ray.direction(), dir);
- e.ray.set(O, dir);
+
+ Point o = transform_inv * e.ray.origin();
+ Vector dir = transform_inv * e.ray.direction();
+
+ e.ray.set(o, dir);
}
rays.resetFlag(RayPacket::HaveHitPositions);
for(int i=0;i<rays.getSize();){
@@ -191,7 +195,7 @@
for(int i=0;i<rays.getSize();i++){
RayPacket::Element& e = rays.get(i);
e.ray = old_rays[i];
- transform.project_normal_inplace(e.normal);
+ e.normal = transform_inv * e.normal;
}
rays.resetFlag(RayPacket::HaveHitPositions);
}
@@ -205,11 +209,11 @@
for(int i=0;i<rays.getSize();i++){
RayPacket::Element& e = rays.get(i);
old_rays[i] = e.ray;
- Point O;
- transform.unproject(e.ray.origin(), O);
- Vector dir;
- transform.unproject(e.ray.direction(), dir);
- e.ray.set(O, dir);
+
+ Point o = transform * e.ray.origin();
+ Vector dir = transform * e.ray.direction();
+
+ e.ray.set(o, dir);
}
rays.resetFlag(RayPacket::HaveHitPositions);
for(int i=0;i<rays.getSize();){
@@ -227,7 +231,7 @@
for(int i=0;i<rays.getSize();i++){
RayPacket::Element& e = rays.get(i);
e.ray = old_rays[i];
- transform.project_normal_inplace(e.normal);
+ e.normal = transform_inv * e.normal;
}
rays.resetFlag(RayPacket::HaveHitPositions);
}
Modified: branches/newPointVector/Model/Instances/InstanceRT.h
==============================================================================
--- branches/newPointVector/Model/Instances/InstanceRT.h (original)
+++ branches/newPointVector/Model/Instances/InstanceRT.h Tue May 10
13:38:30 2005
@@ -11,7 +11,7 @@
class InstanceRT : public Primitive, public Material, public
TexCoordMapper {
public:
- InstanceRT(Object* instance, const Transform& transform);
+ InstanceRT(Object* instance, const AffineTransform& transform_);
virtual ~InstanceRT();
// Generic
@@ -34,11 +34,15 @@
RayPacket& rays) const;
void overrideMaterial(Material* material);
+
+
private:
Object* instance;
- AffineTransform transform;
Material* material;
const TexCoordMapper* tex;
+
+ AffineTransform transform;
+ AffineTransform transform_inv;
};
}
Modified: branches/newPointVector/Model/Instances/InstanceST.cc
==============================================================================
--- branches/newPointVector/Model/Instances/InstanceST.cc (original)
+++ branches/newPointVector/Model/Instances/InstanceST.cc Tue May 10
13:38:30 2005
@@ -32,15 +32,14 @@
{
BBox ibox;
instance->computeBounds(context, ibox);
- bbox.extend((ibox.min().asVector()*scale).asPoint()+translation);
- bbox.extend((ibox.max().asVector()*scale).asPoint()+translation);
+ bbox.extend(Point(Vector(ibox.getMin())*scale)+translation);
+ bbox.extend(Point(Vector(ibox.getMax())*scale)+translation);
}
void InstanceST::intersect(const RenderContext& context, RayPacket& rays)
const
{
RayPacketData raydata;
- RayPacket instance_rays(raydata, rays.getSize(), rays.getDepth(),
- rays.getFlags());
+ RayPacket instance_rays(raydata, rays.getSize(), rays.getDepth(),
rays.getFlags());
double scales[RayPacket::MaxSize];
double inv_scales[RayPacket::MaxSize];
@@ -48,48 +47,48 @@
double iscale = inv_scale.x();
if(rays.getFlags() & RayPacket::ConstantOrigin){
RayPacket::Element& e = rays.get(0);
- Point O((e.ray.origin()-translation)*iscale);
+ Point o( Vector(e.ray.origin()-translation)*iscale );
for(int i = 0;i<rays.getSize();i++){
- RayPacket::Element& e = rays.get(i);
- RayPacket::Element& te = instance_rays.get(i);
- te.ray.set(O, e.ray.direction());
- te.hitInfo.reset(e.hitInfo.minT()*iscale);
+ RayPacket::Element& e = rays.get(i);
+ RayPacket::Element& te = instance_rays.get(i);
+ te.ray.set(o, e.ray.direction());
+ te.hitInfo.reset(e.hitInfo.minT()*iscale);
}
} else {
for(int i = 0;i<rays.getSize();i++){
- RayPacket::Element& e = rays.get(i);
- RayPacket::Element& te = instance_rays.get(i);
- te.ray.set((e.ray.origin()-translation)*iscale, e.ray.direction());
- te.hitInfo.reset(e.hitInfo.minT()*iscale);
+ RayPacket::Element& e = rays.get(i);
+ RayPacket::Element& te = instance_rays.get(i);
+
te.ray.set(Point(Vector(e.ray.origin()-translation)*iscale),
e.ray.direction());
+ te.hitInfo.reset(e.hitInfo.minT()*iscale);
}
}
} else {
if(rays.getFlags() & RayPacket::ConstantOrigin){
RayPacket::Element& e = rays.get(0);
- Point O((e.ray.origin().asVector()-translation)*inv_scale);
+ Point o(Vector(e.ray.origin()-translation)*inv_scale);
for(int i = 0;i<rays.getSize();i++){
- RayPacket::Element& e = rays.get(i);
- RayPacket::Element& te = instance_rays.get(i);
- Vector dir(e.ray.direction()*inv_scale);
- double length = dir.length();
- inv_scales[i] = length;
- double ilength = 1./length;
- scales[i] = ilength;
- te.ray.set(O, dir*ilength);
- te.hitInfo.reset(e.hitInfo.minT()*length);
+ RayPacket::Element& e = rays.get(i);
+ RayPacket::Element& te = instance_rays.get(i);
+ Vector dir(e.ray.direction()*inv_scale);
+ double length = dir.length();
+ inv_scales[i] = length;
+ double ilength = 1./length;
+ scales[i] = ilength;
+ te.ray.set(o, dir*ilength);
+ te.hitInfo.reset(e.hitInfo.minT()*length);
}
} else {
for(int i = 0;i<rays.getSize();i++){
- RayPacket::Element& e = rays.get(i);
- RayPacket::Element& te = instance_rays.get(i);
- Vector dir(e.ray.direction()*inv_scale);
- double length = dir.length();
- scales[i] = length;
- double ilength = 1./length;
- inv_scales[i] = ilength;
- te.ray.set(Point((e.ray.origin().asVector()-translation)*inv_scale),
- dir*ilength);
- te.hitInfo.reset(e.hitInfo.minT()*length);
+ RayPacket::Element& e = rays.get(i);
+ RayPacket::Element& te = instance_rays.get(i);
+ Vector dir(e.ray.direction()*inv_scale);
+ double length = dir.length();
+ scales[i] = length;
+ double ilength = 1./length;
+ inv_scales[i] = ilength;
+
te.ray.set(Point((Vector(e.ray.origin())-translation)*inv_scale),
+ dir*ilength);
+ te.hitInfo.reset(e.hitInfo.minT()*length);
}
}
}
@@ -140,7 +139,7 @@
for(int i=0;i<rays.getSize();i++){
RayPacket::Element& e = rays.get(i);
old_origins[i] = e.ray.origin();
- e.ray.setOrigin((old_origins[i]-translation)*is);
+ e.ray.setOrigin(Point(Vector(old_origins[i]-translation)*is));
old_minT[i] = e.hitInfo.minT();
e.hitInfo.scaleT(is);
}
@@ -151,7 +150,7 @@
old_rays[i] = e.ray;
Vector dir(e.ray.direction()*inv_scale);
double ilength = rays.get(i).hitInfo.scratchpad<MPTscale>().scale;
- e.ray.set(Point((e.ray.origin().asVector()-translation)*inv_scale),
+ e.ray.set(Point((Vector(e.ray.origin())-translation)*inv_scale),
dir*ilength);
old_minT[i] = e.hitInfo.minT();
double length = rays.get(i).hitInfo.scratchpad<MPTscale>().inv_scale;
@@ -221,7 +220,7 @@
for(int i=0;i<rays.getSize();i++){
RayPacket::Element& e = rays.get(i);
old_origins[i] = e.ray.origin();
- e.ray.setOrigin((old_origins[i]-translation)*is);
+ e.ray.setOrigin(Point(Vector(old_origins[i]-translation)*is));
old_minT[i] = e.hitInfo.minT();
e.hitInfo.scaleT(is);
}
@@ -232,7 +231,7 @@
old_rays[i] = e.ray;
Vector dir(e.ray.direction()*inv_scale);
double ilength = rays.get(i).hitInfo.scratchpad<MPTscale>().scale;
- e.ray.set(Point((e.ray.origin().asVector()-translation)*inv_scale),
+ e.ray.set(Point((Vector(e.ray.origin())-translation)*inv_scale),
dir*ilength);
old_minT[i] = e.hitInfo.minT();
double length = rays.get(i).hitInfo.scratchpad<MPTscale>().inv_scale;
@@ -280,7 +279,7 @@
for(int i=0;i<rays.getSize();i++){
RayPacket::Element& e = rays.get(i);
old_origins[i] = e.ray.origin();
- e.ray.setOrigin((old_origins[i]-translation)*is);
+ e.ray.setOrigin(Point(Vector(old_origins[i]-translation)*is));
old_minT[i] = e.hitInfo.minT();
e.hitInfo.scaleT(is);
}
@@ -291,7 +290,7 @@
old_rays[i] = e.ray;
Vector dir(e.ray.direction()*inv_scale);
double ilength = rays.get(i).hitInfo.scratchpad<MPTscale>().scale;
- e.ray.set(Point((e.ray.origin().asVector()-translation)*inv_scale),
+ e.ray.set(Point((Vector(e.ray.origin())-translation)*inv_scale),
dir*ilength);
old_minT[i] = e.hitInfo.minT();
double length = rays.get(i).hitInfo.scratchpad<MPTscale>().inv_scale;
Modified: branches/newPointVector/Model/Instances/InstanceST.h
==============================================================================
--- branches/newPointVector/Model/Instances/InstanceST.h (original)
+++ branches/newPointVector/Model/Instances/InstanceST.h Tue May 10
13:38:30 2005
@@ -36,6 +36,7 @@
void overrideMaterial(Material* material);
private:
+
Object* instance;
Vector scale;
Vector translation;
Modified: branches/newPointVector/Model/Instances/InstanceT.cc
==============================================================================
--- branches/newPointVector/Model/Instances/InstanceT.cc (original)
+++ branches/newPointVector/Model/Instances/InstanceT.cc Tue May 10
13:38:30 2005
@@ -26,8 +26,8 @@
{
BBox ibox;
instance->computeBounds(context, ibox);
- bbox.extend(ibox.min()+translation);
- bbox.extend(ibox.max()+translation);
+ bbox.extend(ibox.getMin()+translation);
+ bbox.extend(ibox.getMax()+translation);
}
void InstanceT::intersect(const RenderContext& context, RayPacket& rays)
const
- [MANTA] r274 - branches/newPointVector/Model/Instances, abe, 05/10/2005
Archive powered by MHonArc 2.6.16.