Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[MANTA] r1086 - in trunk: . Engine/Display Image Model/Materials SwigInterface


Chronological Thread 
  • From: bigler@sci.utah.edu
  • To: manta@sci.utah.edu
  • Subject: [MANTA] r1086 - in trunk: . Engine/Display Image Model/Materials SwigInterface
  • Date: Fri, 26 May 2006 12:17:17 -0600 (MDT)

Author: bigler
Date: Fri May 26 12:17:16 2006
New Revision: 1086

Modified:
   trunk/Engine/Display/OpenGLDisplay.cc
   trunk/Engine/Display/OpenGLDisplay.h
   trunk/Engine/Display/PureOpenGLDisplay.cc
   trunk/Engine/Display/PureOpenGLDisplay.h
   trunk/Image/SimpleImage.h
   trunk/Image/SimpleImage_special.cc
   trunk/Model/Materials/Phong.cc
   trunk/SwigInterface/wxManta.py
   trunk/commandlines
Log:

Engine/Display/OpenGLDisplay.cc
Engine/Display/OpenGLDisplay.h

  Added buffer options for passing to PureOpenGLDisplay.

  Don't setup the OpenGL pipeline for the frame rate display if you
  aren't going to display it.

  Added a MaybeSet class to help with passing parameters to
  PureOpenGLDisplay.

Engine/Display/PureOpenGLDisplay.cc
Engine/Display/PureOpenGLDisplay.h

  Added single_buffered and use_buffersubdata flags.

  Tried to clean some of the OpenGL definitions for Mac a bit.

Image/SimpleImage.h
Image/SimpleImage_special.cc

  Added SSE conversion for RGBA8Pixels.

Model/Materials/Phong.cc

  Set the highlight_threshold to 0 to fix a bug.  Steve tried to
  implement an optimization where if the fallof of the exponent was
  small enough you could avoid computing the the specular component.
  This was done using if (Dot(H, normal) > highlight_threshold).
  However, if the H vector is not normalized then you run into
  trouble.  There are two ways to fix it.  You can either set
  highlight_threshold to 0 or multiply Dot(H, normal) by the
  inv_length.  For now, I did the former.  We could still need to
  compute Dot(H, normal)*inv_length, so we could still save a call to
  ipow.

SwigInterface/wxManta.py

  Set the canvas as the focus, so keyboard events go the right place
  as soon as the program starts.

commandlines

  A command line for the iwviewer as well as two for comparing
  performance of the texture binding versus glDrawPixels display
  methods.


Modified: trunk/Engine/Display/OpenGLDisplay.cc
==============================================================================
--- trunk/Engine/Display/OpenGLDisplay.cc       (original)
+++ trunk/Engine/Display/OpenGLDisplay.cc       Fri May 26 12:17:16 2006
@@ -59,6 +59,14 @@
       displayFrameRate = false;
     } else if(args[i] == "-v"){
       verbose = true;
+    } else if(args[i] == "-singlebuffered"){
+      single_buffered.set(true);
+    } else if(args[i] == "-doublebuffered"){
+      single_buffered.set(false);
+    } else if(args[i] == "-buffersubdata"){
+      use_buffersubdata.set(true);
+    } else if(args[i] == "-mapbuffer"){
+      use_buffersubdata.set(false);
     } else {
       throw IllegalArgument("OpenGLDisplay", i, args);
     }
@@ -94,6 +102,10 @@
   last_frame_time = 0;
   ogl = new PureOpenGLDisplay(mode);
   if (verbose) ogl->verbose = verbose;
+  if (single_buffered.isSet())
+    ogl->single_buffered = single_buffered.get();
+  if (use_buffersubdata.isSet())
+    ogl->use_buffersubdata = use_buffersubdata.get();
 }
 
 OpenGLDisplay::~OpenGLDisplay()
@@ -285,13 +297,14 @@
   ogl->displayImage(image);
 
   // Display the frame rate
