Text archives Help
- From: bigler@sci.utah.edu
- To: manta@sci.utah.edu
- Subject: [MANTA] r819 - in branches/vertical: Core/Color Interface Model Model/Instances Model/Lights Model/Primitives SwigInterface scenes
- Date: Wed, 4 Jan 2006 22:09:44 -0700 (MST)
Author: bigler
Date: Wed Jan 4 22:09:43 2006
New Revision: 819
Modified:
branches/vertical/Core/Color/ColorSpace.h
branches/vertical/Interface/RayPacket.h
branches/vertical/Model/CMakeLists.txt
branches/vertical/Model/Instances/Instance.cc
branches/vertical/Model/Instances/InstanceRST.cc
branches/vertical/Model/Instances/InstanceRT.cc
branches/vertical/Model/Instances/InstanceST.cc
branches/vertical/Model/Instances/InstanceT.cc
branches/vertical/Model/Lights/CMakeLists.txt
branches/vertical/Model/Lights/HeadLight.cc
branches/vertical/Model/Lights/HeadLight.h
branches/vertical/Model/Lights/PointLight.cc
branches/vertical/Model/Lights/PointLight.h
branches/vertical/Model/Primitives/HeavyTriangle.cc
branches/vertical/SwigInterface/manta.i
branches/vertical/scenes/objviewer.cc
Log:
Core/Color/ColorSpace.h
Added some code for indexing for the SWIG interface.
Interface/RayPacket.h
For now, until it gets yanked, the HaveUnitNormals flag does not
imply HaveNormals.
Added some comments to the top level constructor.
Added setOrigin, scaleMinT, and overrideMinT functions.
Removed hitMatl function. That functionality exists in the
getHitMaterial function.
Normals are not made sure to be normalized. This code should go
away when we force all computeNormal functions to do it there.
Model/CMakeLists.txt
Added Instances back.
Model/Instances/Instance.cc
Model/Instances/InstanceRST.cc
Model/Instances/InstanceRT.cc
Model/Instances/InstanceST.cc
Model/Instances/InstanceT.cc
Compiles for the new RayPacket interface.
Some computeTexCoords3 functions were calling computeTexCoords2. I
fixed that.
For Instance.cc the normal is now scaled like in other scaling
codes.
Model/Lights/CMakeLists.txt
Added HeadLight compilation back in alphabetical order.
Model/Lights/HeadLight.cc
Model/Lights/HeadLight.h
Updated for new interface to computeLight().
Model/Lights/PointLight.cc
Model/Lights/PointLight.h
Text formatting.
Model/Primitives/HeavyTriangle.cc
Normalize the normals.
SwigInterface/manta.i
Remove HitInfo (not there anymore).
Move RayPacket lower to help resolve new dependencies.
scenes/objviewer.cc
Cast specular Ns to int to reduce warnings.
Modified: branches/vertical/Core/Color/ColorSpace.h
==============================================================================
--- branches/vertical/Core/Color/ColorSpace.h (original)
+++ branches/vertical/Core/Color/ColorSpace.h Wed Jan 4 22:09:43 2006
@@ -33,6 +33,7 @@
~ColorSpace() {
}
+#ifndef SWIG
// Access individual components
const ComponentType& operator[](int i) const
{
@@ -42,6 +43,13 @@
{
return data[i];
}
+#else
+ %extend {
+ ComponentType& __getitem__( int i ) {
+ return self->operator[](i);
+ }
+ }
+#endif
// These are the fixpoints, rather than true colors black and white
// black is the fixpoint under addition
Modified: branches/vertical/Interface/RayPacket.h
==============================================================================
--- branches/vertical/Interface/RayPacket.h (original)
+++ branches/vertical/Interface/RayPacket.h Wed Jan 4 22:09:43 2006
@@ -69,18 +69,22 @@
HaveHitRecords = 0x0020,
HaveTexture3 = 0x0040,
HaveTexture2 = 0x0080,
- // HaveFrame = 0x0100,
+ HaveUnitNormals = 0x0100, // Used by prims that set
+ // whether the normals computed
+ // have been normalized.
HaveNormals = 0x0200,
- HaveUnitNormals = 0x0300,
-
HaveInverseDirections = 0x0400,
HaveSigns = 0x0800,
ConstantSigns = 0x1000
};
- // Create a "toplevel" raypacket
- RayPacket(RayPacketData& data, int rayBegin, int rayEnd, int depth, int
flags)
- : data(&data), rayBegin(rayBegin), rayEnd(rayEnd), depth(depth),
flags(flags)
+ // Create a "toplevel" raypacket. You need to call resetHits or
+ // resetHit for every data element in the ray packet before you
+ // start intersecting. This will initialize minT and hitMatl.
+ RayPacket(RayPacketData& data, int rayBegin, int rayEnd, int depth,
+ int flags)
+ : data(&data), rayBegin(rayBegin), rayEnd(rayEnd), depth(depth),
+ flags(flags)
{
}
@@ -172,6 +176,11 @@
return Ray(Point(data->origin[0][which], data->origin[1][which],
data->origin[2][which]),
Vector(data->direction[0][which],
data->direction[1][which], data->direction[2][which]));
}
+ void setOrigin(int which, const Point& origin)
+ {
+ for(int i=0;i<3;i++)
+ data->origin[i][which] = origin[i];
+ }
void setDirection(int which, const Vector& direction)
{
for(int i=0;i<3;i++)
@@ -271,6 +280,14 @@
{
return data->minT[which];
}
+ void scaleMinT(int which, Real scale)
+ {
+ data->minT[which] *= scale;
+ }
+ void overrideMinT(int which, Real minT)
+ {
+ data->minT[which] = minT;
+ }
bool hit(int which, Real t, const Material* matl, const Primitive* prim,
const TexCoordMapper* tex) {
if(t < T_EPSILON)
@@ -289,10 +306,7 @@
{
return data->hitMatl[which] != 0;
}
- const Material* hitMatl(int which)
- {
- return data->hitMatl[which];
- }
+
void setHitMaterial(int which, const Material* matl)
{
data->hitMatl[which] = matl;
@@ -405,7 +419,7 @@
{
if(flags & HaveNormals)
return;
-
+
// Compute normals
for(int i=rayBegin;i<rayEnd;){
const Primitive* prim = data->hitPrim[i];
@@ -414,10 +428,21 @@
tend++;
RayPacket subPacket(*this, i, tend);
prim->computeNormal(context, subPacket);
+ if (subPacket.flags & HaveUnitNormals == 0) {
+ // Normalize the normals if they haven't been.
+ for(int s=i;s<tend;++s){
+ Real sum = 0;
+ for(int j=0;j<3;++j)
+ sum += data->normal[j][s] * data->normal[j][s];
+ Real scale = 1/SCIRun::Sqrt(sum);
+ for(int j=0;j<3;++j)
+ data->normal[j][i] *= scale;
+ }
+ }
i=tend;
}
-
- flags |= HaveNormals;
+
+ flags |= HaveNormals | HaveUnitNormals;
}
void normalizeNormals()
{
Modified: branches/vertical/Model/CMakeLists.txt
==============================================================================
--- branches/vertical/Model/CMakeLists.txt (original)
+++ branches/vertical/Model/CMakeLists.txt Wed Jan 4 22:09:43 2006
@@ -7,7 +7,7 @@
INCLUDE (Materials/CMakeLists.txt)
INCLUDE (Primitives/CMakeLists.txt)
INCLUDE (TexCoordMappers/CMakeLists.txt)
-#INCLUDE (Instances/CMakeLists.txt)
+INCLUDE (Instances/CMakeLists.txt)
INCLUDE (MiscObjects/CMakeLists.txt)
INCLUDE (Readers/CMakeLists.txt)
INCLUDE (Intersections/CMakeLists.txt)
Modified: branches/vertical/Model/Instances/Instance.cc
==============================================================================
--- branches/vertical/Model/Instances/Instance.cc (original)
+++ branches/vertical/Model/Instances/Instance.cc Wed Jan 4 22:09:43
2006
@@ -49,8 +49,7 @@
Real inv_scales[RayPacket::MaxSize];
if(rays.getFlag(RayPacket::ConstantOrigin)){
- int ray0 = rays.begin();
- Point o = transform_inv * rays.getOrigin(ray0);
+ Point o = transform_inv * rays.getOrigin(rays.begin());
for(int i = rays.begin();i<rays.end();i++){
Vector dir = transform_inv * rays.getDirection(i);
@@ -82,11 +81,10 @@
Real s = scales[i];
if(rays.hit(i, instance_rays.getMinT(i)*s, material, this, tex)){
// Instance is now the closest
- Real is = inv_scales[i];
rays.scratchpad<MPTscale>(i) =
MPTscale(instance_rays.getHitMaterial(i),
instance_rays.getHitPrimitive(i),
instance_rays.getHitTexCoordMapper(i),
- s, is);
+ s, inv_scales[i]);
}
}
}
@@ -100,17 +98,20 @@
// Save the original rays
for(int i=rays.begin();i<rays.end();i++){
old_rays[i] = rays.getRay(i);
- Point o = transform_inv * rays.getOrigin(i);
- Vector dir = transform_inv * rays.getDirection(i);
+
+ Point o = transform_inv * old_rays[i].origin();
+ Vector dir = transform_inv * old_rays[i].direction();
Real scale = rays.scratchpad<MPTscale>(i).scale;
- e.ray.set(o, dir*scale);
- old_minT[i] = e.hitInfo.minT();
+ rays.setRay(i, o, dir*scale);
+ old_minT[i] = rays.getMinT(i);
Real inv_scale = rays.scratchpad<MPTscale>(i).inv_scale;
- e.hitInfo.scaleT(inv_scale);
+ rays.scaleMinT(i, inv_scale);
}
rays.resetFlag(RayPacket::HaveHitPositions);
+ // Try to create a ray packet that all use the same child primitive
+ // to compute normals.
for(int i=rays.begin();i<rays.end();){
const Primitive* prim = rays.scratchpad<MPT>(i).primitive;
int end = i+1;
@@ -120,13 +121,14 @@
prim->computeNormal(context, subPacket);
i = end;
}
-
- // Put the origins and minT back, scale normal
+
+ // Put the rays and minT back, scale normal
for(int i=rays.begin();i<rays.end();i++){
rays.setRay(i, old_rays[i]);
- rays.overrideT(i, old_minT[i]);
+ rays.overrideMinT(i, old_minT[i]);
- rays.setNormal(transpose_mult(transform_inv,e.normal).normal());
+ Real scale = rays.scratchpad<MPTscale>(i).scale;
+ rays.setNormal(i, transpose_mult(transform_inv,rays.getNormal(i)) *
scale);
}
rays.resetFlag(RayPacket::HaveHitPositions);
}
@@ -141,8 +143,10 @@
for(int i=rays.begin();i<rays.end();){
const Material* matl = rays.scratchpad<MPT>(i).material;
int end = i+1;
+
while(end < rays.end() && rays.scratchpad<MPT>(end).material == matl)
end++;
+
RayPacket subPacket(rays, i, end);
matl->shade(context, subPacket);
i = end;
@@ -159,14 +163,14 @@
for(int i=rays.begin();i<rays.end();i++){
old_rays[i] = rays.getRay(i);
- Point o = transform_inv * e.ray.origin();
- Vector dir = transform_inv * e.ray.direction();
+ Point o = transform_inv * old_rays[i].origin();
+ Vector dir = transform_inv * old_rays[i].direction();
Real scale = rays.scratchpad<MPTscale>(i).scale;
- e.ray.set(o, dir*scale);
- old_minT[i] = e.hitInfo.minT();
+ rays.setRay(i, o, dir*scale);
+ old_minT[i] = rays.getMinT(i);
Real inv_scale = rays.scratchpad<MPTscale>(i).inv_scale;
- e.hitInfo.scaleT(inv_scale);
+ rays.scaleMinT(i, inv_scale);
}
rays.resetFlag(RayPacket::HaveHitPositions);
@@ -180,10 +184,10 @@
i = end;
}
- // Put the origins and minT back
+ // Put the rays and minT back
for(int i=rays.begin();i<rays.end();i++){
rays.setRay(i, old_rays[i]);
- rays.overrideT(i, old_minT[i]);
+ rays.overrideMinT(i, old_minT[i]);
}
rays.resetFlag(RayPacket::HaveHitPositions);
}
@@ -198,14 +202,14 @@
for(int i=rays.begin();i<rays.end();i++){
old_rays[i] = rays.getRay(i);
- Point o = transform_inv * rays.getOrigin(i);
- Vector dir = transform_inv * rays.getDirection(i);
+ Point o = transform_inv * old_rays[i].origin();
+ Vector dir = transform_inv * old_rays[i].direction();
Real scale = rays.scratchpad<MPTscale>(i).scale;
- e.ray.set(o, dir*scale);
- old_minT[i] = e.hitInfo.minT();
+ rays.setRay(i, o, dir*scale);
+ old_minT[i] = rays.getMinT(i);
Real inv_scale = rays.scratchpad<MPTscale>(i).inv_scale;
- e.hitInfo.scaleT(inv_scale);
+ rays.scaleMinT(i, inv_scale);
}
rays.resetFlag(RayPacket::HaveHitPositions);
@@ -215,14 +219,14 @@
while(end < rays.end() && rays.scratchpad<MPT>(end).tex == tex)
end++;
RayPacket subPacket(rays, i, end);
- tex->computeTexCoords2(context, subPacket);
+ tex->computeTexCoords3(context, subPacket);
i = end;
}
- // Put the origins and minT back, scale normal
+ // Put the rays and minT back, scale normal
for(int i=rays.begin();i<rays.end();i++){
rays.setRay(i, old_rays[i]);
- rays.overrideT(i, old_minT[i]);
+ rays.overrideMinT(i, old_minT[i]);
}
rays.resetFlag(RayPacket::HaveHitPositions);
}
Modified: branches/vertical/Model/Instances/InstanceRST.cc
==============================================================================
--- branches/vertical/Model/Instances/InstanceRST.cc (original)
+++ branches/vertical/Model/Instances/InstanceRST.cc Wed Jan 4 22:09:43
2006
@@ -4,6 +4,7 @@
#include <Core/Exceptions/BadPrimitive.h>
#include <Core/Geometry/BBox.h>
#include <Core/Math/MiscMath.h>
+#include <Model/Instances/MPT.h>
#include <sstream>
using namespace std;
@@ -63,33 +64,32 @@
rays.getAllFlags());
if(rays.getFlag(RayPacket::ConstantOrigin)){
- int ray0 = rays.begin();
- Point o = transform_inv * rays.getOrigin(ray0);
+ Point o = transform_inv * rays.getOrigin(rays.begin());
for(int i = rays.begin();i<rays.end();i++){
Vector dir = transform_inv * rays.getDirection(i);
- te.ray.set(o, dir*scale);
- te.hitInfo.reset(e.hitInfo.minT()*inv_scale);
+ instance_rays.setRay(i, o, dir*scale);
+ instance_rays.resetHit(i, rays.getMinT(i)*inv_scale);
}
} else {
for(int i = rays.begin();i<rays.end();i++){
Point o = transform_inv * rays.getOrigin(i);
Vector dir = transform_inv * rays.getDirection(i);
- te.ray.set(o, dir*scale);
- te.hitInfo.reset(e.hitInfo.minT()*inv_scale);
+ instance_rays.setRay(i, o, dir*scale);
+ instance_rays.resetHit(i, rays.getMinT(i)*inv_scale);
}
}
instance->intersect(context, instance_rays);
for(int i=rays.begin();i<rays.end();i++){
if(instance_rays.wasHit(i)){
// Instance was hit
- if(rays.hit(i, te.hitInfo.minT()*scale, material, this, tex)){
+ if(rays.hit(i, instance_rays.getMinT(i)*scale, material, this, tex)){
// Instance is now the closest
- e.hitInfo.scratchpad<MPT>() = MPT(te.hitInfo.hitMaterial(),
- te.hitInfo.hitPrimitive(),
- te.hitInfo.hitTexCoordMapper());
+ rays.scratchpad<MPT>(i) = MPT(instance_rays.getHitMaterial(i),
+ instance_rays.getHitPrimitive(i),
+ instance_rays.getHitTexCoordMapper(i));
}
}
}
@@ -102,34 +102,35 @@
// Save the original rays
for(int i=rays.begin();i<rays.end();i++){
- old_rays[i] = e.ray;
+ old_rays[i] = rays.getRay(i);
- Point o = transform_inv * e.ray.origin();
- Vector dir = transform_inv * e.ray.direction();
+ Point o = transform_inv * old_rays[i].origin();
+ Vector dir = transform_inv * old_rays[i].direction();
- e.ray.set(o, dir*scale);
- old_minT[i] = e.hitInfo.minT();
- e.hitInfo.scaleT(inv_scale);
+ rays.setRay(i, o, dir*scale);
+ old_minT[i] = rays.getMinT(i);
+ rays.scaleMinT(i, inv_scale);
}
rays.resetFlag(RayPacket::HaveHitPositions);
+ // Try to create a ray packet that all use the same child primitive
+ // to compute normals.
for(int i=rays.begin();i<rays.end();){
- const Primitive* prim = e.hitInfo.scratchpad<MPT>().primitive;
+ const Primitive* prim = rays.scratchpad<MPT>(i).primitive;
int end = i+1;
- while(end < rays.end() &&
rays.get(end).hitInfo.scratchpad<MPT>().primitive == prim)
+ while(end < rays.end() && rays.scratchpad<MPT>(end).primitive == prim)
end++;
RayPacket subPacket(rays, i, end);
prim->computeNormal(context, subPacket);
i = end;
}
-
- // Put the origins and minT back, scale normal
+
+ // Put the rays and minT back, scale normal
for(int i=rays.begin();i<rays.end();i++){
- e.ray = old_rays[i];
- e.hitInfo.overrideT(old_minT[i]);
+ rays.setRay(i, old_rays[i]);
+ rays.overrideMinT(i, old_minT[i]);
- e.normal = transpose_mult(transform_inv,e.normal);
- e.normal *= scale;
+ rays.setNormal(i, transpose_mult(transform_inv,rays.getNormal(i)) *
scale);
}
rays.resetFlag(RayPacket::HaveHitPositions);
}
@@ -142,10 +143,10 @@
void InstanceRST::shade(const RenderContext& context, RayPacket& rays) const
{
for(int i=rays.begin();i<rays.end();){
- const Material* matl = e.hitInfo.scratchpad<MPT>().material;
+ const Material* matl = rays.scratchpad<MPT>(i).material;
int end = i+1;
- while(end < rays.end() &&
rays.get(end).hitInfo.scratchpad<MPT>().material == matl)
+ while(end < rays.end() && rays.scratchpad<MPT>(end).material == matl)
end++;
RayPacket subPacket(rays, i, end);
@@ -162,31 +163,31 @@
// Save the original rays
for(int i=rays.begin();i<rays.end();i++){
- old_rays[i] = e.ray;
+ old_rays[i] = rays.getRay(i);
- Point o = transform_inv * e.ray.origin();
- Vector dir = transform_inv * e.ray.direction();
+ Point o = transform_inv * old_rays[i].origin();
+ Vector dir = transform_inv * old_rays[i].direction();
- e.ray.set(o, dir*scale);
- old_minT[i] = e.hitInfo.minT();
- e.hitInfo.scaleT(inv_scale);
+ rays.setRay(i, o, dir*scale);
+ old_minT[i] = rays.getMinT(i);
+ rays.scaleMinT(i, inv_scale);
}
rays.resetFlag(RayPacket::HaveHitPositions);
for(int i=rays.begin();i<rays.end();){
- const TexCoordMapper* tex = e.hitInfo.scratchpad<MPT>().tex;
+ const TexCoordMapper* tex = rays.scratchpad<MPT>(i).tex;
int end = i+1;
- while(end < rays.end() && rays.get(end).hitInfo.scratchpad<MPT>().tex ==
tex)
+ while(end < rays.end() && rays.scratchpad<MPT>(end).tex == tex)
end++;
RayPacket subPacket(rays, i, end);
tex->computeTexCoords2(context, subPacket);
i = end;
}
- // Put the origins and minT back
+ // Put the rays and minT back
for(int i=rays.begin();i<rays.end();i++){
- e.ray = old_rays[i];
- e.hitInfo.overrideT(old_minT[i]);
+ rays.setRay(i, old_rays[i]);
+ rays.overrideMinT(i, old_minT[i]);
}
rays.resetFlag(RayPacket::HaveHitPositions);
}
@@ -199,32 +200,31 @@
// Save the original rays
for(int i=rays.begin();i<rays.end();i++){
- RayPacket::Element& e = rays.get(i);
- old_rays[i] = e.ray;
+ old_rays[i] = rays.getRay(i);
- Point o = transform_inv * e.ray.origin();
- Vector dir = transform_inv * e.ray.direction();
+ Point o = transform_inv * old_rays[i].origin();
+ Vector dir = transform_inv * old_rays[i].direction();
- e.ray.set(o, dir*scale);
- old_minT[i] = e.hitInfo.minT();
- e.hitInfo.scaleT(inv_scale);
+ rays.setRay(i, o, dir*scale);
+ old_minT[i] = rays.getMinT(i);
+ rays.scaleMinT(i, inv_scale);
}
rays.resetFlag(RayPacket::HaveHitPositions);
for(int i=rays.begin();i<rays.end();){
- const TexCoordMapper* tex = e.hitInfo.scratchpad<MPT>().tex;
+ const TexCoordMapper* tex = rays.scratchpad<MPT>(i).tex;
int end = i+1;
- while(end < rays.end() && rays.get(end).hitInfo.scratchpad<MPT>().tex ==
tex)
+ while(end < rays.end() && rays.scratchpad<MPT>(end).tex == tex)
end++;
RayPacket subPacket(rays, i, end);
- tex->computeTexCoords2(context, subPacket);
+ tex->computeTexCoords3(context, subPacket);
i = end;
}
- // Put the origins and minT back, scale normal
+ // Put the rays and minT back
for(int i=rays.begin();i<rays.end();i++){
- e.ray = old_rays[i];
- e.hitInfo.overrideT(old_minT[i]);
+ rays.setRay(i, old_rays[i]);
+ rays.overrideMinT(i, old_minT[i]);
}
rays.resetFlag(RayPacket::HaveHitPositions);
}
Modified: branches/vertical/Model/Instances/InstanceRT.cc
==============================================================================
--- branches/vertical/Model/Instances/InstanceRT.cc (original)
+++ branches/vertical/Model/Instances/InstanceRT.cc Wed Jan 4 22:09:43
2006
@@ -1,5 +1,6 @@
#include <Model/Instances/InstanceRT.h>
+#include <Model/Instances/MPT.h>
#include <Interface/RayPacket.h>
#include <Core/Exceptions/BadPrimitive.h>
#include <Core/Geometry/BBox.h>
@@ -61,33 +62,32 @@
rays.getAllFlags());
if(rays.getFlag(RayPacket::ConstantOrigin)){
- int ray0 = rays.begin();
- Point o = transform_inv * rays,getOrigin(ray0);
+ Point o = transform_inv * rays.getOrigin(rays.begin());
for(int i = rays.begin();i<rays.end();i++){
- Vector dir = transform_inv * e.ray.direction();
+ Vector dir = transform_inv * rays.getDirection(i);
- te.ray.set(o, dir);
- te.hitInfo.reset(e.hitInfo.minT());
+ instance_rays.setRay(i, o, dir);
+ instance_rays.resetHit(i, rays.getMinT(i));
}
} else {
for(int i = rays.begin();i<rays.end();i++){
- Point o = transform_inv * e.ray.origin();
- Vector dir = transform_inv * e.ray.direction();
+ Point o = transform_inv * rays.getOrigin(i);
+ Vector dir = transform_inv * rays.getDirection(i);
- te.ray.set(o, dir);
- te.hitInfo.reset(e.hitInfo.minT());
+ instance_rays.setRay(i, o, dir);
+ instance_rays.resetHit(i, rays.getMinT(i));
}
}
instance->intersect(context, instance_rays);
for(int i=rays.begin();i<rays.end();i++){
- if(te.hitInfo.wasHit()){
+ if(instance_rays.wasHit(i)){
// Instance was hit
- if(e.hitInfo.hit(te.hitInfo.minT(), material, this, tex)){
- // Instance is now the closest
- e.hitInfo.scratchpad<MPT>() = MPT(te.hitInfo.hitMaterial(),
- te.hitInfo.hitPrimitive(),
- te.hitInfo.hitTexCoordMapper());
+ if(rays.hit(i, instance_rays.getMinT(i), material, this, tex)){
+ // Instance is now the closest
+ rays.scratchpad<MPT>(i) = MPT(instance_rays.getHitMaterial(i),
+ instance_rays.getHitPrimitive(i),
+ instance_rays.getHitTexCoordMapper(i));
}
}
}
@@ -99,18 +99,19 @@
// Save the original rays
for(int i=rays.begin();i<rays.end();i++){
- old_rays[i] = e.ray;
+ old_rays[i] = rays.getRay(i);
- Point o = transform_inv * e.ray.origin();
- Vector dir = transform_inv * e.ray.direction();
+ Point o = transform_inv * old_rays[i].origin();
+ Vector dir = transform_inv * old_rays[i].direction();
- e.ray.set(o, dir);
+ rays.setRay(i, o, dir);
}
rays.resetFlag(RayPacket::HaveHitPositions);
+
for(int i=rays.begin();i<rays.end();){
- const Primitive* prim = e.hitInfo.scratchpad<MPT>().primitive;
+ const Primitive* prim = rays.scratchpad<MPT>(i).primitive;
int end = i+1;
- while(end < rays.end() &&
rays.get(end).hitInfo.scratchpad<MPT>().primitive == prim)
+ while(end < rays.end() && rays.scratchpad<MPT>(end).primitive == prim)
end++;
RayPacket subPacket(rays, i, end);
prim->computeNormal(context, subPacket);
@@ -119,8 +120,8 @@
// Put the rays back and fix the normals
for(int i=rays.begin();i<rays.end();i++){
- e.ray = old_rays[i];
- e.normal = transpose_mult(transform_inv,e.normal);
+ rays.setRay(i, old_rays[i]);
+ rays.setNormal(i, transpose_mult(transform_inv,rays.getNormal(i)));
}
rays.resetFlag(RayPacket::HaveHitPositions);
}
@@ -133,9 +134,9 @@
void InstanceRT::shade(const RenderContext& context, RayPacket& rays) const
{
for(int i=rays.begin();i<rays.end();){
- const Material* matl = e.hitInfo.scratchpad<MPT>().material;
+ const Material* matl = rays.scratchpad<MPT>(i).material;
int end = i+1;
- while(end < rays.end() &&
rays.get(end).hitInfo.scratchpad<MPT>().material == matl)
+ while(end < rays.end() && rays.scratchpad<MPT>(end).material == matl)
end++;
RayPacket subPacket(rays, i, end);
matl->shade(context, subPacket);
@@ -151,18 +152,19 @@
// Save the original rays
for(int i=rays.begin();i<rays.end();i++){
- old_rays[i] = e.ray;
+ old_rays[i] = rays.getRay(i);
- Point o = transform_inv * e.ray.origin();
- Vector dir = transform_inv * e.ray.direction();
+ Point o = transform_inv * old_rays[i].origin();
+ Vector dir = transform_inv * old_rays[i].direction();
- e.ray.set(o, dir);
+ rays.setRay(i, o, dir);
}
rays.resetFlag(RayPacket::HaveHitPositions);
+
for(int i=rays.begin();i<rays.end();){
- const TexCoordMapper* tex = e.hitInfo.scratchpad<MPT>().tex;
+ const TexCoordMapper* tex = rays.scratchpad<MPT>(i).tex;
int end = i+1;
- while(end < rays.end() && rays.get(end).hitInfo.scratchpad<MPT>().tex ==
tex)
+ while(end < rays.end() && rays.scratchpad<MPT>(end).tex == tex)
end++;
RayPacket subPacket(rays, i, end);
tex->computeTexCoords2(context, subPacket);
@@ -171,8 +173,8 @@
// Put the rays back and fix the normals
for(int i=rays.begin();i<rays.end();i++){
- e.ray = old_rays[i];
- e.normal = transform_inv * e.normal;
+ rays.setRay(i, old_rays[i]);
+ rays.setNormal(i, transpose_mult(transform_inv,rays.getNormal(i)));
}
rays.resetFlag(RayPacket::HaveHitPositions);
}
@@ -184,18 +186,19 @@
// Save the original rays
for(int i=rays.begin();i<rays.end();i++){
- old_rays[i] = e.ray;
+ old_rays[i] = rays.getRay(i);
- Point o = transform * e.ray.origin();
- Vector dir = transform * e.ray.direction();
+ Point o = transform_inv * old_rays[i].origin();
+ Vector dir = transform_inv * old_rays[i].direction();
- e.ray.set(o, dir);
+ rays.setRay(i, o, dir);
}
rays.resetFlag(RayPacket::HaveHitPositions);
+
for(int i=rays.begin();i<rays.end();){
- const TexCoordMapper* tex = e.hitInfo.scratchpad<MPT>().tex;
+ const TexCoordMapper* tex = rays.scratchpad<MPT>(i).tex;
int end = i+1;
- while(end < rays.end() && rays.get(end).hitInfo.scratchpad<MPT>().tex ==
tex)
+ while(end < rays.end() && rays.scratchpad<MPT>(end).tex == tex)
end++;
RayPacket subPacket(rays, i, end);
tex->computeTexCoords3(context, subPacket);
@@ -204,8 +207,8 @@
// Put the rays back and fix the normals
for(int i=rays.begin();i<rays.end();i++){
- e.ray = old_rays[i];
- e.normal = transform_inv * e.normal;
+ rays.setRay(i, old_rays[i]);
+ rays.setNormal(i, transpose_mult(transform_inv,rays.getNormal(i)));
}
rays.resetFlag(RayPacket::HaveHitPositions);
}
Modified: branches/vertical/Model/Instances/InstanceST.cc
==============================================================================
--- branches/vertical/Model/Instances/InstanceST.cc (original)
+++ branches/vertical/Model/Instances/InstanceST.cc Wed Jan 4 22:09:43
2006
@@ -1,12 +1,13 @@
#include <Model/Instances/InstanceST.h>
+#include <Model/Instances/MPT.h>
#include <Interface/RayPacket.h>
#include <Core/Geometry/BBox.h>
using namespace Manta;
InstanceST::InstanceST(Object* instance, const Vector& scale,
- const Vector& translation)
+ const Vector& translation)
: instance(instance), scale(scale), translation(translation)
{
// By default, use the texture coordinates and material of the child object
@@ -46,41 +47,41 @@
if(uniform_scale){
Real iscale = inv_scale.x();
if(rays.getFlag(RayPacket::ConstantOrigin)){
- int ray0 = rays.begin();
- Point o( Vector(rays.getOrigin(ray0)-translation)*iscale );
+ Point o( Vector(rays.getOrigin(rays.begin())-translation)*iscale );
+
for(int i = rays.begin();i<rays.end();i++){
- te.ray.set(o, e.ray.direction());
- te.hitInfo.reset(e.hitInfo.minT()*iscale);
+ instance_rays.setRay(i, o, rays.getDirection(i));
+ instance_rays.resetHit(i, rays.getMinT(i)*iscale);
}
} else {
for(int i = rays.begin();i<rays.end();i++){
- te.ray.set(Point(Vector(e.ray.origin()-translation)*iscale),
e.ray.direction());
- te.hitInfo.reset(e.hitInfo.minT()*iscale);
+ Point o( Vector(rays.getOrigin(i)-translation)*iscale );
+ instance_rays.setRay(i, o, rays.getDirection(i));
+ instance_rays.resetHit(i, rays.getMinT(i)*iscale);
}
}
} else {
if(rays.getFlag(RayPacket::ConstantOrigin)){
- int ray0 = rays.begin();
- Point o(Vector(rays.getOrigin(ray0)-translation)*inv_scale);
+ Point o( Vector(rays.getOrigin(rays.begin())-translation)*inv_scale );
for(int i = rays.begin();i<rays.end();i++){
- Vector dir(e.ray.direction()*inv_scale);
+ Vector dir(rays.getDirection(i)*inv_scale);
Real length = dir.length();
inv_scales[i] = length;
Real ilength = 1/length;
scales[i] = ilength;
- te.ray.set(o, dir*ilength);
- te.hitInfo.reset(e.hitInfo.minT()*length);
+ instance_rays.setRay(i, o, dir*ilength);
+ instance_rays.resetHit(i, rays.getMinT(i)*length);
}
} else {
for(int i = rays.begin();i<rays.end();i++){
- Vector dir(e.ray.direction()*inv_scale);
+ Point o( Vector(rays.getOrigin(i)-translation)*inv_scale );
+ Vector dir(rays.getDirection(i)*inv_scale);
Real length = dir.length();
scales[i] = length;
Real 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);
+ instance_rays.setRay(i, o, dir*ilength);
+ instance_rays.resetHit(i, rays.getMinT(i)*length);
}
}
}
@@ -88,67 +89,69 @@
if(uniform_scale){
Real s = scale.x();
for(int i=rays.begin();i<rays.end();i++){
- if(te.hitInfo.wasHit()){
- // Instance was hit
- if(e.hitInfo.hit(te.hitInfo.minT()*s, material, this, tex)){
- // Instance is now the closest
- e.hitInfo.scratchpad<MPT>() = MPT(te.hitInfo.hitMaterial(),
- te.hitInfo.hitPrimitive(),
- te.hitInfo.hitTexCoordMapper());
- }
+ if(instance_rays.wasHit(i)){
+ // Instance was hit
+ if(rays.hit(i, instance_rays.getMinT(i)*s, material, this, tex)){
+ // Instance is now the closest
+ rays.scratchpad<MPT>(i) = MPT(instance_rays.getHitMaterial(i),
+ instance_rays.getHitPrimitive(i),
+
instance_rays.getHitTexCoordMapper(i));
+ }
}
}
} else {
for(int i=rays.begin();i<rays.end();i++){
- if(te.hitInfo.wasHit()){
+ if(instance_rays.wasHit(i)){
// Instance was hit
Real s = scales[i];
- if(e.hitInfo.hit(te.hitInfo.minT()*s, material, this, tex)){
+ if(rays.hit(i, instance_rays.getMinT(i)*s, material, this, tex)){
// Instance is now the closest
- Real is = inv_scales[i];
- e.hitInfo.scratchpad<MPTscale>() =
- MPTscale(te.hitInfo.hitMaterial(),
- te.hitInfo.hitPrimitive(),
- te.hitInfo.hitTexCoordMapper(),
- s, is);
+ rays.scratchpad<MPTscale>(i) =
+ MPTscale(instance_rays.getHitMaterial(i),
+ instance_rays.getHitPrimitive(i),
+ instance_rays.getHitTexCoordMapper(i),
+ s, inv_scales[i]);
}
}
}
}
}
-void InstanceST::computeNormal(const RenderContext& context, RayPacket&
rays) const
+void
+InstanceST::computeNormal(const RenderContext& context, RayPacket& rays)
const
{
Real old_minT[RayPacket::MaxSize];
Point old_origins[RayPacket::MaxSize];
Ray old_rays[RayPacket::MaxSize];
+
if(uniform_scale){
// Save the original origins and minT
Real is = inv_scale.x();
for(int i=rays.begin();i<rays.end();i++){
- old_origins[i] = e.ray.origin();
- e.ray.setOrigin(Point(Vector(old_origins[i]-translation)*is));
- old_minT[i] = e.hitInfo.minT();
- e.hitInfo.scaleT(is);
+ old_origins[i] = rays.getOrigin(i);
+ rays.setOrigin(i, Point(Vector(old_origins[i]-translation)*is));
+ old_minT[i] = rays.getMinT(i);
+ rays.scaleMinT(i, is);
}
} else {
// Save the original rays and minT
for(int i=rays.begin();i<rays.end();i++){
- old_rays[i] = e.ray;
- Vector dir(e.ray.direction()*inv_scale);
- Real ilength = rays.get(i).hitInfo.scratchpad<MPTscale>().scale;
- e.ray.set(Point((Vector(e.ray.origin())-translation)*inv_scale),
- dir*ilength);
- old_minT[i] = e.hitInfo.minT();
- Real length = rays.get(i).hitInfo.scratchpad<MPTscale>().inv_scale;
- e.hitInfo.scaleT(length);
+ old_rays[i] = rays.getRay(i);
+ Vector dir(old_rays[i].direction()*inv_scale);
+ Real ilength = rays.scratchpad<MPTscale>(i).scale;
+ Point o( (old_rays[i].origin()-translation).multipliedBy(inv_scale) );
+ rays.setRay(i, o, dir*ilength);
+ old_minT[i] = rays.getMinT(i);
+ Real length = rays.scratchpad<MPTscale>(i).inv_scale;
+ rays.scaleMinT(i, length);
}
}
rays.resetFlag(RayPacket::HaveHitPositions);
+
for(int i=rays.begin();i<rays.end();){
- const Primitive* prim = e.hitInfo.scratchpad<MPT>().primitive;
+ const Primitive* prim = rays.scratchpad<MPT>(i).primitive;
int end = i+1;
- while(end < rays.end() &&
rays.get(end).hitInfo.scratchpad<MPT>().primitive == prim)
+ while(end < rays.end() && rays.scratchpad<MPT>(end).primitive == prim)
end++;
RayPacket subPacket(rays, i, end);
prim->computeNormal(context, subPacket);
@@ -158,16 +161,15 @@
if(uniform_scale){
// Put the origins and minT back
for(int i=rays.begin();i<rays.end();i++){
- e.ray.setOrigin(old_origins[i]);
- e.hitInfo.overrideT(old_minT[i]);
+ rays.setOrigin(i, old_origins[i]);
+ rays.overrideMinT(i, old_minT[i]);
}
} else {
// Put the origins and minT back, scale normal
for(int i=rays.begin();i<rays.end();i++){
- e.ray = old_rays[i];
- e.hitInfo.overrideT(old_minT[i]);
- e.normal *= inv_scale;
- e.normal.normalize();
+ rays.setRay(i, old_rays[i]);
+ rays.overrideMinT(i, old_minT[i]);
+ rays.setNormal(i, (rays.getNormal(i) * inv_scale).normal());
}
}
rays.resetFlag(RayPacket::HaveHitPositions);
@@ -181,9 +183,9 @@
void InstanceST::shade(const RenderContext& context, RayPacket& rays) const
{
for(int i=rays.begin();i<rays.end();){
- const Material* matl = e.hitInfo.scratchpad<MPT>().material;
+ const Material* matl = rays.scratchpad<MPT>(i).material;
int end = i+1;
- while(end < rays.end() &&
rays.get(end).hitInfo.scratchpad<MPT>().material == matl)
+ while(end < rays.end() && rays.scratchpad<MPT>(end).material == matl)
end++;
RayPacket subPacket(rays, i, end);
matl->shade(context, subPacket);
@@ -192,38 +194,40 @@
}
void InstanceST::computeTexCoords2(const RenderContext& context,
- RayPacket& rays) const
+ RayPacket& rays) const
{
Real old_minT[RayPacket::MaxSize];
Point old_origins[RayPacket::MaxSize];
Ray old_rays[RayPacket::MaxSize];
+
if(uniform_scale){
// Save the original origins and minT
Real is = inv_scale.x();
for(int i=rays.begin();i<rays.end();i++){
- old_origins[i] = e.ray.origin();
- e.ray.setOrigin(Point(Vector(old_origins[i]-translation)*is));
- old_minT[i] = e.hitInfo.minT();
- e.hitInfo.scaleT(is);
+ old_origins[i] = rays.getOrigin(i);
+ rays.setOrigin(i, Point(Vector(old_origins[i]-translation)*is));
+ old_minT[i] = rays.getMinT(i);
+ rays.scaleMinT(i, is);
}
} else {
// Save the original rays and minT
for(int i=rays.begin();i<rays.end();i++){
- old_rays[i] = e.ray;
- Vector dir(e.ray.direction()*inv_scale);
- Real ilength = rays.get(i).hitInfo.scratchpad<MPTscale>().scale;
- e.ray.set(Point((Vector(e.ray.origin())-translation)*inv_scale),
- dir*ilength);
- old_minT[i] = e.hitInfo.minT();
- Real length = rays.get(i).hitInfo.scratchpad<MPTscale>().inv_scale;
- e.hitInfo.scaleT(length);
+ old_rays[i] = rays.getRay(i);
+ Vector dir(old_rays[i].direction()*inv_scale);
+ Real ilength = rays.scratchpad<MPTscale>(i).scale;
+ Point o( (old_rays[i].origin()-translation).multipliedBy(inv_scale) );
+ rays.setRay(i, o, dir*ilength);
+ old_minT[i] = rays.getMinT(i);
+ Real length = rays.scratchpad<MPTscale>(i).inv_scale;
+ rays.scaleMinT(i, length);
}
}
rays.resetFlag(RayPacket::HaveHitPositions);
+
for(int i=rays.begin();i<rays.end();){
- const TexCoordMapper* tex = e.hitInfo.scratchpad<MPT>().tex;
+ const TexCoordMapper* tex = rays.scratchpad<MPT>(i).tex;
int end = i+1;
- while(end < rays.end() && rays.get(end).hitInfo.scratchpad<MPT>().tex ==
tex)
+ while(end < rays.end() && rays.scratchpad<MPT>(end).tex == tex)
end++;
RayPacket subPacket(rays, i, end);
tex->computeTexCoords2(context, subPacket);
@@ -233,51 +237,54 @@
if(uniform_scale){
// Put the origins and minT back
for(int i=rays.begin();i<rays.end();i++){
- e.ray.setOrigin(old_origins[i]);
- e.hitInfo.overrideT(old_minT[i]);
+ rays.setOrigin(i, old_origins[i]);
+ rays.overrideMinT(i, old_minT[i]);
}
} else {
- // Put the origins and minT back
+ // Put the origins and minT back, scale normal
for(int i=rays.begin();i<rays.end();i++){
- e.ray = old_rays[i];
- e.hitInfo.overrideT(old_minT[i]);
+ rays.setRay(i, old_rays[i]);
+ rays.overrideMinT(i, old_minT[i]);
}
}
+ rays.resetFlag(RayPacket::HaveHitPositions);
}
void InstanceST::computeTexCoords3(const RenderContext& context,
- RayPacket& rays) const
+ RayPacket& rays) const
{
Real old_minT[RayPacket::MaxSize];
Point old_origins[RayPacket::MaxSize];
Ray old_rays[RayPacket::MaxSize];
+
if(uniform_scale){
// Save the original origins and minT
Real is = inv_scale.x();
for(int i=rays.begin();i<rays.end();i++){
- old_origins[i] = e.ray.origin();
- e.ray.setOrigin(Point(Vector(old_origins[i]-translation)*is));
- old_minT[i] = e.hitInfo.minT();
- e.hitInfo.scaleT(is);
+ old_origins[i] = rays.getOrigin(i);
+ rays.setOrigin(i, Point(Vector(old_origins[i]-translation)*is));
+ old_minT[i] = rays.getMinT(i);
+ rays.scaleMinT(i, is);
}
} else {
// Save the original rays and minT
for(int i=rays.begin();i<rays.end();i++){
- old_rays[i] = e.ray;
- Vector dir(e.ray.direction()*inv_scale);
- Real ilength = rays.get(i).hitInfo.scratchpad<MPTscale>().scale;
- e.ray.set(Point((Vector(e.ray.origin())-translation)*inv_scale),
- dir*ilength);
- old_minT[i] = e.hitInfo.minT();
- Real length = rays.get(i).hitInfo.scratchpad<MPTscale>().inv_scale;
- e.hitInfo.scaleT(length);
+ old_rays[i] = rays.getRay(i);
+ Vector dir(old_rays[i].direction()*inv_scale);
+ Real ilength = rays.scratchpad<MPTscale>(i).scale;
+ Point o( (old_rays[i].origin()-translation).multipliedBy(inv_scale) );
+ rays.setRay(i, o, dir*ilength);
+ old_minT[i] = rays.getMinT(i);
+ Real length = rays.scratchpad<MPTscale>(i).inv_scale;
+ rays.scaleMinT(i, length);
}
}
rays.resetFlag(RayPacket::HaveHitPositions);
+
for(int i=rays.begin();i<rays.end();){
- const TexCoordMapper* tex = e.hitInfo.scratchpad<MPT>().tex;
+ const TexCoordMapper* tex = rays.scratchpad<MPT>(i).tex;
int end = i+1;
- while(end < rays.end() && rays.get(end).hitInfo.scratchpad<MPT>().tex ==
tex)
+ while(end < rays.end() && rays.scratchpad<MPT>(end).tex == tex)
end++;
RayPacket subPacket(rays, i, end);
tex->computeTexCoords3(context, subPacket);
@@ -287,17 +294,19 @@
if(uniform_scale){
// Put the origins and minT back
for(int i=rays.begin();i<rays.end();i++){
- e.ray.setOrigin(old_origins[i]);
- e.hitInfo.overrideT(old_minT[i]);
+ rays.setOrigin(i, old_origins[i]);
+ rays.overrideMinT(i, old_minT[i]);
}
} else {
- // Put the origins and minT back
+ // Put the origins and minT back, scale normal
for(int i=rays.begin();i<rays.end();i++){
- e.ray = old_rays[i];
- e.hitInfo.overrideT(old_minT[i]);
+ rays.setRay(i, old_rays[i]);
+ rays.overrideMinT(i, old_minT[i]);
}
}
+ rays.resetFlag(RayPacket::HaveHitPositions);
}
+
void InstanceST::overrideMaterial(Material* in_material)
{
Modified: branches/vertical/Model/Instances/InstanceT.cc
==============================================================================
--- branches/vertical/Model/Instances/InstanceT.cc (original)
+++ branches/vertical/Model/Instances/InstanceT.cc Wed Jan 4 22:09:43
2006
@@ -1,5 +1,6 @@
#include <Model/Instances/InstanceT.h>
+#include <Model/Instances/MPT.h>
#include <Interface/RayPacket.h>
#include <Core/Geometry/BBox.h>
@@ -34,30 +35,30 @@
{
RayPacketData raydata;
RayPacket instance_rays(raydata, rays.begin(), rays.end(), rays.getDepth(),
- rays.getAllFlags());
+ rays.getAllFlags());
if(rays.getFlag(RayPacket::ConstantOrigin)){
- int ray0 = rays.begin();
- Point O(rays.getOrigin(ray0)-translation);
+ Point o(rays.getOrigin(rays.begin())-translation);
for(int i = rays.begin();i<rays.end();i++){
- te.ray.set(O, e.ray.direction());
- te.hitInfo.reset(e.hitInfo.minT());
+ instance_rays.setRay(i, o, rays.getDirection(i));
+ instance_rays.resetHit(i, rays.getMinT(i));
}
} else {
for(int i = rays.begin();i<rays.end();i++){
- te.ray.set(e.ray.origin()-translation, e.ray.direction());
- te.hitInfo.reset(e.hitInfo.minT());
+ Point o(rays.getOrigin(i)-translation);
+ instance_rays.setRay(i, o, rays.getDirection(i));
+ instance_rays.resetHit(i, rays.getMinT(i));
}
}
instance->intersect(context, instance_rays);
for(int i=rays.begin();i<rays.end();i++){
- if(te.hitInfo.wasHit()){
+ if(instance_rays.wasHit(i)){
// Instance was hit
- if(e.hitInfo.hit(te.hitInfo.minT(), material, this, tex)){
- // Instance is now the closest
- e.hitInfo.scratchpad<MPT>() = MPT(te.hitInfo.hitMaterial(),
- te.hitInfo.hitPrimitive(),
- te.hitInfo.hitTexCoordMapper());
+ if(rays.hit(i, instance_rays.getMinT(i), material, this, tex)){
+ // Instance is now the closest
+ rays.scratchpad<MPT>(i) = MPT(instance_rays.getHitMaterial(i),
+ instance_rays.getHitPrimitive(i),
+ instance_rays.getHitTexCoordMapper(i));
}
}
}
@@ -69,14 +70,15 @@
// Save the original origins
for(int i=rays.begin();i<rays.end();i++){
- old_origins[i] = e.ray.origin();
- e.ray.setOrigin(old_origins[i]-translation);
+ old_origins[i] = rays.getOrigin(i);
+ rays.setOrigin(i, old_origins[i]-translation);
}
rays.resetFlag(RayPacket::HaveHitPositions);
+
for(int i=rays.begin();i<rays.end();){
- const Primitive* prim = e.hitInfo.scratchpad<MPT>().primitive;
+ const Primitive* prim = rays.scratchpad<MPT>(i).primitive;
int end = i+1;
- while(end < rays.end() &&
rays.get(end).hitInfo.scratchpad<MPT>().primitive == prim)
+ while(end < rays.end() && rays.scratchpad<MPT>(end).primitive == prim)
end++;
RayPacket subPacket(rays, i, end);
prim->computeNormal(context, subPacket);
@@ -85,7 +87,7 @@
// Put the origins back
for(int i=rays.begin();i<rays.end();i++){
- e.ray.setOrigin(old_origins[i]);
+ rays.setOrigin(i, old_origins[i]);
}
rays.resetFlag(RayPacket::HaveHitPositions);
}
@@ -98,9 +100,9 @@
void InstanceT::shade(const RenderContext& context, RayPacket& rays) const
{
for(int i=rays.begin();i<rays.end();){
- const Material* matl = e.hitInfo.scratchpad<MPT>().material;
+ const Material* matl = rays.scratchpad<MPT>(i).material;
int end = i+1;
- while(end < rays.end() &&
rays.get(end).hitInfo.scratchpad<MPT>().material == matl)
+ while(end < rays.end() && rays.scratchpad<MPT>(end).material == matl)
end++;
RayPacket subPacket(rays, i, end);
matl->shade(context, subPacket);
@@ -110,20 +112,21 @@
void InstanceT::computeTexCoords2(const RenderContext& context,
- RayPacket& rays) const
+ RayPacket& rays) const
{
Point old_origins[RayPacket::MaxSize];
// Save the original origins
for(int i=rays.begin();i<rays.end();i++){
- old_origins[i] = e.ray.origin();
- e.ray.setOrigin(old_origins[i]-translation);
+ old_origins[i] = rays.getOrigin(i);
+ rays.setOrigin(i, old_origins[i]-translation);
}
rays.resetFlag(RayPacket::HaveHitPositions);
+
for(int i=rays.begin();i<rays.end();){
- const TexCoordMapper* tex = e.hitInfo.scratchpad<MPT>().tex;
+ const TexCoordMapper* tex = rays.scratchpad<MPT>(i).tex;
int end = i+1;
- while(end < rays.end() && rays.get(end).hitInfo.scratchpad<MPT>().tex ==
tex)
+ while(end < rays.end() && rays.scratchpad<MPT>(end).tex == tex)
end++;
RayPacket subPacket(rays, i, end);
tex->computeTexCoords2(context, subPacket);
@@ -132,25 +135,26 @@
// Put the origins back
for(int i=rays.begin();i<rays.end();i++){
- e.ray.setOrigin(old_origins[i]);
+ rays.setOrigin(i, old_origins[i]);
}
}
void InstanceT::computeTexCoords3(const RenderContext& context,
- RayPacket& rays) const
+ RayPacket& rays) const
{
Point old_origins[RayPacket::MaxSize];
// Save the original origins
for(int i=rays.begin();i<rays.end();i++){
- old_origins[i] = e.ray.origin();
- e.ray.setOrigin(old_origins[i]-translation);
+ old_origins[i] = rays.getOrigin(i);
+ rays.setOrigin(i, old_origins[i]-translation);
}
rays.resetFlag(RayPacket::HaveHitPositions);
+
for(int i=rays.begin();i<rays.end();){
- const TexCoordMapper* tex = e.hitInfo.scratchpad<MPT>().tex;
+ const TexCoordMapper* tex = rays.scratchpad<MPT>(i).tex;
int end = i+1;
- while(end < rays.end() && rays.get(end).hitInfo.scratchpad<MPT>().tex ==
tex)
+ while(end < rays.end() && rays.scratchpad<MPT>(end).tex == tex)
end++;
RayPacket subPacket(rays, i, end);
tex->computeTexCoords3(context, subPacket);
@@ -159,7 +163,7 @@
// Put the origins back
for(int i=rays.begin();i<rays.end();i++){
- e.ray.setOrigin(old_origins[i]);
+ rays.setOrigin(i, old_origins[i]);
}
}
Modified: branches/vertical/Model/Lights/CMakeLists.txt
==============================================================================
--- branches/vertical/Model/Lights/CMakeLists.txt (original)
+++ branches/vertical/Model/Lights/CMakeLists.txt Wed Jan 4 22:09:43
2006
@@ -1,7 +1,7 @@
SET (Manta_Lights_SRCS
+ Lights/HeadLight.h
+ Lights/HeadLight.cc
Lights/PointLight.h
Lights/PointLight.cc
- #Lights/HeadLight.h
- #Lights/HeadLight.cc
)
Modified: branches/vertical/Model/Lights/HeadLight.cc
==============================================================================
--- branches/vertical/Model/Lights/HeadLight.cc (original)
+++ branches/vertical/Model/Lights/HeadLight.cc Wed Jan 4 22:09:43 2006
@@ -3,13 +3,16 @@
#include <Model/Lights/HeadLight.h>
#include <Interface/Context.h>
#include <Interface/Camera.h>
+#include <Interface/RayPacket.h>
+#include <Core/Geometry/PointVector.h>
using namespace Manta;
-void HeadLight::computeLight( Color &resultColor, Vector &lightDirection,
+void HeadLight::computeLight( Color resultColor[RayPacket::MaxSize],
+ Vector lightDirection[RayPacket::MaxSize],
const RenderContext &context,
- RayPacket::Element &e ) const {
-
+ RayPacket &rays) const
+{
// Determine the camera position.
Point camera = context.camera->getPosition();
Vector up = context.camera->getUp();
@@ -17,8 +20,9 @@
// Determine light position.
Point position = camera + (up * offset);
- // Finally compute light direction.
- lightDirection = position - e.hitPosition;
-
- resultColor = color;
+ rays.computeHitPositions();
+ for(int i = rays.begin(); i < rays.end(); i++){
+ resultColor[i] = color;
+ lightDirection[i] = position - rays.getHitPosition(i);
+ }
}
Modified: branches/vertical/Model/Lights/HeadLight.h
==============================================================================
--- branches/vertical/Model/Lights/HeadLight.h (original)
+++ branches/vertical/Model/Lights/HeadLight.h Wed Jan 4 22:09:43 2006
@@ -8,18 +8,20 @@
namespace Manta {
class HeadLight : public Light {
-public:
+ public:
HeadLight(const Real offset_, const Color &color_) : offset( offset_ ),
color( color_ ) { };
-
+
virtual void preprocess(const PreprocessContext&) { /* Does Nothing. */
};
- virtual void computeLight( Color &resultColor, Vector
&lightDirection,
- const RenderContext &context,
RayPacket::Element &e ) const;
-
- void setOffset( Real offset_ ) { offset = offset_; };
- Real getOffset() { return offset; };
-
-private:
- Real offset;
+ virtual void computeLight( Color resultColor[RayPacket::MaxSize],
+ Vector lightDirection[RayPacket::MaxSize],
+ const RenderContext &context,
+ RayPacket &rays) const;
+
+ void setOffset( Real offset_ ) { offset = offset_; };
+ Real getOffset() { return offset; };
+
+ private:
+ Real offset;
Color color;
};
}
Modified: branches/vertical/Model/Lights/PointLight.cc
==============================================================================
--- branches/vertical/Model/Lights/PointLight.cc (original)
+++ branches/vertical/Model/Lights/PointLight.cc Wed Jan 4 22:09:43
2006
@@ -16,10 +16,12 @@
{
}
-void PointLight::computeLight( Color resultColor[RayPacket::MaxSize],
- Vector lightDirection[RayPacket::MaxSize],
- const RenderContext &context, RayPacket
&rays) const
+void PointLight::computeLight( Color resultColor[RayPacket::MaxSize],
+ Vector lightDirection[RayPacket::MaxSize],
+ const RenderContext &context,
+ RayPacket &rays) const
{
+ rays.computeHitPositions();
for(int i = rays.begin(); i < rays.end(); i++){
resultColor[i] = color;
lightDirection[i] = position - rays.getHitPosition(i);
Modified: branches/vertical/Model/Lights/PointLight.h
==============================================================================
--- branches/vertical/Model/Lights/PointLight.h (original)
+++ branches/vertical/Model/Lights/PointLight.h Wed Jan 4 22:09:43 2006
@@ -13,10 +13,11 @@
virtual ~PointLight();
virtual void preprocess(const PreprocessContext&);
-
- virtual void computeLight( Color resultColor[RayPacket::MaxSize],
- Vector lightDirection[RayPacket::MaxSize],
- const RenderContext &context, RayPacket
&rays) const;
+
+ virtual void computeLight( Color resultColor[RayPacket::MaxSize],
+ Vector lightDirection[RayPacket::MaxSize],
+ const RenderContext &context,
+ RayPacket &rays) const;
private:
Point position;
Color color;
Modified: branches/vertical/Model/Primitives/HeavyTriangle.cc
==============================================================================
--- branches/vertical/Model/Primitives/HeavyTriangle.cc (original)
+++ branches/vertical/Model/Primitives/HeavyTriangle.cc Wed Jan 4 22:09:43
2006
@@ -76,6 +76,7 @@
Real c = (1.0 - th.a - th.b);
Vector normal = (n[1]*a) + (n[2]*b) + (n[0]*c);
+ normal.normalize();
rays.setNormal(i, normal);
}
}
Modified: branches/vertical/SwigInterface/manta.i
==============================================================================
--- branches/vertical/SwigInterface/manta.i (original)
+++ branches/vertical/SwigInterface/manta.i Wed Jan 4 22:09:43 2006
@@ -169,23 +169,21 @@
%{
#include <Core/Geometry/Ray.h>
-#include <Interface/HitInfo.h>
-#include <Interface/RayPacket.h>
#include <Interface/Context.h>
#include <Interface/Object.h>
#include <Interface/Primitive.h>
#include <Interface/TexCoordMapper.h>
+#include <Interface/RayPacket.h>
#include <Interface/Light.h>
#include <Interface/LightSet.h>
%}
%include <Core/Geometry/Ray.h>
-%include <Interface/HitInfo.h>
-%include <Interface/RayPacket.h>
%include <Interface/Context.h>
%include <Interface/Object.h>
%include <Interface/Primitive.h>
%include <Interface/TexCoordMapper.h>
+%include <Interface/RayPacket.h>
%include <Interface/Light.h>
%include <Interface/LightSet.h>
Modified: branches/vertical/scenes/objviewer.cc
==============================================================================
--- branches/vertical/scenes/objviewer.cc (original)
+++ branches/vertical/scenes/objviewer.cc Wed Jan 4 22:09:43 2006
@@ -355,7 +355,8 @@
Texture<ColorComponent> *reflection = new Constant<ColorComponent>(
0.0 );
// Phong shader.
- material_array[index] = new Phong( diffuse_map, specular_map, Ns,
reflection );
+ material_array[index] = new Phong( diffuse_map, specular_map,
+ static_cast<int>(Ns), reflection );
}
///////////////////////////////////////////////////////////////////////////
- [MANTA] r819 - in branches/vertical: Core/Color Interface Model Model/Instances Model/Lights Model/Primitives SwigInterface scenes, bigler, 01/04/2006
Archive powered by MHonArc 2.6.16.