Text archives Help
- 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.