-  glMatrixMode(GL_PROJECTION);
-  glLoadIdentity();
-  gluOrtho2D(0, xres, 0, yres);
-  glMatrixMode(GL_MODELVIEW);
-  glLoadIdentity();
-  if(displayFrameRate)
+  if(displayFrameRate) {
+    glMatrixMode(GL_PROJECTION);
+    glLoadIdentity();
+    gluOrtho2D(0, xres, 0, yres);
+    glMatrixMode(GL_MODELVIEW);
+    glLoadIdentity();
     display_frame_rate(1.0/(currentTime-last_frame_time));
+  }
   last_frame_time = currentTime;
   
   glXSwapBuffers(dpy, win);

Modified: trunk/Engine/Display/OpenGLDisplay.h
==============================================================================
--- trunk/Engine/Display/OpenGLDisplay.h        (original)
+++ trunk/Engine/Display/OpenGLDisplay.h        Fri May 26 12:17:16 2006
@@ -3,6 +3,7 @@
 #define Manta_Engine_OpenGLDisplay_h
 
 #include <Interface/ImageDisplay.h>
+#include <SCIRun/Core/Util/Assert.h>
 #include <X11/Xlib.h>
 #include <GL/glx.h>
 
@@ -47,6 +48,28 @@
     string mode;
     PureOpenGLDisplay* ogl;
     bool verbose;
+
+    // Handy little class to test whether a variable has been set.
+    // This assumes that you only want to use the value if you called
+    // set.
+    template<class T>
+    class MaybeSet {
+    public:
+      MaybeSet(): isset_(false) {}
+      void set(const T& new_val) {
+        isset_ = true;
+        val = new_val;
+      }
+      T& get() { ASSERT(isset_); return val; }
+      const T& get() const { ASSERT(isset_); return val; }
+      
+      bool isSet() { return isset_; }
+    private:
+      T val;
+      bool isset_;
+    };
+    MaybeSet<bool> single_buffered;
+    MaybeSet<bool> use_buffersubdata;
 
     bool displayFrameRate;
 

Modified: trunk/Engine/Display/PureOpenGLDisplay.cc
==============================================================================
--- trunk/Engine/Display/PureOpenGLDisplay.cc   (original)
+++ trunk/Engine/Display/PureOpenGLDisplay.cc   Fri May 26 12:17:16 2006
@@ -50,71 +50,64 @@
 // For some reason, apple has these extensions but doesn't have the proper
 // definitions when it is being used under X11.  Define them here.
 #ifndef GL_EXT_texture_rectangle
-#define GL_EXT_texture_rectangle 1
-#define GL_TEXTURE_RECTANGLE_EXT          0x84F5
-#define GL_TEXTURE_BINDING_RECTANGLE_EXT  0x84F6
-#define GL_PROXY_TEXTURE_RECTANGLE_EXT    0x84F7
-#define GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT 0x84F8
+#  define GL_EXT_texture_rectangle 1
+#  define GL_TEXTURE_RECTANGLE_EXT          0x84F5
+#  define GL_TEXTURE_BINDING_RECTANGLE_EXT  0x84F6
+#  define GL_PROXY_TEXTURE_RECTANGLE_EXT    0x84F7
+#  define GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT 0x84F8
 #endif
 #ifndef GL_APPLE_client_storage
-#define GL_APPLE_client_storage 1
-#define GL_UNPACK_CLIENT_STORAGE_APPLE    0x85B2
+#  define GL_APPLE_client_storage 1
+#  define GL_UNPACK_CLIENT_STORAGE_APPLE    0x85B2
 #endif
 #ifndef GL_APPLE_texture_range
