Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[MANTA] r1598 - in trunk: Model/Textures SwigInterface


Chronological Thread 
  • From: leenak@sci.utah.edu
  • To: manta@sci.utah.edu
  • Subject: [MANTA] r1598 - in trunk: Model/Textures SwigInterface
  • Date: Wed, 1 Aug 2007 11:03:05 -0600 (MDT)

Author: leenak
Date: Wed Aug  1 11:03:04 2007
New Revision: 1598

Added:
   trunk/Model/Textures/TileTexture.cc
   trunk/Model/Textures/TileTexture.h
Modified:
   trunk/Model/Textures/CMakeLists.txt
   trunk/SwigInterface/manta.i
Log:
TileTexture class is finally added to Manta

Modified: trunk/Model/Textures/CMakeLists.txt
==============================================================================
--- trunk/Model/Textures/CMakeLists.txt (original)
+++ trunk/Model/Textures/CMakeLists.txt Wed Aug  1 11:03:04 2007
@@ -3,8 +3,8 @@
 SET( Manta_Textures_SRCS
      Textures/CheckerTexture.cc
      Textures/CheckerTexture.h
-#     Textures/TileTexture.cc
-#     Textures/TileTexture.h
+     Textures/TileTexture.cc
+     Textures/TileTexture.h
      Textures/ColorMap.cc
      Textures/ColorMap.h
      Textures/Constant.cc

Added: trunk/Model/Textures/TileTexture.cc
==============================================================================
--- (empty file)
+++ trunk/Model/Textures/TileTexture.cc Wed Aug  1 11:03:04 2007
@@ -0,0 +1,293 @@
+
+/*
+ * TileTexture.cc
+ */

+#include <Model/Textures/TileTexture.h>
+
+#ifdef MANTA_SSE
+namespace Manta {
+  
+template<>
+void TileTexture<Color>::mapValues(Packet<Color>& results, const 
RenderContext& context, RayPacket& rays) const
+{
+    if(need_w)
+      rays.computeTextureCoordinates3(context);
+    else
+      rays.computeTextureCoordinates2(context);
+
+    int b = (rays.rayBegin + 3) & (~3);
+    int e = rays.rayEnd & (~3);
+    if(b == e){
+      for(int i = rays.begin(); i < rays.end(); i++){
+        Real vv1 = Dot(rays.getTexCoords(i), v1);
+        Real vv2 = Dot(rays.getTexCoords(i), v2);
+               Real vv1_=vv1;
+        Real vv2_=vv2;
+           int i1;
+           int i2;
+        if(vv1>0){
+          i1 =(int)vv1;
+           }
+           else
+           {
+             int i11=-(int)(-vv1);
+                 if(i11==vv1)
+                   i1=i11;
+                 else
+                   i1=i11-1;
+           }    
+           if(vv2>0){
+           i2 =(int)vv2;
+           }
+           else
+           {
+             int i22=-(int)(-vv2);
+                 if(i22==vv2)
+                    i2=i22;
+                 else
+                    i2=i22-1;
+           }           
+           Real ii1=vv1_-i1;
+               Real ii2=vv2_-i2;
+        int which = ((ii1<tile_gap)||(ii2<tile_gap));
+        results.set(i, values[which]);
+      }
+    } else {
+      int i = rays.rayBegin;
+      for(;i<b;i++){
+        Real vv1 = Dot(rays.getTexCoords(i), v1);
+        Real vv2 = Dot(rays.getTexCoords(i), v2);
+               Real vv1_=vv1;
+        Real vv2_=vv2;
+        int i1;
+           int i2;
+        if(vv1>0){
+          i1 =(int)vv1;
+           }
+           else
+           {
+              int i11=-(int)(-vv1);
+                  if(i11==vv1)
+                    i1=i11;
+                  else
+                   i1=i11-1;
+          }     
+          if(vv2>0){
+        i2 =(int)vv2;
+          }
+          else
+          {
+            int i22=-(int)(-vv2);
+                if(i22==vv2)
+                  i2=i22;
+                else
+                  i2=i22-1;
+          }            
+           Real ii1=vv1_-i1;
+               Real ii2=vv2_-i2;
+        int which = ((ii1<tile_gap)||(ii2<tile_gap));
+        results.set(i, values[which]);
+      }
+      RayPacketData* data = rays.data;
+      // Set rounding modes to round toward -inf
+      int old_csr = _mm_getcsr();
+      _mm_setcsr((old_csr & ~_MM_ROUND_MASK) | _MM_ROUND_DOWN);
+      for(;i<e;i+=4){
+        __m128 tx = _mm_load_ps(&data->texCoords[0][i]);
+        __m128 ty = _mm_load_ps(&data->texCoords[1][i]);
+        __m128 tz = _mm_load_ps(&data->texCoords[2][i]);
+        __m128 vv1 = _mm_add_ps(_mm_add_ps(_mm_mul_ps(tx, 
_mm_set1_ps(v1[0])), _mm_mul_ps(ty, _mm_set1_ps(v1[1]))), _mm_mul_ps(tz, 
_mm_set1_ps(v1[2])));
+        __m128 vv2 = _mm_add_ps(_mm_add_ps(_mm_mul_ps(tx, 
_mm_set1_ps(v2[0])), _mm_mul_ps(ty, _mm_set1_ps(v2[1]))), _mm_mul_ps(tz, 
_mm_set1_ps(v2[2])));
+        __m128i i1 = _mm_cvtps_epi32(vv1);
+        __m128i i2 = _mm_cvtps_epi32(vv2);
+        __m128i which = _mm_and_si128(_mm_add_epi32(i1, i2), 
_mm_set1_epi32(1));
+        __m128i mask = _mm_cmpeq_epi32(which, _mm_setzero_si128());
+        __m128 valuer = _mm_or_ps(_mm_and_ps((__m128)_mm_castsi128_ps(mask), 
_mm_set1_ps(values[0][0])),
+                                 
_mm_andnot_ps((__m128)_mm_castsi128_ps(mask), _mm_set1_ps(values[1][0])));
+        _mm_store_ps(&results.colordata[0][i], valuer);
+        __m128 valueg = _mm_or_ps(_mm_and_ps((__m128)_mm_castsi128_ps(mask), 
_mm_set1_ps(values[0][1])),
+                                 
_mm_andnot_ps((__m128)_mm_castsi128_ps(mask), _mm_set1_ps(values[1][1])));
+        _mm_store_ps(&results.colordata[1][i], valueg);
+        __m128 valueb = _mm_or_ps(_mm_and_ps((__m128)_mm_castsi128_ps(mask), 
_mm_set1_ps(values[0][2])),
+                                 
_mm_andnot_ps((__m128)_mm_castsi128_ps(mask), _mm_set1_ps(values[1][2])));
+        _mm_store_ps(&results.colordata[2][i], valueb);
+      }
+      _mm_setcsr(old_csr);
+      for(;i<rays.rayEnd;i++){
+        Real vv1 = Dot(rays.getTexCoords(i), v1);
+        Real vv2 = Dot(rays.getTexCoords(i), v2);
+               Real vv1_=vv1;
+        Real vv2_=vv2;
+               int i1;
+           int i2;
+        if(vv1>0){
+         i1 =(int)vv1;
+           }
+           else
+           {
+            int i11=-(int)(-vv1);
+                if(i11==vv1)
+                 i1=i11;
+                else
+                 i1=i11-1;
+           }    
+           if(vv2>0){
+         i2 =(int)vv2;
+           }
+           else
+           {
+            int i22=-(int)(-vv2);
+                if(i22==vv2)
+                 i2=i22;
+                else
+                 i2=i22-1;
+           }           
+           Real ii1=vv1_-i1;
+               Real ii2=vv2_-i2;
+        int which = ((ii1<tile_gap)||(ii2<tile_gap));
+        results.set(i, values[which]);
+      }
+    }
+}
+
+template<>
+void TileTexture<float>::mapValues(Packet<float>& results, const 
RenderContext& context, RayPacket& rays) const
+{
+    if(need_w)
+      rays.computeTextureCoordinates3(context);
+    else
+      rays.computeTextureCoordinates2(context);
+    int b = (rays.rayBegin + 3) & (~3);
+    int e = rays.rayEnd & (~3);
+    if(b == e){
+      for(int i = rays.begin(); i < rays.end(); i++){
+        Real vv1 = Dot(rays.getTexCoords(i), v1);
+        Real vv2 = Dot(rays.getTexCoords(i), v2);
+               Real vv1_=vv1;
+        Real vv2_=vv2;
+               int i1;
+           int i2;
+        if(vv1>0){
+         i1 =(int)vv1;
+           }
+           else
+           {
+            int i11=-(int)(-vv1);
+                if(i11==vv1)
+                 i1=i11;
+                else
+                 i1=i11-1;
+           }    
+           if(vv2>0){
+         i2 =(int)vv2;
+           }
+           else
+           {
+            int i22=-(int)(-vv2);
+                if(i22==vv2)
+                 i2=i22;
+                else
+                 i2=i22-1;
+           }           
+           Real ii1=vv1_-i1;
+               Real ii2=vv2_-i2;
+        int which = ((ii1<tile_gap)||(ii2<tile_gap));
+        results.set(i, values[which]);
+      }
+    } else {
+      int i = rays.rayBegin;
+      for(;i<b;i++){
+        Real vv1 = Dot(rays.getTexCoords(i), v1);
+        Real vv2 = Dot(rays.getTexCoords(i), v2);
+               Real vv1_=vv1;
+        Real vv2_=vv2;
+               int i1;
+           int i2;
+        if(vv1>0){
+         i1 =(int)vv1;
+           }
+           else
+           {
+            int i11=-(int)(-vv1);
+                if(i11==vv1)
+                 i1=i11;
+                else
+                 i1=i11-1;
+           }    
+           if(vv2>0){
+         i2 =(int)vv2;
+           }
+           else
+           {
+            int i22=-(int)(-vv2);
+                if(i22==vv2)
+                 i2=i22;
+                else
+                 i2=i22-1;
+           }           
+           Real ii1=vv1_-i1;
+               Real ii2=vv2_-i2;
+        int which = ((ii1<tile_gap)||(ii2<tile_gap));
+        results.set(i, values[which]);
+      }
+      RayPacketData* data = rays.data;
+      // Set rounding modes to round toward -inf
+      int old_csr = _mm_getcsr();
+      _mm_setcsr((old_csr & ~_MM_ROUND_MASK) | _MM_ROUND_DOWN);
+      for(;i<e;i+=4){
+        __m128 tx = _mm_load_ps(&data->texCoords[0][i]);
+        __m128 ty = _mm_load_ps(&data->texCoords[1][i]);
+        __m128 tz = _mm_load_ps(&data->texCoords[2][i]);
+        __m128 vv1 = _mm_add_ps(_mm_add_ps(_mm_mul_ps(tx, 
_mm_set1_ps(v1[0])), _mm_mul_ps(ty, _mm_set1_ps(v1[1]))), _mm_mul_ps(tz, 
_mm_set1_ps(v1[2])));
+        __m128 vv2 = _mm_add_ps(_mm_add_ps(_mm_mul_ps(tx, 
_mm_set1_ps(v2[0])), _mm_mul_ps(ty, _mm_set1_ps(v2[1]))), _mm_mul_ps(tz, 
_mm_set1_ps(v2[2])));
+        __m128i i1 = _mm_cvtps_epi32(vv1);
+        __m128i i2 = _mm_cvtps_epi32(vv2);
+        __m128i which = _mm_and_si128(_mm_add_epi32(i1, i2), 
_mm_set1_epi32(1));
+        __m128i mask = _mm_cmpeq_epi32(which, _mm_setzero_si128());
+        __m128 value = _mm_or_ps(_mm_and_ps((__m128)_mm_castsi128_ps(mask), 
_mm_set1_ps(values[0])),
+                                 
_mm_andnot_ps((__m128)_mm_castsi128_ps(mask), _mm_set1_ps(values[1])));
+        _mm_store_ps(&results.data[i], value);
+      }
+      _mm_setcsr(old_csr);
+      for(;i<rays.rayEnd;i++){
+        Real vv1 = Dot(rays.getTexCoords(i), v1);
+        Real vv2 = Dot(rays.getTexCoords(i), v2);
+               Real vv1_=vv1;
+        Real vv2_=vv2;
+               int i1;
+           int i2;
+        if(vv1>0){
+         i1 =(int)vv1;
+           }
+           else
+           {
+            int i11=-(int)(-vv1);
+                if(i11==vv1)
+                 i1=i11;
+                else
+                 i1=i11-1;
+           }    
+           if(vv2>0){
+         i2 =(int)vv2;
+           }
+           else
+           {
+            int i22=-(int)(-vv2);
+                if(i22==vv2)
+                 i2=i22;
+                else
+                 i2=i22-1;
+           }           
+           Real ii1=vv1_-i1;
+               Real ii2=vv2_-i2;
+        int which = ((ii1<tile_gap)||(ii2<tile_gap));
+        results.set(i, values[which]);
+      }
+    }
+}
+
+} // end namespace Manta
+#endif
+
+

Added: trunk/Model/Textures/TileTexture.h
==============================================================================
--- (empty file)
+++ trunk/Model/Textures/TileTexture.h  Wed Aug  1 11:03:04 2007
@@ -0,0 +1,117 @@
+
+/*
+ *  TileTexture.h
+ *  Created by Leena Kora on 7/30/07.
+ *  
+ */
+
+/*
+ *  This Texture class is to apply tiles on the floor.
+ *  It takes 5 arguments.
+ *  First argument indicates the color of a tile and second indicates the 
color of the gap between the tiles.
+ *  Third and fourth argument indicate orientation vectors and
+ *  Fifth argument indicates tile gap.
+ *
+ */

+#ifndef Manta_Model_TileTexture_h
+#define Manta_Model_TileTexture_h
+
+#include <Interface/Texture.h>
+#include <Core/Color/Color.h>
+#include <Core/Geometry/Vector.h>
+#include <Interface/RayPacket.h>
+#include <MantaSSE.h>
+
+namespace Manta {
+  class RayPacket;
+  class RenderContext;
+  template<typename ValueType>
+  class TileTexture : public Texture<ValueType> {
+  public:
+    TileTexture(const ValueType& value1, const ValueType& value2, const 
Vector& v1, const Vector& v2, const Real tile_gap);
+    virtual ~TileTexture();
+
+    virtual void mapValues(Packet<ValueType>&, const RenderContext& context, 
RayPacket& rays) const;
+  private:
+    TileTexture(const TileTexture&);
+    TileTexture& operator=(const TileTexture&);
+
+    ValueType values[2];
+    Vector v1;
+    Vector v2;
+       bool need_w;
+    Real tile_gap;
+  };
+
+  template<class ValueType>
+  TileTexture<ValueType>::TileTexture(const ValueType& value1, const 
ValueType& value2, const Vector& v1, const Vector& v2, const Real tile_gap)
+    : v1(v1), v2(v2), tile_gap(tile_gap)
+  {
+    values[0] = value1;
+    values[1] = value2;
+    if(v1.z() == 0 && v2.z() == 0)
+      need_w = false;
+    else
+      need_w = true;
+  }
+  
+  template<class ValueType>
+  TileTexture<ValueType>::~TileTexture()
+  {
+  }
+  
+  template<class ValueType>
+    void TileTexture<ValueType>::mapValues(Packet<ValueType>& results, const 
RenderContext& context, RayPacket& rays) const
+  {
+    if(need_w)
+      rays.computeTextureCoordinates3(context);
+    else
+      rays.computeTextureCoordinates2(context);
+    for(int i=rays.begin();i<rays.end();i++){
+      Real vv1 = Dot(rays.getTexCoords(i), v1);
+      Real vv2 = Dot(rays.getTexCoords(i), v2);
+         Real vv1_=vv1;
+      Real vv2_=vv2;
+         int i1;
+         int i2;
+      if(vv1>0){
+        i1 =(int)vv1;
+         }
+         else
+         {
+           int i11=-(int)(-vv1);
+               if(i11==vv1)
+                i1=i11;
+               else
+                i1=i11-1;
+         }      
+         if(vv2>0){
+        i2 =(int)vv2;
+         }
+         else
+         {
+           int i22=-(int)(-vv2);
+               if(i22==vv2)
+                i2=i22;
+               else
+                i2=i22-1;
+         }             
+         Real ii1=vv1_-i1;
+      Real ii2=vv2_-i2;
+      int which = ((ii1<tile_gap)||(ii2<tile_gap));
+      results.set(i, values[which]);
+    }
+  }
+
+#ifdef MANTA_SSE
+  template<>
+    void TileTexture<Color>::mapValues(Packet<Color>& results, const 
RenderContext& context, RayPacket& rays) const;
+  template<>
+    void TileTexture<float>::mapValues(Packet<float>& results, const 
RenderContext& context, RayPacket& rays) const;
+#endif
+
+}
+
+
+#endif

Modified: trunk/SwigInterface/manta.i
==============================================================================
--- trunk/SwigInterface/manta.i (original)
+++ trunk/SwigInterface/manta.i Wed Aug  1 11:03:04 2007
@@ -177,12 +177,14 @@
 %{
 #include <Model/Textures/Constant.h>
 #include <Model/Textures/CheckerTexture.h>
+#include <Model/Textures/TileTexture.h>
 #include <Model/Textures/ImageTexture.h>
 #include <Model/Textures/MarbleTexture.h>
 %}
 
 %include <Model/Textures/Constant.h>
 %include <Model/Textures/CheckerTexture.h>
+%include <Model/Textures/TileTexture.h>
 %include <Model/Textures/ImageTexture.h>
 %include <Model/Textures/MarbleTexture.h>
 
@@ -204,9 +206,9 @@
   %template(CheckerTexture_Color) CheckerTexture<Color>;
   %template(CheckerTexture_Real) CheckerTexture<Manta::Real>;
   %template(CheckerTexture_ColorComponent) 
CheckerTexture<Manta::ColorComponent>;
-#  %template(TileTexture_Color) TileTexture<Color>;
-#  %template(TileTexture_Real) TileTexture<Manta::Real>;
-#  %template(TileTexture_ColorComponent) TileTexture<Manta::ColorComponent>;
+  %template(TileTexture_Color) TileTexture<Color>;
+  %template(TileTexture_Real) TileTexture<Manta::Real>;
+  %template(TileTexture_ColorComponent) TileTexture<Manta::ColorComponent>;
   %template(Constant_Color) Constant<Color>;
   %template(ImageTexture_Color) ImageTexture<Manta::Color>;
   %template(MarbleTexture_Color) MarbleTexture<Manta::Color>;




  • [MANTA] r1598 - in trunk: Model/Textures SwigInterface, leenak, 08/01/2007

Archive powered by MHonArc 2.6.16.

Top of page