Text archives Help
- From: boulos@sci.utah.edu
- To: manta@sci.utah.edu
- Subject: [Manta] r1811 - in trunk: Engine/Control Engine/Shadows Interface Model/Cameras Model/Materials
- Date: Sun, 4 Nov 2007 13:48:22 -0700 (MST)
Author: boulos
Date: Sun Nov 4 13:48:19 2007
New Revision: 1811
Modified:
trunk/Engine/Control/RTRT.cc
trunk/Engine/Shadows/HardShadows.cc
trunk/Interface/FrameState.h
trunk/Interface/RayPacket.h
trunk/Model/Cameras/PinholeCamera.cc
trunk/Model/Materials/AmbientOcclusion.cc
trunk/Model/Materials/Dielectric.cc
trunk/Model/Materials/MetalMaterial.cc
trunk/Model/Materials/Phong.cc
trunk/Model/Materials/ThinDielectric.cc
trunk/Model/Materials/Transparent.cc
Log:
Interface/FrameState.h
Adding shutter_open and shutter_close to the FrameState to support
Motion Blur.
Engine/Control/RTRT.cc
Filling shutter_open and shutter_close with "reasonable" values.
Interface/RayPacket.h
Adding time, getTime and setTime to RayPacket to support motion blur.
Engine/Shadows/HardShadows.cc
Model/Cameras/PinholeCamera.cc
Model/Materials/AmbientOcclusion.cc
Model/Materials/Dielectric.cc
Model/Materials/MetalMaterial.cc
Model/Materials/Phong.cc
Model/Materials/ThinDielectric.cc
Model/Materials/Transparent.cc
Setting the time value wherever necessary.
Modified: trunk/Engine/Control/RTRT.cc
==============================================================================
--- trunk/Engine/Control/RTRT.cc (original)
+++ trunk/Engine/Control/RTRT.cc Sun Nov 4 13:48:19 2007
@@ -160,6 +160,8 @@
running=false;
animFrameState.frameNumber = 0;
animFrameState.frameTime = 0;
+ animFrameState.shutter_open = 0;
+ animFrameState.shutter_close = 0;
timeMode = MantaInterface::RealTime;
timeScale = 1;
frameRate = 15;
@@ -617,10 +619,14 @@
animFrameState.frameNumber++;
switch(timeMode){
case RealTime:
+ animFrameState.shutter_open = animFrameState.shutter_close;
animFrameState.frameTime = Time::currentSeconds() * timeScale;
+ animFrameState.shutter_close = animFrameState.frameTime;
break;
case FixedRate:
+ animFrameState.shutter_open = animFrameState.shutter_close;
animFrameState.frameTime =
static_cast<double>(animFrameState.frameNumber) / frameRate;
+ animFrameState.shutter_close = animFrameState.frameTime;
break;
case Static:
break;
Modified: trunk/Engine/Shadows/HardShadows.cc
==============================================================================
--- trunk/Engine/Shadows/HardShadows.cc (original)
+++ trunk/Engine/Shadows/HardShadows.cc Sun Nov 4 13:48:19 2007
@@ -86,6 +86,7 @@
Vector dir = shadowRays.getDirection(i);
if(Dot(dir, sourceRays.getFFNormal(i)) > 0) {
shadowRays.setOrigin(i, sourceRays.getHitPosition(i));
+ shadowRays.setTime(i, sourceRays.getTime(i));
// This is a version of resetHit that only sets the material
// to NULL and doesn't require us to also modify the hit
// distance which was set for us by the call to
@@ -104,6 +105,7 @@
Vector dir = shadowRays.getDirection(i);
if(Dot(dir, sourceRays.getFFNormal(i)) > 0) {
shadowRays.setOrigin(i, sourceRays.getHitPosition(i));
+ shadowRays.setTime(i, sourceRays.getTime(i));
// See comment above.
shadowRays.setHitMaterial(i, NULL);
last = i;
@@ -142,6 +144,8 @@
_mm_store_ps(&shadowData->origin[1][i],
_mm_load_ps(&sourceData->hitPosition[1][i]));
_mm_store_ps(&shadowData->origin[2][i],
_mm_load_ps(&sourceData->hitPosition[2][i]));
+ _mm_store_ps(&shadowData->time[i],
_mm_load_ps(&sourceData->time[i]));
+
if(_mm_movemask_ps(mask) != 0xf){
last = i+3;
if (first < 0)
@@ -153,6 +157,7 @@
Vector dir = shadowRays.getDirection(i);
if(Dot(dir, sourceRays.getFFNormal(i)) > 0) {
shadowRays.setOrigin(i, sourceRays.getHitPosition(i));
+ shadowRays.setTime(i, sourceRays.getTime(i));
// See comment above.
shadowRays.setHitMaterial(i, NULL);
last = i;
@@ -170,6 +175,7 @@
Vector dir = shadowRays.getDirection(i);
if(Dot(dir, sourceRays.getFFNormal(i)) > 0) {
shadowRays.setOrigin(i, sourceRays.getHitPosition(i));
+ shadowRays.setTime(i, sourceRays.getTime(i));
// See comment above.
shadowRays.setHitMaterial(i, NULL);
last = i;
Modified: trunk/Interface/FrameState.h
==============================================================================
--- trunk/Interface/FrameState.h (original)
+++ trunk/Interface/FrameState.h Sun Nov 4 13:48:19 2007
@@ -6,6 +6,8 @@
struct FrameState {
long frameNumber;
double frameTime;
+ Real shutter_open;
+ Real shutter_close;
};
}
Modified: trunk/Interface/RayPacket.h
==============================================================================
--- trunk/Interface/RayPacket.h (original)
+++ trunk/Interface/RayPacket.h Sun Nov 4 13:48:19 2007
@@ -94,6 +94,7 @@
MANTA_ALIGN(16) Real inverseDirection[3][MaxSize];
MANTA_ALIGN(16) Real minT[MaxSize];
MANTA_ALIGN(16) Real corner_dir[3][4];
+ MANTA_ALIGN(16) Real time[MaxSize]; // Time for this ray in [0,1)
MANTA_ALIGN(16) Real image[2][MaxSize];
MANTA_ALIGN(16) Real normal[3][MaxSize];
@@ -470,6 +471,15 @@
{
data->minT[which] = minT;
}
+
+ // Time for motion blur.
+ Real& getTime(int which) const {
+ return data->time[which];
+ }
+ void setTime(int which, Real new_time) {
+ data->time[which] = new_time;
+ }
+
bool hit(int which, Real t, const Material* matl, const Primitive* prim,
const TexCoordMapper* tex) {
if(t > T_EPSILON && t < data->minT[which]){
Modified: trunk/Model/Cameras/PinholeCamera.cc
==============================================================================
--- trunk/Model/Cameras/PinholeCamera.cc (original)
+++ trunk/Model/Cameras/PinholeCamera.cc Sun Nov 4 13:48:19 2007
@@ -6,6 +6,7 @@
#include <Interface/Context.h>
#include <Interface/MantaInterface.h>
#include <Interface/RayPacket.h>
+#include <Interface/SampleGenerator.h>
#include <Interface/Scene.h>
#include <Core/Geometry/BBox.h>
#include <Core/Geometry/AffineTransform.h>
@@ -168,6 +169,16 @@
makeRaysSpecialized<false, true>(rays);
else
makeRaysSpecialized<false, false>(rays);
+
+ // TODO(boulos): Provide SSE version and somehow avoid this overhead
+ // when people don't need time? rays.computeTimeValues would work
+ // for the first bounce, but if we don't compute it by then, we'll
+ // need to have some sort of "tree of parents" that we can follow up
+ Packet<Real> time_seeds;
+ context.sample_generator->nextSeeds(context, time_seeds, rays);
+ for (int i = rays.begin(); i < rays.end(); i++) {
+ rays.data->time[i] = time_seeds.get(i);
+ }
}
template <bool NORMALIZE_RAYS, bool CREATE_CORNER_RAYS>
@@ -326,7 +337,7 @@
max_u = SCIRun::Max(max_u, u_imageCoord);
}
}
-
+
if (CREATE_CORNER_RAYS) {
Vector raydir[4] = { v*min_v + u*min_u + direction,
v*min_v + u*max_u + direction,
Modified: trunk/Model/Materials/AmbientOcclusion.cc
==============================================================================
--- trunk/Model/Materials/AmbientOcclusion.cc (original)
+++ trunk/Model/Materials/AmbientOcclusion.cc Sun Nov 4 13:48:19 2007
@@ -97,6 +97,7 @@
directions[r][1]*V +
directions[r][2]*W);
occlusion_rays.setRay(r, rays.getHitPosition(i), trans_dir);
+ occlusion_rays.setTime(i, rays.getTime(i));
// set max distance
occlusion_rays.resetHit(r, cutoff);
}
Modified: trunk/Model/Materials/Dielectric.cc
==============================================================================
--- trunk/Model/Materials/Dielectric.cc (original)
+++ trunk/Model/Materials/Dielectric.cc Sun Nov 4 13:48:19 2007
@@ -138,6 +138,7 @@
Color refl_importance = in_importance * beers_color;
if(refl_importance.luminance() > cutoff){
reflected_rays.setImportance(num_refl, refl_importance);
+ reflected_rays.setTime(num_refl, rays.getTime(i));
reflected_rays.setRay(num_refl, hitpos, refl_dir);
refl_source[num_refl] = i;
refl_attenuation[num_refl] = beers_color;
@@ -175,6 +176,7 @@
Color refl_importance = in_importance * refl_attenuation[num_refl];
if(refl_importance.luminance() > cutoff){
reflected_rays.setImportance(num_refl, refl_importance);
+ reflected_rays.setTime(num_refl, rays.getTime(i));
reflected_rays.setRay(num_refl, hitpos, refl_dir);
refl_source[num_refl] = i;
num_refl++;
@@ -186,6 +188,7 @@
Color refr_importance = in_importance * refr_attenuation[num_refr];
if(refr_importance.luminance() > cutoff){
refracted_rays.setImportance(num_refr, refr_importance);
+ refracted_rays.setTime(num_refr, rays.getTime(i));
Vector refr_dir = (eta_inverse * rayD +
(eta_inverse * costheta - costheta2) * normal);
refracted_rays.setRay(num_refr, hitpos, refr_dir);
Modified: trunk/Model/Materials/MetalMaterial.cc
==============================================================================
--- trunk/Model/Materials/MetalMaterial.cc (original)
+++ trunk/Model/Materials/MetalMaterial.cc Sun Nov 4 13:48:19 2007
@@ -26,10 +26,10 @@
specular_reflectance = new Constant<Color>(specular);
}
-MetalMaterial::MetalMaterial(const Texture<Color>* specular_reflectance,
- int phong_exponent)
+MetalMaterial::MetalMaterial(const Texture<Color>* specular_reflectance,
+ int phong_exponent)
: specular_reflectance(specular_reflectance),
phong_exponent(phong_exponent)
-{
+{
}
MetalMaterial::~MetalMaterial()
@@ -44,19 +44,20 @@
rays.computeFFNormals(context);
Packet<Color> specular;
specular_reflectance->mapValues(specular, context, rays);
-
+
rays.computeHitPositions();
RayPacketData rdata;
RayPacket refl_rays(rdata, RayPacket::UnknownShape, rays.begin(),
rays.end(),
rays.getDepth()+1, RayPacket::NormalizedDirections);
- for(int i=rays.begin();i<rays.end();i++) {
+ for(int i=rays.begin();i<rays.end();i++) {
Vector rayD = rays.getDirection(i);
Vector normal = rays.getFFNormal(i);
Vector refl_dir = rayD - normal*(2*Dot(normal, rayD));
refl_rays.setRay(i, rays.getHitPosition(i), refl_dir);
refl_rays.setImportance(i, rays.getImportance(i));
+ refl_rays.setTime(i, rays.getTime(i));
}
-
+
refl_rays.resetHits();
context.renderer->traceRays(context, refl_rays);
for(int i=rays.begin();i<rays.end();i++) {
@@ -78,7 +79,7 @@
}
} else {
// Stuff black in it.
- for(int i=rays.begin();i<rays.end();i++)
+ for(int i=rays.begin();i<rays.end();i++)
rays.setColor(i, Color::black());
}
}
Modified: trunk/Model/Materials/Phong.cc
==============================================================================
--- trunk/Model/Materials/Phong.cc (original)
+++ trunk/Model/Materials/Phong.cc Sun Nov 4 13:48:19 2007
@@ -442,6 +442,7 @@
rays.getFFNormal(i)*(2*Dot(rays.getFFNormal(i),
rays.getDirection(i) )));
refl_rays.setRay(i, rays.getHitPosition(i), refl_dir);
refl_rays.setImportance(i, rays.getImportance(i) * refl.data[i]);
+ refl_rays.setTime(i, rays.getTime(i));
}
} else {
int i = rays.rayBegin;
@@ -450,6 +451,7 @@
rays.getFFNormal(i)*(2*Dot(rays.getFFNormal(i),
rays.getDirection(i) )));
refl_rays.setRay(i, rays.getHitPosition(i), refl_dir);
refl_rays.setImportance(i, rays.getImportance(i) * refl.data[i]);
+ refl_rays.setTime(i, rays.getTime(i));
}
RayPacketData* data = rays.data;
RayPacketData* refldata = refl_rays.data;
@@ -476,12 +478,15 @@
_mm_store_ps(&refldata->importance[0][i],
_mm_mul_ps(_mm_load_ps(&data->importance[0][i]), r));
_mm_store_ps(&refldata->importance[1][i],
_mm_mul_ps(_mm_load_ps(&data->importance[1][i]), r));
_mm_store_ps(&refldata->importance[2][i],
_mm_mul_ps(_mm_load_ps(&data->importance[2][i]), r));
+
+ _mm_store_ps(&refldata->time[i], _mm_load_ps(&data->time[i]));
}
for(;i<rays.rayEnd;i++){
Vector refl_dir = (rays.getDirection(i) -
rays.getFFNormal(i)*(2*Dot(rays.getFFNormal(i),
rays.getDirection(i) )));
refl_rays.setRay(i, rays.getHitPosition(i), refl_dir);
refl_rays.setImportance(i, rays.getImportance(i) * refl.data[i]);
+ refl_rays.setTime(i, rays.getTime(i));
}
}
#else // ifdef MANTA_SSE
@@ -490,6 +495,7 @@
rays.getFFNormal(i)*(2*Dot(rays.getFFNormal(i),
rays.getDirection(i) )));
refl_rays.setRay(i, rays.getHitPosition(i), refl_dir);
refl_rays.setImportance(i, rays.getImportance(i) * refl.data[i]);
+ refl_rays.setTime(i, rays.getTime(i));
}
#endif // ifdef MANTA_SSE
context.sample_generator->setupChildPacket(context, rays, refl_rays);
Modified: trunk/Model/Materials/ThinDielectric.cc
==============================================================================
--- trunk/Model/Materials/ThinDielectric.cc (original)
+++ trunk/Model/Materials/ThinDielectric.cc Sun Nov 4 13:48:19 2007
@@ -144,7 +144,7 @@
} else {
refl = SchlickReflection(costheta, costheta2, eta_inverse);
}
-
+
if (debugFlag) {
Real schlick_refl, fresnel_refl;
if (doSchlick) {
@@ -178,6 +178,7 @@
Vector refr_dir = RefractRay(rayD, normal,
eta_inverse, costheta, costheta2);
refracted_rays.setImportance(num_refr, refr_importance);
+ refracted_rays.setTime(num_refr, rays.getTime(i));
Vector refr_orig = hitpos + refr_dir * refraction_ray_length;
refracted_rays.setRay(num_refr, refr_orig, rayD);
if (debugFlag) { cerr << "refr_dir.length() =
"<<refr_dir.length()<<"\n"; }
@@ -194,6 +195,7 @@
Color refl_importance = in_importance; // * beers_color =
Color::white();
if(refl_importance.luminance() > cutoff){
reflected_rays.setImportance(num_refl, refl_importance);
+ reflected_rays.setTime(num_refl, rays.getTime(i));
reflected_rays.setRay(num_refl, hitpos, refl_dir);
refl_source[num_refl] = i;
refl_attenuation[num_refl] = Color::white();
Modified: trunk/Model/Materials/Transparent.cc
==============================================================================
--- trunk/Model/Materials/Transparent.cc (original)
+++ trunk/Model/Materials/Transparent.cc Sun Nov 4 13:48:19 2007
@@ -128,13 +128,14 @@
RayPacketData secondaryData;
RayPacket secondaryRays(secondaryData, RayPacket::UnknownShape, 0, 0,
rays.getDepth(), 0);
int map[RayPacket::MaxSize];
-
+
// Shoot a secondary ray for all 1.0 alpha values.
int size = 0;
for (int i=rays.begin();i<rays.end();++i) {
if (alpha_values.data[i] < (ColorComponent)1.0) {
secondaryRays.setOrigin ( size, rays.getHitPosition( i ) );
secondaryRays.setDirection( size, rays.getDirection ( i ) );
+ secondaryRays.setTime ( size, rays.getTime ( i ) );
map[size] = i;
++size;
}
@@ -146,7 +147,7 @@
// Blend the result of each secondary ray.
for (int i=secondaryRays.begin();i<secondaryRays.end();++i) {
-
+
Color second = secondaryRays.getColor( i );
Color first = rays.getColor( map[i] );
@@ -155,5 +156,5 @@
(second*((ColorComponent)1.0-alpha_values.data[map[i]])) +
(first*(alpha_values.data[map[i]])));
}
-
+
}
- [Manta] r1811 - in trunk: Engine/Control Engine/Shadows Interface Model/Cameras Model/Materials, boulos, 11/04/2007
Archive powered by MHonArc 2.6.16.