-#define GL_APPLE_texture_range 1
-#define GL_TEXTURE_RANGE_LENGTH_APPLE      0x85B7
-#define GL_TEXTURE_RANGE_POINTER_APPLE     0x85B8
-#define GL_TEXTURE_STORAGE_HINT_APPLE      0x85BC
-#define GL_TEXTURE_MINIMIZE_STORAGE_APPLE  0x85B6
-#define GL_STORAGE_PRIVATE_APPLE           0x85BD
-#define GL_STORAGE_CACHED_APPLE            0x85BE
-#define GL_STORAGE_SHARED_APPLE            0x85BF
-// Unfortunately, this isn't defined
-#ifdef GL_GLEXT_FUNCTION_POINTERS
-typedef void (* glTextureRangeAPPLEProcPtr) (GLenum target, GLsizei length, 
const GLvoid *pointer);
-typedef void (* glGetTexParameterPointervAPPLEProcPtr) (GLenum target, 
GLenum pname, GLvoid **params);
-#else
-extern "C" {
-extern void glTextureRangeAPPLE(GLenum target, GLsizei length, const GLvoid 
*pointer);
-extern void glGetTexParameterPointervAPPLE(GLenum target, GLenum pname, 
GLvoid **params);
-}
-#endif /* GL_GLEXT_FUNCTION_POINTERS */
+#  define GL_APPLE_texture_range 1
+#  define GL_TEXTURE_RANGE_LENGTH_APPLE      0x85B7
+#  define GL_TEXTURE_RANGE_POINTER_APPLE     0x85B8
+#  define GL_TEXTURE_STORAGE_HINT_APPLE      0x85BC
+#  define GL_TEXTURE_MINIMIZE_STORAGE_APPLE  0x85B6
+#  define GL_STORAGE_PRIVATE_APPLE           0x85BD
+#  define GL_STORAGE_CACHED_APPLE            0x85BE
+#  define GL_STORAGE_SHARED_APPLE            0x85BF
+
+#  ifdef GL_GLEXT_FUNCTION_POINTERS
+     typedef void (* glTextureRangeAPPLEProcPtr) (GLenum target, GLsizei 
length, const GLvoid *pointer);
+     typedef void (* glGetTexParameterPointervAPPLEProcPtr) (GLenum target, 
GLenum pname, GLvoid **params);
+#  else
+     extern "C" {
+       extern void glTextureRangeAPPLE(GLenum target, GLsizei length, const 
GLvoid *pointer);
+       extern void glGetTexParameterPointervAPPLE(GLenum target, GLenum 
pname, GLvoid **params);
+     }
+#  endif /* GL_GLEXT_FUNCTION_POINTERS */
 #endif
 
 #ifndef GL_ARB_pixel_buffer_object
-#define GL_ARB_pixel_buffer_object 1
-#define GL_PIXEL_PACK_BUFFER_ARB                        0x88EB
-#define GL_PIXEL_UNPACK_BUFFER_ARB                      0x88EC
-#define GL_PIXEL_PACK_BUFFER_BINDING_ARB                0x88ED
-#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB              0x88EF
+#  define GL_ARB_pixel_buffer_object 1
+#  define GL_PIXEL_PACK_BUFFER_ARB                        0x88EB
+#  define GL_PIXEL_UNPACK_BUFFER_ARB                      0x88EC
+#  define GL_PIXEL_PACK_BUFFER_BINDING_ARB                0x88ED
+#  define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB              0x88EF
 #endif
 
 #ifndef GL_ARB_vertex_buffer_object
-#ifdef GL_GLEXT_FUNCTION_POINTERS
+#  ifdef GL_GLEXT_FUNCTION_POINTERS
 typedef void (* glBindBufferARBProcPtr) (GLenum target, GLuint buffer);
 typedef void (* glDeleteBuffersARBProcPtr) (GLsizei n, const GLuint 
*buffers);
 typedef void (* glGenBuffersARBProcPtr) (GLsizei n, GLuint *buffers);
-typedef GLboolean (* glIsBufferARBProcPtr) (GLuint buffer);
 typedef void (* glBufferDataARBProcPtr) (GLenum target, GLsizeiptrARB size, 
const GLvoid *data, GLenum usage);
 typedef void (* glBufferSubDataARBProcPtr) (GLenum target, GLintptrARB 
offset, GLsizeiptrARB size, const GLvoid *data);
-typedef void (* glGetBufferSubDataARBProcPtr) (GLenum target, GLintptrARB 
offset, GLsizeiptrARB size, GLvoid *data);
 typedef GLvoid *(* glMapBufferARBProcPtr) (GLenum target, GLenum access);
 typedef GLboolean (* glUnmapBufferARBProcPtr) (GLenum target);
