Text archives Help
- From: boulos@sci.utah.edu
- To: manta@sci.utah.edu
- Subject: [Manta] r1988 - in trunk: Model/Lights Model/Materials scenes
- Date: Thu, 10 Jan 2008 22:07:53 -0700 (MST)
Author: boulos
Date: Thu Jan 10 22:07:50 2008
New Revision: 1988
Added:
trunk/Model/Materials/EmitMaterial.cc
- copied, changed from r1986,
trunk/Model/Materials/CopyTextureMaterial.cc
trunk/Model/Materials/EmitMaterial.h
- copied, changed from r1986,
trunk/Model/Materials/CopyTextureMaterial.h
Modified:
trunk/Model/Lights/AreaLight.cc
trunk/Model/Materials/CMakeLists.txt
trunk/scenes/area_light.cc
Log:
Model/Lights/AreaLight.cc
Model/Materials/CMakeLists.txt
Model/Materials/EmitMaterial.cc
Model/Materials/EmitMaterial.h
scenes/area_light.cc
Updating Manta to actually ignore emitted light when it hits an
emitted Material (new to Manta as I didn't want to force
CopyTextureMaterial users to pay the penalty of this conditional
logic)
Modified: trunk/Model/Lights/AreaLight.cc
==============================================================================
--- trunk/Model/Lights/AreaLight.cc (original)
+++ trunk/Model/Lights/AreaLight.cc Thu Jan 10 22:07:50 2008
@@ -42,8 +42,7 @@
Real cosine = -Dot(dir, normals.get(i));
destRays.setDirection(i, dir);
destRays.overrideMinT(i, len - T_EPSILON);
- if (cosine <= Real(0) ||
- sourceRays.data->ignoreEmittedLight[i]) {
+ if (cosine <= Real(0)) {
// Wrong side of the light or we shouldn't count anyway
destRays.setColor(i, Color::black());
} else {
@@ -62,8 +61,7 @@
Real cosine = -Dot(dir, normals.get(i));
destRays.setDirection(i, dir);
destRays.overrideMinT(i, len - T_EPSILON);
- if (cosine <= Real(0) ||
- sourceRays.data->ignoreEmittedLight[i]) {
+ if (cosine <= Real(0)) {
// Wrong side of the light
destRays.setColor(i, Color::black());
} else {
@@ -108,9 +106,8 @@
_mm_store_ps(&destData->minT[i], _mm_sub_ps(len,
_mm_set1_ps(T_EPSILON)));
// If the cosine < 0 || ignoreEmittedLight != 0
- __m128 black_light = _mm_or_ps(_mm_cmple_ps(cosine, _mm_setzero_ps()),
-
_mm_cmpneq_ps(_mm_load_ps((float*)&(sourceData->ignoreEmittedLight[i])),
- _mm_setzero_ps()));
+ __m128 black_light = _mm_cmple_ps(cosine, _mm_setzero_ps());
+
if (_mm_movemask_ps(black_light) == 0xf) {
// All black
_mm_store_ps(&destData->color[0][i], _mm_setzero_ps());
Modified: trunk/Model/Materials/CMakeLists.txt
==============================================================================
--- trunk/Model/Materials/CMakeLists.txt (original)
+++ trunk/Model/Materials/CMakeLists.txt Thu Jan 10 22:07:50 2008
@@ -8,6 +8,8 @@
Materials/CopyTextureMaterial.h
Materials/Dielectric.h
Materials/Dielectric.cc
+ Materials/EmitMaterial.h
+ Materials/EmitMaterial.cc
Materials/Flat.h
Materials/Flat.cc
Materials/Lambertian.h
Copied: trunk/Model/Materials/EmitMaterial.cc (from r1986,
trunk/Model/Materials/CopyTextureMaterial.cc)
==============================================================================
--- trunk/Model/Materials/CopyTextureMaterial.cc (original)
+++ trunk/Model/Materials/EmitMaterial.cc Thu Jan 10 22:07:50 2008
@@ -1,23 +1,23 @@
-#include <Model/Materials/CopyTextureMaterial.h>
+#include <Model/Materials/EmitMaterial.h>
#include <Model/Textures/Constant.h>
using namespace Manta;
-CopyTextureMaterial::CopyTextureMaterial(const Color& color)
+EmitMaterial::EmitMaterial(const Color& color)
{
colortex = new Constant<Color>(color);
}
-CopyTextureMaterial::CopyTextureMaterial(const Texture<Color>* colortex)
+EmitMaterial::EmitMaterial(const Texture<Color>* colortex)
: colortex(colortex)
{
}
-void CopyTextureMaterial::preprocess(const PreprocessContext&)
+void EmitMaterial::preprocess(const PreprocessContext&)
{
}
-void CopyTextureMaterial::shade(const RenderContext& context,
+void EmitMaterial::shade(const RenderContext& context,
RayPacket& rays) const
{
// Compute colors
@@ -34,22 +34,36 @@
int e = (rays.rayEnd) & ~3;
if (b >= e) {
for (int i = rays.begin(); i < rays.end(); i++) {
- rays.setColor( i, colors.get(i) );
+ if (rays.getIgnoreEmittedLight(i))
+ rays.setColor(i, Color::black());
+ else
+ rays.setColor(i, colors.get(i) );
}
} else {
int i = rays.rayBegin;
for (; i < b; i++) {
- rays.setColor( i, colors.get(i) );
+ if (rays.getIgnoreEmittedLight(i))
+ rays.setColor(i, Color::black());
+ else
+ rays.setColor(i, colors.get(i) );
}
// SIMD now
RayPacketData* data = rays.data;
for (; i < e; i+= 4) {
- _mm_store_ps(&data->color[0][i], _mm_load_ps(&colors.colordata[0][i]));
- _mm_store_ps(&data->color[1][i], _mm_load_ps(&colors.colordata[1][i]));
- _mm_store_ps(&data->color[2][i], _mm_load_ps(&colors.colordata[2][i]));
+ __m128 black_light =
+ _mm_cmpneq_ps(_mm_load_ps((float*)&(data->ignoreEmittedLight[i])),
+ _mm_setzero_ps());
+ for (unsigned int c = 0; c < 3; c++) {
+ __m128 val = _mm_or_ps(_mm_and_ps(black_light, _mm_setzero_ps()),
+ _mm_andnot_ps(black_light,
_mm_load_ps(&(colors.colordata[c][i]))));
+ _mm_store_ps(&data->color[c][i], val);
+ }
}
for (; i < rays.rayEnd; i++) {
- rays.setColor( i, colors.get(i) );
+ if (rays.getIgnoreEmittedLight(i))
+ rays.setColor(i, Color::black());
+ else
+ rays.setColor(i, colors.get(i) );
}
}
#endif
Copied: trunk/Model/Materials/EmitMaterial.h (from r1986,
trunk/Model/Materials/CopyTextureMaterial.h)
==============================================================================
--- trunk/Model/Materials/CopyTextureMaterial.h (original)
+++ trunk/Model/Materials/EmitMaterial.h Thu Jan 10 22:07:50 2008
@@ -1,5 +1,5 @@
-#ifndef MANTA_MATERIAL_COPYTEXTUREMATERIAL_H__
-#define MANTA_MATERIAL_COPYTEXTUREMATERIAL_H__
+#ifndef MANTA_MATERIAL_EMITMATERIAL_H__
+#define MANTA_MATERIAL_EMITMATERIAL_H__
/*
For more information, please see:
http://software.sci.utah.edu
@@ -40,18 +40,18 @@
This material simply uses the values of the texture as the final
result disregarding any lighing parameters.
*/
- class CopyTextureMaterial: public OpaqueShadower {
+ class EmitMaterial: public OpaqueShadower {
public:
- CopyTextureMaterial(const Color& color);
- CopyTextureMaterial(const Texture<Color>* colortex);
+ EmitMaterial(const Color& color);
+ EmitMaterial(const Texture<Color>* colortex);
virtual void preprocess(const PreprocessContext&);
virtual void shade(const RenderContext& context, RayPacket& rays) const;
-
+
private:
Texture<Color> const *colortex;
};
-
+
} // end namespace Manta
-#endif // #ifndef MANTA_MATERIAL_COPYTEXTUREMATERIAL_H__
+#endif // #ifndef MANTA_MATERIAL_EMITMATERIAL_H__
Modified: trunk/scenes/area_light.cc
==============================================================================
--- trunk/scenes/area_light.cc (original)
+++ trunk/scenes/area_light.cc Thu Jan 10 22:07:50 2008
@@ -14,8 +14,8 @@
#include <Model/Textures/MarbleTexture.h>
#include <Model/Textures/ImageTexture.h>
// Manta Materials
-#include <Model/Materials/CopyTextureMaterial.h>
#include <Model/Materials/Dielectric.h>
+#include <Model/Materials/EmitMaterial.h>
#include <Model/Materials/ThinDielectric.h>
#include <Model/Materials/Flat.h>
#include <Model/Materials/NullMaterial.h>
@@ -66,7 +66,7 @@
LightSet* lights = new LightSet();
Color area_light_color = Color(RGB(.9,.85,.45))*6;
- Parallelogram* area_light_geometry = new Parallelogram(new
CopyTextureMaterial(area_light_color),
+ Parallelogram* area_light_geometry = new Parallelogram(new
EmitMaterial(area_light_color),
Vector(.25,1,.25),
Vector(.5,0,0), Vector(0,0,.5));
if(!use_point_light)
@@ -88,7 +88,7 @@
if(!use_point_light)
lights->add(new AreaLight(area_light_geometry, area_light_color));
- else
+ else
lights->add(new PointLight(Vector(.5, 1, .5), Color(RGB(.9, .85, .45))));
lights->setAmbientLight(new ConstantAmbient(Color::black()));
@@ -96,7 +96,7 @@
scene->setLights(lights);
Vector eye = Vector(0, 1.25, 2);
- Vector lookat = Vector(.6, .32, .25);
+ Vector lookat = Vector(.6, .32, .25);
scene->addBookmark("default view",
eye,
- [Manta] r1988 - in trunk: Model/Lights Model/Materials scenes, boulos, 01/11/2008
Archive powered by MHonArc 2.6.16.