home *** CD-ROM | disk | FTP | other *** search
/ Late Night VRML 2.0 with Java CD-ROM / code.zip / Ch12 / geometry / PixelTexture.java < prev    next >
Text File  |  1997-01-02  |  4KB  |  176 lines

  1. // VRML Generator
  2. // Copyright Justin Couch 1996
  3. //
  4. // Chapter 13: Late Night VRML 2.0 and Java
  5. //
  6. // Shape class
  7.  
  8. package geometry;
  9.  
  10. import java.io.PrintStream;
  11. import vrml.external.*;
  12. import vrml.external.field.*;
  13. import vrml.external.exception.*;
  14. import geometry.Texture;
  15.  
  16. public class PixelTexture extends Texture
  17. {
  18.     private EventInSFImage    _set_image;
  19.     private int        _width;
  20.     private int        _height;
  21.     private int        _num_components;
  22.     private int[]    _pixels;
  23.  
  24.     // Null constructor since you cannot create just a straight texture
  25.     public PixelTexture()
  26.     {
  27.         Browser b = Browser.getBrowser();
  28.  
  29.         if(b == null)
  30.             return;
  31.  
  32.         node = b.createVrmlFromString("PixelTexture {}")[0];
  33.  
  34.         _set_image = (EventInSFImage)node.getEventIn("image");
  35.  
  36.         have_browser = true;
  37.     }
  38.  
  39.     public PixelTexture(Browser b)
  40.     {
  41.         if(b == null)
  42.             return;
  43.  
  44.         node = b.createVrmlFromString("PixelTexture {}")[0];
  45.  
  46.         _set_image = (EventInSFImage)node.getEventIn("image");
  47.  
  48.         have_browser = true;
  49.     }
  50.  
  51.     public PixelTexture(boolean rptS, boolean rptT)
  52.     {
  53.         String  tmp = "PixelTexture { ";
  54.  
  55.         repeatS = rptS;
  56.         repeatT = rptT;
  57.  
  58.         if(!repeatS)
  59.             tmp += "repeatS FALSE ";
  60.         if(!repeatT)
  61.             tmp += "repeatT FALSE ";
  62.  
  63.         tmp += "}";
  64.  
  65.         Browser b = Browser.getBrowser();
  66.  
  67.         if(b == null)
  68.             return;
  69.  
  70.         node = b.createVrmlFromString(tmp)[0];
  71.  
  72.         _set_image = (EventInSFImage)node.getEventIn("image");
  73.  
  74.         have_browser = true;
  75.     }
  76.  
  77.     public PixelTexture(Browser b, boolean rptS, boolean rptT)
  78.     {
  79.         String  tmp = "PixelTexture { ";
  80.  
  81.         repeatS = rptS;
  82.         repeatT = rptT;
  83.  
  84.         if(!repeatS)
  85.             tmp += "repeatS FALSE ";
  86.         if(!repeatT)
  87.             tmp += "repeatT FALSE ";
  88.  
  89.         tmp += "}";
  90.  
  91.         if(b == null)
  92.             return;
  93.  
  94.         node = b.createVrmlFromString(tmp)[0];
  95.  
  96.         _set_image = (EventInSFImage)node.getEventIn("image");
  97.  
  98.         have_browser = true;
  99.     }
  100.  
  101.     public void writeToFile(PrintStream fp, int indent)
  102.     {
  103.         int     i;
  104.         StringBuffer buffer = new StringBuffer();
  105.  
  106.         for(i = 0; i < indent; i++)
  107.             buffer.append("  ");
  108.  
  109.         fp.print(buffer.toString() + " texture ");
  110.         if(name != null)
  111.             fp.print("DEF " + name + " ");
  112.  
  113.         fp.println("PixelTexture {");
  114.  
  115.         if(!repeatS)
  116.             fp.println(buffer.toString() + " repeatS FALSE");
  117.         if(!repeatT)
  118.             fp.println(buffer.toString() + " repeatT FALSE");
  119.  
  120.         if((_width != 0) && (_height != 0))
  121.         {
  122.             fp.println(buffer.toString() + " image " + _width +
  123.                         " " +  _height + " " + _num_components);
  124.  
  125.             int num_vals = _width * _height * _num_components;
  126.  
  127.             switch(_num_components)
  128.             {
  129.                 case 1:
  130.                     for(i = 0; i < num_vals; i++)
  131.                         fp.println(buffer.toString() + " " + _pixels[i]);
  132.                     break;
  133.                 case 2:
  134.                     for(i = 0; i < num_vals; i += 2)
  135.                         fp.print(buffer.toString() + " " +
  136.                                  _pixels[i] + " " +
  137.                                  _pixels[i+1]);
  138.                     break;
  139.                 case 3:
  140.                     for(i = 0; i < num_vals; i += 3)
  141.                         fp.println(buffer.toString() + " " +
  142.                                  _pixels[i] + " " +
  143.                                  _pixels[i + 1] + " " +
  144.                                  _pixels[i + 2]);
  145.                     break;
  146.                 case 4:
  147.                     for(i = 0; i < num_vals; i += 4)
  148.                         fp.print(buffer.toString() + " " +
  149.                                  _pixels[i] + " " +
  150.                                  _pixels[i + 1] + " " +
  151.                                  _pixels[i + 2] + " " +
  152.                                  _pixels[i + 3]);
  153.                     break;
  154.                 default: break;
  155.             }
  156.         }
  157.     }
  158.  
  159.     public void set_image(int width,
  160.                           int height,
  161.                           int num_components,
  162.                           int[] pixels)
  163.     {
  164.         _width = width;
  165.         _height = height;
  166.         _num_components = num_components;
  167.  
  168.         // now will this work? Should I make an internal copy or not?
  169.         _pixels = pixels;
  170.         // this is causing problems -does not seem to be implemented in the
  171.         // external interface.
  172. //        if(have_browser)
  173. //            _set_image.setValue(width, pixels);
  174.     }
  175. }
  176.