-typedef void (* glGetBufferParameterivARBProcPtr) (GLenum target, GLenum 
pname, GLint *params);
-typedef void (* glGetBufferPointervARBProcPtr) (GLenum target, GLenum pname, 
GLvoid **params);
 #else
 extern "C" {
 extern void glBindBufferARB(GLenum target, GLuint buffer);
 extern void glDeleteBuffersARB(GLsizei n, const GLuint *buffers);
 extern void glGenBuffersARB(GLsizei n, GLuint *buffers);
-extern GLboolean glIsBufferARB(GLuint buffer);
 extern void glBufferDataARB(GLenum target, GLsizeiptrARB size, const GLvoid 
*data, GLenum usage);
 extern void glBufferSubDataARB(GLenum target, GLintptrARB offset, 
GLsizeiptrARB size, const GLvoid *data);
 extern void glGetBufferSubDataARB(GLenum target, GLintptrARB offset, 
GLsizeiptrARB size, GLvoid *data);
 extern GLvoid *glMapBufferARB(GLenum target, GLenum access);
 extern GLboolean glUnmapBufferARB(GLenum target);
-extern void glGetBufferParameterivARB(GLenum target, GLenum pname, GLint 
*params);
-extern void glGetBufferPointervARB(GLenum target, GLenum pname, GLvoid 
**params);
 }
 #endif /* GL_GLEXT_FUNCTION_POINTERS */
 #endif
@@ -236,6 +229,8 @@
 {
   mode = "texture";
   verbose = false;
+  single_buffered = true;
+  use_buffersubdata = true;
 }
 
 void
@@ -514,7 +509,7 @@
   PBO* pbo = &pbos[current_pbo];
 
   if(pbo->need_ids){
-    cerr << "Computing ids for current_pbo = "<<current_pbo<<"\n";
+    if (verbose) cerr << "Computing ids for current_pbo = 
"<<current_pbo<<"\n";
     // Free old textures if necessary...
     glGenTextures(1, &pbo->texId);
     glGenBuffersARB(1, &pbo->bufId);
@@ -526,33 +521,52 @@
   // Set up the buffer
   glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pbo->bufId);
 
-  if (resize_buffer) {
-    // Allocate more space for the buffer.
+  if (use_buffersubdata) {
+    if (resize_buffer) {
+      // Bind the buffer
+      glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB,
+                      pbo->texSize, si->getRawData(0),
+                      GL_STREAM_DRAW_ARB);
+    } else {
+      glBufferSubDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0 /*offset*/,
+                         pbo->texSize, si->getRawData(0));
+    }
+  } else {
+    if (resize_buffer) {
+      // Allocate more space for the buffer.
     
-    // Reset the contents of the texSize-sized buffer object
-    glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, pbo->texSize, NULL,
-                    GL_STREAM_DRAW_ARB);
-  }
-
-  // Map the memory.  The contents are undefined, because of the
-  // previous call to glBufferData.
-  void* pboMemory = glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB,
-                                   GL_WRITE_ONLY_ARB);
-
-  // Copy the data
-  memcpy(pboMemory, si->getRawData(0), pbo->texSize);
+      // Reset the contents of the texSize-sized buffer object
+      glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, pbo->texSize, NULL,
+                      GL_STREAM_DRAW_ARB);
+    }
 
-  // Unmap the texture image buffer
-  glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB);
+    // Map the memory.  The contents are undefined, because of the
+    // previous call to glBufferData.
+    void* pboMemory = glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB,
+                                     GL_WRITE_ONLY_ARB);
+
+    if (pboMemory == NULL) {
+      cerr << "pboMemory is null\n";
+      have_pbo = false;
+      return false;
+    }
+    // Copy the data
+    memcpy(pboMemory, si->getRawData(0), pbo->texSize);
 
+    // Unmap the texture image buffer
+    glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB);
+  }
+  
   // Now use the other pbo, but only if it has been initialized
   int prev_pbo = 1 - current_pbo;
   // Cycle to the next pbo
   current_pbo = 1 - current_pbo;
