Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[Manta] r1988 - in trunk: Model/Lights Model/Materials scenes


Chronological Thread 
  • 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.

Top of page