-  pbo = &pbos[prev_pbo];
-  if(pbo->need_ids) {
-    cerr << "Skipping rendering frame for prev_pbo = "<<prev_pbo<<"\n";
-    return true;
+  if (!single_buffered) {
+    pbo = &pbos[prev_pbo];
+    if(pbo->need_ids) {
+      if (verbose) cerr << "Skipping rendering frame for prev_pbo = 
"<<prev_pbo<<"\n";
+      return true;
+    }
   }
 
   

Modified: trunk/Engine/Display/PureOpenGLDisplay.h
==============================================================================
--- trunk/Engine/Display/PureOpenGLDisplay.h    (original)
+++ trunk/Engine/Display/PureOpenGLDisplay.h    Fri May 26 12:17:16 2006
@@ -32,7 +32,7 @@
 #include <Core/Color/RGBColor.h>
 
 #include <GL/gl.h>
-#include <GL/glext.h>
+//#include <GL/glext.h>
 
 #ifdef __APPLE__
 #ifndef GL_ARB_vertex_buffer_object
@@ -72,6 +72,8 @@
     void displayImage(const Image* image);
 
     bool verbose;
+    bool single_buffered;
+    bool use_buffersubdata;
   private:
     PureOpenGLDisplay(const PureOpenGLDisplay&);
     PureOpenGLDisplay& operator=(const PureOpenGLDisplay&);

Modified: trunk/Image/SimpleImage.h
==============================================================================
--- trunk/Image/SimpleImage.h   (original)
+++ trunk/Image/SimpleImage.h   Fri May 26 12:17:16 2006
@@ -129,6 +129,9 @@
   template<>
     void SimpleImage<BGRA8Pixel>::set(const Fragment& fragment);
 
+  template<>
+    void SimpleImage<RGBA8Pixel>::set(const Fragment& fragment);
+
   template<class Pixel>
   void SimpleImage<Pixel>::get(Fragment& fragment) const
   {

Modified: trunk/Image/SimpleImage_special.cc
==============================================================================
--- trunk/Image/SimpleImage_special.cc  (original)
+++ trunk/Image/SimpleImage_special.cc  Fri May 26 12:17:16 2006
@@ -117,3 +117,67 @@
   }
 }
 
+template<>
+void SimpleImage<RGBA8Pixel>::set(const Fragment& fragment)
+{
+  if(fragment.getFlag(Fragment::ConsecutiveX|Fragment::ConstantEye) ==
+     Fragment::ConsecutiveX|Fragment::ConstantEye){
+    int b = fragment.begin();
+    RGBA8Pixel* pix = 
eyeStart[fragment.getWhichEye(b)][fragment.getY(b)]+fragment.getX(b);
+#if MANTA_SSE
+    // If the fragment and the pixel are on an aligned boundary, use SSE
+    if(((fragment.pixelBegin | fragment.pixelEnd) & 0x3) == 0){
+      // Aligned for SSE
+      __m128 scale = _mm_set1_ps( 255.99999f );
+      int f = fragment.end()-3;
+      for(int i=fragment.begin(); i< f;i+=4){
+        __m128 r = _mm_load_ps(&fragment.color[0][i]);
+        __m128 g = _mm_load_ps(&fragment.color[1][i]);
+        __m128 b = _mm_load_ps(&fragment.color[2][i]);
+        r = _mm_mul_ps(r, scale);
+        g = _mm_mul_ps(g, scale);
+        b = _mm_mul_ps(b, scale);
+        __m128i alpha = _mm_set1_epi32(255);  // alpha a0a1a2a3
+        __m128i r32 = _mm_cvttps_epi32(r); // 32 bits: r0r1r2r3
+        __m128i g32 = _mm_cvttps_epi32(g); // 32 bits: g0g1g2g3
+        __m128i b32 = _mm_cvttps_epi32(b); // 32 bits: b0b1b2b3
+
+        // 16 bits: b0b1b2b3r0r1r2r3
+        __m128i rb16 = _mm_packs_epi32(r32, b32);
+
+        // 16 bits: g0g1g2g3a0a1a2a3
+        __m128i ga16 = _mm_packs_epi32(g32, alpha);
+
+        // 16 bits: b0g0b1g1b2g2b3g3
+        __m128i rg16 = _mm_unpacklo_epi16(rb16, ga16);
+
+        // 16 bits: r0a0r1a1r2a2r3a3
+        __m128i ba16 = _mm_unpackhi_epi16(rb16, ga16);
+
+        // 16 bits: b0g0r0a0b1g1r1a1
+        __m128i rgba16a = _mm_unpacklo_epi32(rg16, ba16);
+
+        // 16 bits: b2g2r2a2b3g3r3a3
+        __m128i rgba16b = _mm_unpackhi_epi32(rg16, ba16);
+
+        // 32 bits: b0g0r0a0 ... b3g3r3a3
+        __m128i result = _mm_packus_epi16(rgba16a, rgba16b);
+
+        // Copy data over
+        _mm_stream_si128((__m128i*)pix, result);
+
+        pix += 4;
+      }
+    } else
+#endif /* MANTA_SSE */
+    {
+      for(int i=fragment.begin(); i< fragment.end();i++)
+        convertToPixel(*pix++, fragment.getColor(i).convertRGB());
+    }
+  } else {
+    for(int i=fragment.begin();i<fragment.end();i++){
+      
convertToPixel(eyeStart[fragment.getWhichEye(i)][fragment.getY(i)][fragment.getX(i)],
 fragment.getColor(i).convertRGB());
+    }
+  }
+}
+

Modified: trunk/Model/Materials/Phong.cc
==============================================================================
--- trunk/Model/Materials/Phong.cc      (original)
+++ trunk/Model/Materials/Phong.cc      Fri May 26 12:17:16 2006
@@ -58,6 +58,7 @@
   refltex = new Constant<ColorComponent>(refl);
   do_refl = (refl != 0);
   highlight_threshold = SCIRun::Pow(COLOR_EPSILON, 1./specpow);
+  highlight_threshold = 0;
 }
 
 Phong::Phong(const Texture<Color>* diffusetex,
@@ -76,6 +77,7 @@
     do_refl = false;
   }
   highlight_threshold = SCIRun::Pow(COLOR_EPSILON, 1./specpow);
+  highlight_threshold = 0;
 }
 
 Phong::~Phong()

Modified: trunk/SwigInterface/wxManta.py
==============================================================================
--- trunk/SwigInterface/wxManta.py      (original)
+++ trunk/SwigInterface/wxManta.py      Fri May 26 12:17:16 2006
@@ -199,6 +199,8 @@
         self.canvas.Bind( wx.EVT_RIGHT_DOWN, self.OnRightDown )
         # Keyboard events are ignored for wx.Frame.
         self.canvas.Bind( wx.EVT_KEY_DOWN, self.OnChar )
+        # Make canvas the initial focus
+        wx.CallAfter(self.canvas.SetFocus)
 
         ##################################################################
         # globals

Modified: trunk/commandlines
==============================================================================
--- trunk/commandlines  (original)
+++ trunk/commandlines  Fri May 26 12:17:16 2006
@@ -1,3 +1,6 @@
 ./manta -np 8 -res 1000x1000 -scene "primtest(box -texscale 20 -material 
checker)" -camera "pinhole(-eye 0 0 8 -lookat 0 0 0 -up 0 1 0 -fov 17)" 
-shadows noshadows
 ~/manta -np 1 -scene "BARTReader(-filename smalltest.aff)"
 bin/manta -res 300x300 -scene "lib/libscene_boeing777.so( -file 
/home/bigler/manta/data/models/shape0.v3c1 -normal)" -stack 
lib/libstack_disco.so -rays 3 -kernel 5
+bin/manta -np 2 -camera "pinhole( `cat 
~/manta/data/iw/conference/conf-xy.view` )" -shadows noshadows -scene 
"lib/libscene_iwviewer.so ( -iwfile 
/home/sci/bigler/manta/data/iw/conference/conference.iw -reverse -bsp 
/home/sci/bigler/manta/data/iw/conference/conference.bsp -flat)"
+bin/manta -res 1312x800 -bench 200 10 -imagetraverser null -np 1 
-imagedisplay "opengl(-mode image)"
+bin/manta -res 1312x800 -bench 200 10 -imagetraverser null -np 1 
-imagedisplay "opengl(-mode texture)"




  • [MANTA] r1086 - in trunk: . Engine/Display Image Model/Materials SwigInterface, bigler, 05/26/2006

Archive powered by MHonArc 2.6.16.

Top of page