home *** CD-ROM | disk | FTP | other *** search
/ Chip Special: HTML & Java / Chip-Special_1997-01_HTML-a-Java.bin / javasdk / sdk-java.exe / SDKJava.cab / Samples / directX / d3drm / Viewer / ViewFrame.java < prev   
Encoding:
Java Source  |  1996-10-10  |  34.3 KB  |  1,230 lines

  1. import java.awt.*;
  2. import java.awt.peer.ComponentPeer;
  3. import java.applet.*;
  4. import java.io.FilenameFilter;
  5. import java.io.File;
  6. import com.ms.com.*;
  7. import com.ms.awt.*;
  8. import com.ms.awt.peer.*;
  9. import com.ms.directX.*;
  10.  
  11. class FrameMoveData implements IUnknown
  12. {
  13.     float time;
  14.     d3drmAnimationSet anim;
  15. }
  16.     
  17. public class ViewFrame extends Frame implements IFrameMoveCallback, ddConstants, MenuXConstants, 
  18.         ILoadTextureCallback
  19. {
  20.     //////////////////////////////////////////////////////////////////////////
  21.     
  22.     public void callbackFrameMove(d3drmFrame obj, IUnknown punk, float delta)
  23.     {
  24.         FrameMoveData fmd = (FrameMoveData)punk;
  25.         fmd.anim.SetTime(fmd.time);
  26.         fmd.time += delta;
  27.     }
  28.  
  29.     //////////////////////////////////////////////////////////////////////////
  30.  
  31.     void setAnimationCallback(d3drmFrame frame, d3drmAnimationSet animset)
  32.     {
  33.         FrameMoveData fmd = new FrameMoveData();
  34.         fmd.time = 0;
  35.         fmd.anim = animset;
  36.  
  37.         frame.AddMoveCallback((IFrameMoveCallback)this, fmd);
  38.     }
  39.  
  40.     //////////////////////////////////////////////////////////////////////////
  41.  
  42.     public final int MENU_FILE_ABOUT            = 1 ;
  43.     public final int MENU_FILE_OPEN             = 2 ;
  44.     public final int MENU_FILE_OPEN_ANIMSET     = 3 ; 
  45.     public final int MENU_FILE_OPEN_FRAME       = 4 ;
  46.     public final int MENU_FILE_EXIT             = 5 ;
  47.     public final int MENU_EDIT_CUT              = 6 ;
  48.     public final int MENU_EDIT_COPY             = 7 ;
  49.     public final int MENU_EDIT_PASTE            = 8 ;
  50.     public final int MENU_EDIT_DELETE           = 9 ;
  51.     public final int MENU_EDIT_COLOR            = 10;
  52.     public final int MENU_EDIT_BOXES            = 11;
  53.     public final int MENU_QUALITY_LIGHTING      = 12; // first in menu
  54.     public final int MENU_QUALITY_POINTS        = 13;
  55.     public final int MENU_QUALITY_WIREFRAME     = 14;
  56.     public final int MENU_QUALITY_SOLID         = 15;
  57.     public final int MENU_QUALITY_FLAT          = 16;
  58.     public final int MENU_QUALITY_GOURAUD       = 17;
  59.     public final int MENU_QUALITY_PHONG         = 18;
  60.     public final int MENU_MODEL_MONO            = 19;
  61.     public final int MENU_MODEL_RGB             = 20;
  62.     public final int MENU_DITHER                = 21;
  63.     public final int MENU_TEXTURE_FILTERING     = 22;
  64.     public final int MENU_LIGHT_DIRECTIONAL     = 23; 
  65.     public final int MENU_LIGHT_PARALLEL_POINT  = 24;
  66.     public final int MENU_LIGHT_POINT           = 25;
  67.     public final int MENU_LIGHT_SPOT            = 26;
  68.     
  69.     MenuItemX items[] = 
  70.     {
  71.         new MenuItemX("" ,     0,                            POPUP), 
  72.         new MenuItemX("" ,     MENU_FILE_ABOUT,                0), 
  73.         new MenuItemX("" ,     MENU_FILE_OPEN,                0), 
  74.         new MenuItemX("" ,     MENU_FILE_OPEN_ANIMSET,        0), 
  75.         new MenuItemX("" ,     MENU_FILE_OPEN_FRAME,        SEPARATOR_NEXT),         
  76.         new MenuItemX("" ,     MENU_FILE_EXIT,                ENDMENU),        
  77.         new MenuItemX("" ,     0,                            POPUP), 
  78.         new MenuItemX("" ,     MENU_EDIT_CUT,                0),         
  79.         new MenuItemX("" ,     MENU_EDIT_COPY,                0),         
  80.         new MenuItemX("" ,     MENU_EDIT_PASTE,                0),         
  81.         new MenuItemX("" ,     MENU_EDIT_DELETE,            SEPARATOR_NEXT),         
  82.         new MenuItemX("" ,     MENU_EDIT_COLOR,                SEPARATOR_NEXT),        
  83.         new MenuItemX("" ,     MENU_EDIT_BOXES,                ENDMENU),     
  84.         new MenuItemX("" ,     0,                            POPUP), 
  85.         new MenuItemX("" ,     MENU_QUALITY_LIGHTING,        CHECKED + SEPARATOR_NEXT),         
  86.         new MenuItemX("" ,     MENU_QUALITY_POINTS,            0), 
  87.         new MenuItemX("" ,     MENU_QUALITY_WIREFRAME,        0), 
  88.         new MenuItemX("" ,     MENU_QUALITY_SOLID,            CHECKED+SEPARATOR_NEXT), 
  89.         new MenuItemX("" ,     MENU_QUALITY_FLAT,            CHECKED), 
  90.         new MenuItemX("" ,     MENU_QUALITY_GOURAUD,        0), 
  91.         new MenuItemX("" ,     MENU_QUALITY_PHONG,            SEPARATOR_NEXT), 
  92.         new MenuItemX("" ,     MENU_MODEL_MONO,                CHECKED),         
  93.         new MenuItemX("" ,     MENU_MODEL_RGB,                SEPARATOR_NEXT),         
  94.         new MenuItemX("" ,     MENU_DITHER,                    0), 
  95.         new MenuItemX("" ,     MENU_TEXTURE_FILTERING,        ENDMENU),
  96.         new MenuItemX("" ,     0,                            POPUP), 
  97.         new MenuItemX("" ,     MENU_LIGHT_DIRECTIONAL,        0),         
  98.         new MenuItemX("" ,     MENU_LIGHT_PARALLEL_POINT,    0),         
  99.         new MenuItemX("" ,     MENU_LIGHT_POINT,            0),        
  100.         new MenuItemX("" ,     MENU_LIGHT_SPOT,                ENDMENU)
  101.     };
  102.     
  103.     int                m_menuItems = 30;
  104.     d3drm            lpd3drm;
  105.     ddClipper        lpddclipper;
  106.     AppInfo         info;
  107.     int                hwnd;
  108.     SelectionDude    sel;
  109.     int             last_x, last_y;        // mouse positions
  110.     FlickViewer     f = null;
  111.     TestGraph         tg;
  112.     
  113.     //////////////////////////////////////////////////////////////////////////
  114.  
  115.     void dealWithBoxes()
  116.     {
  117. //        int checked = (sel.ToggleBoxes() != 0) ?CHECKED :UNCHECKED;
  118. //        MenuX menu = GetAMenu(1);
  119. //        menu.CheckMenuItem(MENU_EDIT_BOXES, BY_COMMAND | checked);
  120.         sel.ToggleBoxes();
  121.     }
  122.     
  123.     //////////////////////////////////////////////////////////////////////////
  124.  
  125.     int ShadeModeToMenuItem(int sm)
  126.     {
  127.         switch (sm) 
  128.         {
  129.             case D3DRMSHADE_FLAT:
  130.                 return 6; //MENU_QUALITY_FLAT;
  131.  
  132.             case D3DRMSHADE_GOURAUD:
  133.                 return 7 ; //MENU_QUALITY_GOURAUD;
  134.  
  135.             case D3DRMSHADE_PHONG:
  136.                 return 8; // MENU_QUALITY_PHONG;
  137.         }
  138.         return -1;
  139.     }
  140.  
  141.     //////////////////////////////////////////////////////////////////////////
  142.  
  143.     void SetShadeMode(int sm)
  144.     {
  145.         int quality = info.dev.GetQuality();
  146.         int oldsm = (int)(quality & D3DRMSHADE_MASK);
  147.  
  148.         MenuX menu = GetAMenu(2);
  149.         menu.CheckMenuItem(ShadeModeToMenuItem(oldsm), UNCHECKED | BY_POSITION);
  150.         menu.CheckMenuItem(ShadeModeToMenuItem(sm), CHECKED | BY_POSITION);
  151.  
  152.         quality = (quality & ~D3DRMSHADE_MASK) | sm;
  153.         info.dev.SetQuality(quality);
  154.     }
  155.  
  156.     //////////////////////////////////////////////////////////////////////////
  157.     
  158.     String OpenNewFile(String title)
  159.     {
  160.         FileDialog fileDialog = new FileDialog(this, title, FileDialog.LOAD);
  161.         
  162.         // set the fileNameFilter in this FileDialog object
  163.         FileName fileName = new FileName("~/", "*.x");
  164.         fileDialog.setFilenameFilter(fileName);
  165.         
  166.         // set the directory in the FileDialog object
  167.         fileDialog.setDirectory("C:\\dxsdk\\sdk\\media");
  168.         
  169.         // set the file in the FileDialog object
  170.         fileDialog.setFile("*.x");
  171.                 
  172.         // show this fileDialog to the screen
  173.         fileDialog.show();
  174.         
  175.         return fileDialog.getFile();
  176.     }
  177.     
  178.     //////////////////////////////////////////////////////////////////////////
  179.     
  180.     ViewFrame(String s, TestGraph t)
  181.     {
  182.         super(s);
  183.         tg = t;
  184.     }
  185.     
  186.     //////////////////////////////////////////////////////////////////////////
  187.  
  188.     //
  189.     // cant do anything in the constructor, no window created yet!
  190.     //
  191.     public FlickViewer startDirect(Applet theApp, String menuSet[])
  192.     {
  193.         setBackground(Color.black);
  194.         
  195.         ComponentPeer p = getPeer();
  196.         ComponentPeerX peer = (ComponentPeerX)p;
  197.         if( peer == null )
  198.         {
  199.             setTitle("Cant retrieve peer!");
  200.             return null;
  201.         }
  202.  
  203.         hwnd = peer.gethwnd();
  204.         if( menuSet == null )
  205.             setMenuBar(new MenuBarX(items, m_menuItems, theApp, "menuString"));
  206.         else
  207.             setMenuBar(new MenuBarX(items, m_menuItems, menuSet));
  208.         
  209.         lpd3drm        = new d3drm();
  210.         lpddclipper = new ddClipper();
  211.         info           = new AppInfo();
  212.         info.model     = D3DCOLOR_MONO;
  213.         sel            = new SelectionDude(lpd3drm);
  214.  
  215.         lpddclipper.SetHWnd(0, hwnd);
  216.         CreateDevice();
  217.         activateApp();
  218.         resizeViewport();
  219.         f = new FlickViewer(Thread.NORM_PRIORITY, info, sel);
  220.         return f;
  221.     }
  222.  
  223.     //////////////////////////////////////////////////////////////////////////
  224.  
  225.     MenuX GetAMenu(int m)
  226.     {
  227.         MenuBarX bar = (MenuBarX)getMenuBar();
  228.         return (MenuX)bar.getMenu(m);
  229.     }
  230.  
  231.     //////////////////////////////////////////////////////////////////////////
  232.  
  233.     int FillModeToMenuItem(int fm)
  234.     {
  235.         switch (fm) 
  236.         {
  237.             case D3DRMFILL_POINTS:
  238.                 return 2 ; //MENU_QUALITY_POINTS;
  239.  
  240.             case D3DRMFILL_WIREFRAME:
  241.                 return 3 ; // MENU_QUALITY_WIREFRAME;
  242.  
  243.             case D3DRMFILL_SOLID:
  244.                 return 4 ; // MENU_QUALITY_SOLID;
  245.         }
  246.         return -1;
  247.     }
  248.     //////////////////////////////////////////////////////////////////////////
  249.  
  250.     void SetFillMode( int fm)
  251.     {
  252.         int quality = info.dev.GetQuality();
  253.         int oldfm = (int)(quality & D3DRMFILL_MASK);
  254.  
  255.         MenuX menu = GetAMenu(2);
  256.         
  257.         if( menu.CheckMenuItem(FillModeToMenuItem(oldfm), UNCHECKED | BY_POSITION) == false)
  258.             setTitle("Couldn't find item to uncheck");
  259.             
  260.         else if (menu.CheckMenuItem(FillModeToMenuItem(fm), CHECKED | BY_POSITION) == false)
  261.             setTitle("Couldn't find item to check");
  262.  
  263.          quality = (quality & ~D3DRMFILL_MASK) | fm;
  264.         info.dev.SetQuality(quality);
  265.     }
  266.  
  267.     //////////////////////////////////////////////////////////////////////////
  268.  
  269.     void SetModel( int model)
  270.     {
  271.         int  oldModel = info.model;
  272.  
  273.         if (oldModel == model) 
  274.             return ;
  275.  
  276.         info.model = model;
  277.         RebuildDevice(info.dev.GetWidth(), info.dev.GetHeight());
  278.  
  279. //        MenuX menu = GetAMenu(2);
  280. //        menu.CheckMenuItem(9 + (int) oldModel, UNCHECKED | BY_POSITION);
  281. //        menu.CheckMenuItem(9 + (int) model, CHECKED | BY_POSITION);
  282.     }
  283.  
  284.     //////////////////////////////////////////////////////////////////////////
  285.  
  286.     void ToggleDither()
  287.     {
  288.         int dither = info.dev.GetDither();
  289.         int checked;
  290.         
  291.         dither = (dither == 0) ?1 :0;
  292.         info.dev.SetDither(dither);
  293.  
  294.         MenuX menu = GetAMenu(2);
  295.         if (dither != 0) 
  296.             checked = CHECKED;
  297.         else 
  298.             checked = UNCHECKED;
  299.  
  300.         menu.CheckMenuItem(13, checked | BY_POSITION);
  301.     }
  302.  
  303.     //////////////////////////////////////////////////////////////////////////
  304.  
  305.     void ToggleTextureFiltering()
  306.     {
  307.         int tq = info.dev.GetTextureQuality();
  308.         int checked;
  309.  
  310.         if (tq == D3DRMTEXTURE_NEAREST)
  311.             tq = D3DRMTEXTURE_LINEAR;
  312.         else
  313.             tq = D3DRMTEXTURE_NEAREST;
  314.  
  315.         info.dev.SetTextureQuality(tq);
  316.  
  317.         MenuX menu = GetAMenu(2);
  318.         if (tq == D3DRMTEXTURE_LINEAR) 
  319.             checked = CHECKED;
  320.         else 
  321.             checked = UNCHECKED;
  322.  
  323.         menu.CheckMenuItem(14, checked | BY_POSITION);
  324.     }
  325.  
  326.     //////////////////////////////////////////////////////////////////////////
  327.  
  328.     void CreateLight(int wparam)
  329.     {
  330.         d3drmMeshBuilder builder = null;
  331.         d3drmLight light = null;
  332.         d3drmFrame frame = null;
  333.  
  334.         builder = lpd3drm.CreateMeshBuilder();
  335.  
  336.         if (wparam == MENU_LIGHT_DIRECTIONAL) 
  337.         {
  338.             builder.LoadFromFileByPos(tg.getFileName("camera.x"), 0, 0, null, null);
  339.  
  340.             builder.SetQuality(D3DRMRENDER_UNLITFLAT);
  341.             
  342.             light = lpd3drm.CreateLightRGB(D3DRMLIGHT_DIRECTIONAL, 1.0F, 1.0F, 1.0F);
  343.         } 
  344.         else if (wparam == MENU_LIGHT_PARALLEL_POINT) 
  345.         {
  346.             builder.LoadFromFileByPos(tg.getFileName("sphere2.x"), 0, 0, null, null);
  347.  
  348.             builder.SetQuality(D3DRMRENDER_UNLITFLAT);
  349.             builder.Scale(0.2F, 0.2F, 0.2F);
  350.             light = lpd3drm.CreateLightRGB (D3DRMLIGHT_PARALLELPOINT, 
  351.                         1.0F, 1.0F, 1.0F);
  352.         } 
  353.         else if (wparam == MENU_LIGHT_POINT) 
  354.         {
  355.             builder.LoadFromFileByPos(tg.getFileName("sphere2.x"), 0, 0, null, null);
  356.  
  357.             builder.SetQuality(D3DRMRENDER_UNLITFLAT);
  358.  
  359.             builder.Scale( 0.2F, 0.2F, 0.2F);
  360.  
  361.             light = lpd3drm.CreateLightRGB (D3DRMLIGHT_POINT, 
  362.                                             1.0F, 1.0F, 1.0F);
  363.  
  364.         } else if (wparam == MENU_LIGHT_SPOT) 
  365.         {
  366.             builder.LoadFromFileByPos(tg.getFileName("camera.x"), 0, 0, null, null);
  367.  
  368.             builder.SetQuality(D3DRMRENDER_UNLITFLAT);
  369.  
  370.             light = lpd3drm.CreateLightRGB( D3DRMLIGHT_SPOT, 1.0F,1.0F,1.0F);
  371.         }
  372.  
  373.         frame = lpd3drm.CreateFrame(info.scene);
  374.         frame.SetPosition(info.camera,0.0F,0.0F,10.0F);
  375.         frame.AddVisualMeshBuilder(builder);
  376.         frame.AddLight(light);
  377.     }
  378.  
  379.     //////////////////////////////////////////////////////////////////////////
  380.  
  381.     void ToggleLighting()
  382.     {
  383.         int quality = info.dev.GetQuality();
  384.         int mode = (int)(quality & D3DRMLIGHT_MASK);
  385.  
  386.         if (mode == D3DRMLIGHT_ON)
  387.             mode = D3DRMLIGHT_OFF;
  388.         else
  389.             mode = D3DRMLIGHT_ON;
  390.  
  391.                 MenuX menu = GetAMenu(2);
  392.         menu.CheckMenuItem(0, (mode == D3DRMLIGHT_ON ?CHECKED :UNCHECKED) | BY_POSITION);
  393.  
  394.         quality = (quality & ~D3DRMLIGHT_MASK) | mode;
  395.         info.dev.SetQuality(quality);
  396.     }
  397.  
  398.     //////////////////////////////////////////////////////////////////////////
  399.  
  400.     void activateApp()
  401.     {
  402.         d3drmFrame sFrame = sel.SelectedFrame();
  403.         d3drmMeshBuilder sVisual = sel.SelectedVisual();
  404.         d3drmWinDevice windev = info.dev.Getd3drmWinDevice();
  405.  
  406.         windev.HandleActivate(1);
  407.     }
  408.  
  409.     //////////////////////////////////////////////////////////////////////////
  410.  
  411.     // compatibility with the Viewer.CPP demo.
  412.     float D3DDivide( float a, float b)
  413.     {
  414.         return (float)((double) (a) / (double) (b));
  415.     }
  416.  
  417.     float D3DMultiply( float a, float b)
  418.     {
  419.         return ((a) * (b));
  420.     }
  421.  
  422.     //////////////////////////////////////////////////////////////////////////
  423.  
  424.     void LoadFrameHierarchy(String filename)
  425.     {
  426.         d3drmFrame lpFrame;
  427.   
  428.         lpFrame = lpd3drm.CreateFrame(info.scene);
  429.  
  430.         lpFrame.LoadFromFileByPos(filename, 0, 0, (ILoadTextureCallback)this, null);
  431.  
  432.         ScaleScene(lpFrame);
  433.     }
  434.  
  435.     //////////////////////////////////////////////////////////////////////////
  436.  
  437.     void LoadAnimationSet(String filename)
  438.     {
  439.         d3drmAnimationSet lpAnimSet;
  440.         d3drmFrame lpFrame;
  441.  
  442.         //
  443.         // Create a new parent frame for the animation, load it, and set up 
  444.         // the callback 
  445.         //
  446.         lpFrame = lpd3drm.CreateFrame(info.scene);
  447.         lpAnimSet = lpd3drm.CreateAnimationSet();
  448.  
  449.         lpAnimSet.LoadFromFileByPos(filename, 0, 0, (ILoadTextureCallback)this, null, lpFrame);
  450.  
  451.         ScaleScene(lpFrame);
  452.  
  453.         setAnimationCallback(lpFrame, lpAnimSet);
  454.     }
  455.  
  456.     //////////////////////////////////////////////////////////////////////////
  457.  
  458.     void ScaleScene( d3drmFrame frame)
  459.     {
  460.         //
  461.         // Some trickery form the RL2 viewer to scale a scene down to
  462.          // managable proportions 
  463.         //
  464.           d3drmMeshBuilder  mbuilder;
  465.         d3drmBox box = new d3drmBox();
  466.  
  467.         float maxDim = 0.0F;
  468.  
  469.         mbuilder = lpd3drm.CreateMeshBuilder();
  470.         mbuilder.AddFrame(frame);
  471.         mbuilder.GetBox(box);
  472.  
  473.         maxDim = box.maxx - box.minx;
  474.         if (box.maxy - box.miny > maxDim) 
  475.             maxDim = box.maxy - box.miny;
  476.  
  477.         if (box.maxz - box.minz > maxDim)
  478.             maxDim = box.maxz - box.minz;
  479.  
  480.         frame.AddScale(D3DRMCOMBINE_BEFORE, D3DDivide(8.0F, maxDim),
  481.                 D3DDivide(8.0F, maxDim), D3DDivide(8.0F, maxDim));
  482.  
  483.         frame.SetPosition(info.scene, 0.0F, 0.0F, 15.0F);
  484.     }
  485.  
  486.     //////////////////////////////////////////////////////////////////////////
  487.     //
  488.     // Place an object in front of the camera.
  489.     //
  490.     void PlaceMesh( d3drmMeshBuilder mesh)
  491.     {
  492.         d3drmFrame frame;
  493.  
  494.         frame = lpd3drm.CreateFrame(info.scene);
  495.         frame.AddVisualMeshBuilder(mesh);
  496.         frame.SetPosition(info.camera, 0.0F, 0.0F, 15.0F);
  497.     }
  498.  
  499.     //////////////////////////////////////////////////////////////////////////
  500.     //
  501.     // Regenerate the device if the color model changes or the window 
  502.     // size changes.
  503.     //
  504.     private void RebuildDevice(int width, int height)
  505.     {
  506.         int old_dither = info.dev.GetDither();
  507.         int old_quality = info.dev.GetQuality();
  508.            int old_shades = info.dev.GetShades();
  509.         GuidData g;
  510.  
  511.         d3d d = new d3d();
  512.         try
  513.         {
  514.             g = new GuidData();
  515.             d.FindDeviceForColorModel(info.model, g);
  516.         }
  517.         catch( ComException ce)
  518.         {
  519.             g = FullFind(info.model, d);
  520.         }
  521.         info.dev = lpd3drm.CreateDeviceFromClipper(lpddclipper, g, width, height);
  522.  
  523.         info.dev.SetDither(old_dither);
  524.         info.dev.SetQuality(old_quality);
  525.         info.dev.SetShades(old_shades);
  526.         width     = info.dev.GetWidth();
  527.         height    = info.dev.GetHeight();
  528.         info.view = lpd3drm.CreateViewport(info.dev,info.camera,0,0,width,height);
  529.         
  530.         info.view.SetBack(400.0F);
  531.     }
  532.  
  533.     //////////////////////////////////////////////////////////////////////////
  534.  
  535.     static final int DDBD_1 = 0x00004000;
  536.     static final int DDBD_2 = 0x00002000;
  537.     static final int DDBD_4 = 0x00001000;
  538.     static final int DDBD_8 = 0x00000800;
  539.     static final int DDBD_16 = 0x00000400;
  540.     static final int DDBD_24 = 0x00000200;
  541.     static final int DDBD_32 = 0x00000100;
  542.     
  543.     int bppToddbd(int bpp)
  544.     {
  545.         switch(bpp) 
  546.         {    
  547.             case 1:        return DDBD_1;
  548.             case 2:        return DDBD_2;
  549.             case 4:        return DDBD_4;
  550.             case 8:        return DDBD_8;
  551.             case 16:    return DDBD_16;
  552.             case 24:    return DDBD_24;
  553.             case 32:    return DDBD_32;
  554.         }
  555.         return 0;
  556.     }
  557.     
  558.     //////////////////////////////////////////////////////////////////////////
  559.     
  560.     GuidData FullFind(int cm, d3d lpD3d)
  561.     {
  562.         int bpp = lpD3d.SystemBpp();
  563.         d3dFindDeviceSearch search = new d3dFindDeviceSearch();
  564.         d3dFindDeviceResult result = new d3dFindDeviceResult();
  565.  
  566.         search.dwFlags = 1; // D3DFDS_COLORMODEL;
  567.         search.dcmColorModel = (cm == D3DCOLOR_MONO) ? D3DCOLOR_MONO : D3DCOLOR_RGB;
  568.  
  569.            lpD3d.FindDevice(search, result);
  570.         /*
  571.          * If the device found is hardware but cannot support the current
  572.          * bit depth, then fall back to software rendering.
  573.          */
  574.         if ((result.HwFlags != 0) && !((result.HwdwDeviceRenderBitDepth & bppToddbd(bpp))!=0)) 
  575.         {
  576.             search.dwFlags |= 4;    //D3DFDS_HARDWARE;
  577.             search.bHardware = 0;
  578.             result = new d3dFindDeviceResult();        // clean out result
  579.             lpD3d.FindDevice(search, result);
  580.         }
  581.  
  582.         GuidData g = new GuidData();
  583.         g.data1 = result.data1;
  584.         g.data2 = result.data2;
  585.         g.data3 = result.data3;
  586.         g.data4 = result.data4;
  587.         g.data5 = result.data5;
  588.         
  589.         return g;
  590.     }
  591.     
  592.     //////////////////////////////////////////////////////////////////////////
  593.     //
  594.     // this is the only interesting thing that happens on WM_SIZE in windows
  595.     //
  596.     // HWND win, AppInfo* info, int width, int height)
  597.     //
  598.     private void resizeViewport()
  599.     {
  600.         Dimension s = size();
  601.  
  602.         int view_width = info.view.GetWidth();
  603.         int view_height = info.view.GetHeight();
  604.         int dev_width = info.dev.GetWidth();
  605.         int dev_height = info.dev.GetHeight();
  606.  
  607.         if (view_width == s.width && view_height == s.height)
  608.             return ;
  609.     
  610.         if (s.width <= dev_width && s.height <= dev_height) 
  611.         {
  612.             info.view = lpd3drm.CreateViewport(info.dev, info.camera, 0, 0, s.width, s.height);
  613.             info.view.SetBack(400.0F);
  614.         }
  615.  
  616.         RebuildDevice(s.width, s.height);
  617.         }
  618.  
  619.     //////////////////////////////////////////////////////////////////////////
  620. /*
  621.     public boolean RightMouseDown(Event e, int x, int y)
  622.     {
  623.     static HCURSOR oldCursor = NULL;
  624.     AppInfo *info;
  625.     LPDIRECT3DRMFRAME sFrame = sel.SelectedFrame();
  626.     LPDIRECT3DRMMESHBUILDER sVisual = sel.SelectedVisual();
  627.  
  628.     info = (AppInfo *) GetWindowLong(win, 0);
  629.     active_window = info;
  630.         {
  631.             HCURSOR hCur;
  632.             int x = LOWORD(lparam);
  633.             int y = HIWORD(lparam);
  634.             last_x = x;
  635.             last_y = y;
  636.             FindAndSelectVisual(info.view, x, y);
  637.             f.right_drag = TRUE;
  638.             SetCapture(win);
  639.             //
  640.             // change to a groovy cursor 
  641.             //
  642.             hCur = LoadCursor(NULL, IDC_ARROW);
  643.             if (hCur) oldCursor = SetCursor(hCur);
  644.             else oldCursor = NULL;
  645.         }
  646.         break;
  647.     }
  648. */
  649.     //////////////////////////////////////////////////////////////////////////
  650. /*
  651.     public boolean RightMouseUp(Event e, int x, int y)
  652.     {
  653.     static HCURSOR oldCursor = NULL;
  654.     AppInfo *info;
  655.     LPDIRECT3DRMFRAME sFrame = sel.SelectedFrame();
  656.     LPDIRECT3DRMMESHBUILDER sVisual = sel.SelectedVisual();
  657.  
  658.     info = (AppInfo *) GetWindowLong(win, 0);
  659.     active_window = info;
  660.         f.right_drag = FALSE;
  661.         ReleaseCapture();
  662.         if (oldCursor) SetCursor(oldCursor);
  663.         break;
  664.  
  665.     }
  666. */
  667.     //////////////////////////////////////////////////////////////////////////
  668.  
  669.     public boolean mouseDown(Event e, int x, int y)
  670.     {
  671.         d3drmFrame sFrame = sel.SelectedFrame();
  672.         d3drmMeshBuilder sVisual = sel.SelectedVisual();
  673.  
  674.         last_x = x;
  675.            last_y = y;
  676.  
  677.            sel.FindAndSelectVisual(info.view, x, y);
  678.  
  679.         if( (e.modifiers & 4) != 0 )
  680.         {
  681.             // right mouse button
  682.             f.right_drag = true;
  683.         }
  684.         else
  685.         {
  686.             // left mouse button
  687.             f.left_drag = true;
  688.         }
  689.         return true;
  690.     }
  691.  
  692.     //////////////////////////////////////////////////////////////////////////
  693.  
  694.     public boolean mouseUp(Event e, int x, int y)
  695.     {
  696.         if( (e.modifiers & 4) != 0 )
  697.         {
  698.             // right mouse button
  699.             f.right_drag = false;
  700.         }
  701.         else
  702.         {
  703.             // left mouse button
  704.             f.left_drag = false;
  705.         }
  706.         return true;
  707.     }
  708.  
  709.     //////////////////////////////////////////////////////////////////////////
  710.  
  711.     public boolean mouseDrag(Event e, int x, int y)
  712.     {
  713.         float delta_x, delta_y;
  714.         
  715.         d3drmFrame    sFrame = sel.SelectedFrame();
  716.         if( sFrame != null )
  717.         {
  718.             if( ((e.modifiers & 4) != 0) && f.right_drag )
  719.             {
  720.                 // right mouse button
  721.                 d3dvector p1 = new d3dvector();
  722.                 d3drmvector4d p2 = new d3drmvector4d();
  723.  
  724.                 d3drmMeshBuilder sVisual = sel.SelectedVisual();
  725.  
  726.                 delta_x = SIGN_EXTEND(x) - last_x;
  727.                 delta_y = SIGN_EXTEND(y) - last_y;
  728.                 last_x = SIGN_EXTEND(x);
  729.                 last_y = SIGN_EXTEND(y);
  730.                 sFrame.GetPosition(info.scene, p1);
  731.                 info.view.Transform(p2, p1);
  732.                 p2.x += D3DMultiply( (float)delta_x, p2.w);
  733.                 p2.y += D3DMultiply( (float)delta_y, p2.w);
  734.                 info.view.InverseTransform(p1, p2);
  735.                 sFrame.SetPosition(info.scene, p1.x, p1.y, p1.z);
  736.             }
  737.             else if( ((e.modifiers & 4)==0) && f.left_drag )
  738.             {
  739.                 // left mouse button
  740.                 d3drmMeshBuilder    sVisual = sel.SelectedVisual();
  741.  
  742.                 delta_x = SIGN_EXTEND(x) - last_x;
  743.                 delta_y = -SIGN_EXTEND(y) - last_y;
  744.                 last_x = SIGN_EXTEND(x);
  745.                 last_y = SIGN_EXTEND(y);
  746.  
  747.                 double radius = 50;
  748.                 double delta_r = Math.sqrt(delta_x * delta_x + delta_y * delta_y);
  749.                 double denom = Math.sqrt(radius * radius + delta_r * delta_r);
  750.  
  751.                 if (delta_r != 0 && denom != 0) 
  752.                 {
  753.                     sFrame.SetRotation(    info.camera,  D3DDivide(delta_y, (float)delta_r),
  754.                         D3DDivide(-delta_x, (float)delta_r), 0.0F, 
  755.                         D3DDivide((float)delta_r, (float)denom) );
  756.                 }
  757.             }
  758.         }
  759.         return true;
  760.     }
  761.  
  762.     //////////////////////////////////////////////////////////////////////////
  763.  
  764.     public boolean keyUp(Event e, int key)
  765.     {
  766.         d3drmFrame sFrame        = sel.SelectedFrame();
  767.         d3drmMeshBuilder sVisual = sel.SelectedVisual();
  768.  
  769.         switch (key)
  770.         {
  771.             case 't':
  772.             case 'T':
  773.             case 'r':
  774.             case 'R':
  775.             case Event.UP:
  776.             case Event.DOWN:
  777.             case Event.LEFT:
  778.             case Event.RIGHT:
  779.                 info.camera.SetVelocity(info.scene, 0.0F, 0.0F, 0.0F, 0);
  780.             break;
  781.  
  782.             case 'z':
  783.             case 'Z':
  784.             case 'x':
  785.             case 'X':
  786.                 if (sFrame != null)
  787.                     sFrame.SetVelocity(info.scene, 0.0F, 0.0F, 0.0F, 0);
  788.             break;
  789.         }
  790.         return true;
  791.     }
  792.  
  793.     //////////////////////////////////////////////////////////////////////////
  794.  
  795.     public boolean keyDown(Event e, int key)
  796.     {
  797.         d3drmFrame sFrame = sel.SelectedFrame();
  798.         d3drmMeshBuilder sVisual = sel.SelectedVisual();
  799.  
  800.         d3dvector dir   = new d3dvector();
  801.         d3dvector up    = new d3dvector();
  802.          d3dvector right = new d3dvector();
  803.  
  804.         info.camera.GetOrientation(info.scene, dir, up);
  805.         lpd3drm.d3drmVectorCrossProduct(right, up, dir);
  806.  
  807.         up.x    /= 4.0F;
  808.         up.y    /= 4.0F;
  809.         up.z    /= 4.0F;
  810.         right.x /= 4.0F;
  811.         right.y /= 4.0F;
  812.         right.z /= 4.0F;
  813.  
  814.         switch(key)
  815.         {
  816.             case 't':
  817.             case 'T':
  818.                 info.camera.SetVelocity(info.scene, dir.x, dir.y, dir.z, 0); 
  819.                 break;
  820.  
  821.             case 'y': 
  822.             case 'Y': 
  823.                 info.camera.SetVelocity(info.scene, -100.0F * dir.x,-100.0F * dir.y, -100.0F * dir.z, 0);
  824.  
  825.                 //
  826.                 // fall through
  827.  
  828.             case 'r':
  829.             case 'R':
  830.                 info.camera.SetVelocity(info.scene, -dir.x, -dir.y, -dir.z, 0);
  831.                 break;
  832.                  
  833.             case 'e':
  834.             case 'E':
  835.                 info.camera.SetVelocity(info.scene, 100.0F * dir.x, 100.0F * dir.y, 100.0F * dir.z, 0);
  836.  
  837.             case Event.UP:
  838.                 setTitle("Moving up!");
  839.                 info.camera.SetVelocity(info.scene, up.x, up.y, up.z, 0);
  840.                 break;
  841.  
  842.             case Event.DOWN:
  843.                 info.camera.SetVelocity(info.scene, -up.x, -up.y, -up.z, 0);
  844.                 break;
  845.  
  846.             case Event.RIGHT:
  847.                 info.camera.SetVelocity(info.scene, right.x, right.y, right.z, 0);
  848.                 break;
  849.  
  850.             case Event.LEFT:
  851.                 info.camera.SetVelocity(info.scene, -right.x, -right.y, -right.z, 0);
  852.                 break;
  853.  
  854.             case 'x':
  855.             case 'X':
  856.                 if (sFrame == null)
  857.                     new MessageBox(this, 0, "Please select a Frame first!");
  858.                 else
  859.                     sFrame.SetVelocity(info.scene, dir.x, dir.y, dir.z, 0);
  860.                 break;
  861.  
  862.             case 'Z':
  863.                 if (sFrame == null)
  864.                     new MessageBox(this, 0, "Please select a Frame first!");
  865.                 else
  866.                     sFrame.SetVelocity(info.scene, -dir.x, -dir.y, -dir.z, 0);
  867.                 break;
  868.  
  869.             case '-':
  870.                 if (sFrame == null)
  871.                     new MessageBox(this, 0, "Please select a Frame first!");
  872.                 else
  873.                 {   
  874.                     sVisual.Scale(0.9F, 0.9F, 0.9F);
  875.                     sel.SelectVisual(sVisual, sFrame);
  876.                 }
  877.                 break;
  878.  
  879.             case '+':
  880.                 if (sFrame == null)
  881.                     new MessageBox(this, 0, "Please select a Frame first!");
  882.                 else
  883.                 {   
  884.                     sVisual.Scale(1.1F, 1.1F, 1.1F);
  885.                     sel.SelectVisual(sVisual, sFrame);
  886.                 }
  887.                 break;
  888.         }
  889.         return true;
  890.     }
  891.  
  892.     //////////////////////////////////////////////////////////////////////////
  893.     //
  894.     // Create the device and viewport.
  895.     //
  896.     // uses global this and info
  897.     //
  898.     void CreateDevice()
  899.     {
  900.         Dimension s = size();
  901.         GuidData g = new GuidData();
  902.  
  903.         d3d d = new d3d();
  904.         d.FindDeviceForColorModel(info.model, g);
  905.  
  906.         info.dev = lpd3drm.CreateDeviceFromClipper(lpddclipper, g, s.width, s.height);
  907.  
  908.         switch (d.SystemBpp())
  909.         {
  910.             case 1:
  911.                 info.dev.SetShades(4);
  912.                 lpd3drm.SetDefaultTextureShades(4);
  913.                 break;
  914.                 
  915.             case 16:
  916.                 info.dev.SetShades(32);
  917.                 lpd3drm.SetDefaultTextureColors(64);
  918.                 lpd3drm.SetDefaultTextureShades(32);
  919.                 info.dev.SetDither(0);
  920.                 break;
  921.                 
  922.             case 24:
  923.             case 32:
  924.                 info.dev.SetShades(256);
  925.                 lpd3drm.SetDefaultTextureColors(64);
  926.                 lpd3drm.SetDefaultTextureShades(256);
  927.                 info.dev.SetDither(0);
  928.                 break;
  929.                 
  930.             default:
  931.                 info.dev.SetDither(0);
  932.         }
  933.         
  934.         CreateScene();
  935.         info.view = lpd3drm.CreateViewport(info.dev, info.camera, 0, 0, info.dev.GetWidth(),
  936.                                         info.dev.GetHeight());
  937.         info.view.SetBack(5000.0F);
  938.     }
  939.  
  940.     //////////////////////////////////////////////////////////////////////////
  941.  
  942.     public d3drmTexture callbackLoadTexture(String name, IUnknown args)
  943.     {
  944.         int ext = name.lastIndexOf(".");
  945.  
  946.         if (ext != -1) 
  947.         {
  948.             String fileExtension = name.substring(ext);
  949.             fileExtension.toLowerCase();
  950.             if( fileExtension.equals(".ppm") == false )
  951.                 return lpd3drm.LoadTexture(name);
  952.         }
  953.         
  954.         return null;
  955.     }
  956.     
  957.     //////////////////////////////////////////////////////////////////////////
  958.  
  959.     void CreateScene()
  960.     {
  961.         d3drmFrame            frame;
  962.         d3drmFrame            light;
  963.         d3drmMeshBuilder    builder;
  964.         d3drmLight            light1;
  965.         d3drmLight            light2;
  966.         d3drmMaterial        mat;
  967.  
  968.         info.scene = lpd3drm.CreateFrame(null);
  969.         light1     = lpd3drm.CreateLightRGB(D3DRMLIGHT_DIRECTIONAL, 1.0F, 1.0F, 1.0F);
  970.         light2     = lpd3drm.CreateLightRGB(D3DRMLIGHT_AMBIENT, 0.1F, 0.1F, 0.1F);
  971.         light      = lpd3drm.CreateFrame(info.scene);
  972.  
  973.         light.SetPosition(info.scene, 2.0F, 2.0F, 5.0F);
  974.         light.SetOrientation(info.scene, -1.0F, -1.0F, 1.0F, 0.0F, 1.0F, 0.0F);
  975.         light.AddLight(light1);
  976.  
  977.         info.scene.AddLight(light2);
  978.  
  979.         builder = lpd3drm.CreateMeshBuilder();
  980.         builder.LoadFromFileByPos(tg.getFileName("camera.x"), 0, 0, null, null);
  981.         builder.SetQuality(D3DRMRENDER_UNLITFLAT);
  982.         light.AddVisualMeshBuilder(builder);
  983.  
  984.         frame = lpd3drm.CreateFrame(info.scene);
  985.         frame.SetRotation(info.scene, 0.0F, 1.0F, 0.0F, -0.02F);
  986.         frame.SetPosition(info.scene, 0.0F, 0.0F, 10.0F);
  987.  
  988.         builder = lpd3drm.CreateMeshBuilder();
  989.         builder.LoadFromFileByPos(tg.getFileName("mslogo.x"), 0, 0, (ILoadTextureCallback)this, null);
  990.  
  991.         builder.SetColorRGB(0.8F, 0.8F, 0.8F);
  992.         
  993.         mat = lpd3drm.CreateMaterial(10.0F);
  994.         builder.SetMaterial(mat);
  995.         
  996.         frame.AddVisualMeshBuilder(builder);
  997.         
  998.         info.camera = lpd3drm.CreateFrame(info.scene);
  999.         info.camera.SetPosition(info.scene, 0.0F, 0.0F, 0.0F);
  1000.     }
  1001.  
  1002.     //////////////////////////////////////////////////////////////////////////
  1003.  
  1004.     public void Paint(Graphics g)
  1005.     {
  1006.         if( f != null )
  1007.         {
  1008.             d3drmFrame sFrame = sel.SelectedFrame();
  1009.             d3drmMeshBuilder sVisual = sel.SelectedVisual();
  1010.  
  1011.             if (info != null)
  1012.             {   
  1013.                 d3drmWinDevice windev = info.dev.Getd3drmWinDevice();
  1014.  
  1015.                 windev.HandlePaint(((GraphicsX)g).gethdc()); 
  1016.             }
  1017.         }    
  1018.         else
  1019.             g.drawString("Not set up yet", 10, 10);
  1020.     }
  1021.  
  1022.     //////////////////////////////////////////////////////////////////////////
  1023.  
  1024.     public boolean action(Event e, Object o)
  1025.     {
  1026.         if( o instanceof String )
  1027.         {
  1028.             d3drmFrame sFrame = sel.SelectedFrame();
  1029.             d3drmMeshBuilder sVisual = sel.SelectedVisual();
  1030.             String file;
  1031.  
  1032.             int key = ((MenuBarX)getMenuBar()).getItemID((String)o);
  1033.             if( key != -1 )
  1034.             {
  1035.                 switch(key)
  1036.                 {
  1037.                     
  1038.                     case MENU_LIGHT_DIRECTIONAL:
  1039.                     case MENU_LIGHT_PARALLEL_POINT:
  1040.                     case MENU_LIGHT_POINT:
  1041.                     case MENU_LIGHT_SPOT:
  1042.                         CreateLight(key);
  1043.                         break;
  1044.                     
  1045.                     case MENU_FILE_EXIT :
  1046.                         dispose();
  1047.                         break;
  1048.  
  1049.                     case MENU_FILE_ABOUT:
  1050.                         new MessageBox(this, 0, "Viewer - by David Silver");
  1051.                         break;
  1052.  
  1053.                     case MENU_FILE_OPEN:
  1054.                         d3drmMeshBuilder builder;
  1055.                          file = OpenNewFile("Open a Mesh file");
  1056.                          if (file != null)
  1057.                            {
  1058.                              builder = lpd3drm.CreateMeshBuilder();
  1059.                              builder.LoadFromFileByPos(file, 0, 0, (ILoadTextureCallback)this, null);
  1060.                              PlaceMesh(builder);
  1061.                         }
  1062.                          break;
  1063.  
  1064.                     case MENU_FILE_OPEN_ANIMSET:
  1065.                         file = OpenNewFile("Open Animation ...");
  1066.                         if (file != null) 
  1067.                               LoadAnimationSet(file);
  1068.                         break;
  1069.  
  1070.                     case MENU_FILE_OPEN_FRAME:
  1071.                           file = OpenNewFile("Open Frame ...");
  1072.                           if (file != null) 
  1073.                             LoadFrameHierarchy(file);
  1074.                           break;
  1075.  
  1076.                     case MENU_EDIT_CUT:
  1077.                         sel.CutVisual();
  1078.                         break;
  1079.  
  1080.                     case MENU_EDIT_COPY:
  1081.                         sel.CopyVisual();
  1082.                         break;
  1083.  
  1084.                     case MENU_EDIT_PASTE:
  1085.                         sel.PasteVisual(info.scene);
  1086.                         break;
  1087.  
  1088.                     case MENU_EDIT_DELETE:
  1089.                         sel.DeleteVisual();
  1090.                         break;
  1091.  
  1092.                     case MENU_EDIT_COLOR:
  1093.                         if (sFrame == null)
  1094.                             break;
  1095.  
  1096.                         // note, we just reset the same colour here, there is no ChooseColor
  1097.                         // yet in Java.
  1098.                            d3drmMeshBuilder mesh = sVisual.Getd3drmMeshBuilder();
  1099.  
  1100.                            if (sel.SelectedLight() != null)
  1101.                            {
  1102.                                int c = sel.SelectedLight().GetColor();
  1103.                                   mesh.SetColor(c);
  1104.                                   sel.SelectedLight().SetColor(c);
  1105.                            } 
  1106.                         else 
  1107.                         {
  1108.                                int c;
  1109.  
  1110.                             if (mesh.GetFaceCount() != 0) 
  1111.                             {
  1112.                                 d3drmFaceArray faces;
  1113.                                 d3drmFace face;
  1114.     
  1115.                                 faces = mesh.GetFaces();
  1116.                                 face = faces.GetElement(0);
  1117.                                 c =     face.GetColor();
  1118.                             } 
  1119.                             else
  1120.                                 c = lpd3drm.d3drmCreateColorRGB(0.0F, 0.0F, 0.0F);
  1121.                                mesh.SetColor(c);
  1122.                         }
  1123.                            break;
  1124.  
  1125.                        case MENU_EDIT_BOXES:
  1126.                            dealWithBoxes();
  1127.                            break;
  1128.  
  1129.                     case MENU_QUALITY_LIGHTING:
  1130.                         ToggleLighting();
  1131.                         break;
  1132.  
  1133.                     case MENU_QUALITY_POINTS:
  1134.                         SetFillMode(D3DRMFILL_POINTS);
  1135.                         break;
  1136.  
  1137.                     case MENU_QUALITY_WIREFRAME:
  1138.                         SetFillMode(D3DRMFILL_WIREFRAME);
  1139.                         break;
  1140.  
  1141.                     case MENU_QUALITY_SOLID:
  1142.                         SetFillMode(D3DRMFILL_SOLID);
  1143.                         break;
  1144.  
  1145.                     case MENU_QUALITY_FLAT:
  1146.                         SetShadeMode(D3DRMSHADE_FLAT);
  1147.                         break;
  1148.  
  1149.                     case MENU_QUALITY_GOURAUD:
  1150.                         SetShadeMode(D3DRMSHADE_GOURAUD);
  1151.                         break;
  1152.  
  1153.                     case MENU_QUALITY_PHONG:
  1154.                         SetShadeMode(D3DRMSHADE_PHONG);
  1155.                         break;
  1156.  
  1157.                     case MENU_MODEL_MONO:
  1158.                         SetModel(D3DCOLOR_MONO);
  1159.                         break;
  1160.  
  1161.                     case MENU_MODEL_RGB:
  1162.                         SetModel(D3DCOLOR_RGB);
  1163.                         break;
  1164.  
  1165.                     case MENU_DITHER:
  1166.                         ToggleDither();
  1167.                         break;
  1168.  
  1169.                     case MENU_TEXTURE_FILTERING:
  1170.                         ToggleTextureFiltering();
  1171.                         break;
  1172.                 }
  1173.             invalidate();
  1174.             }
  1175.         }
  1176.         return false;
  1177.     }
  1178.  
  1179.     //////////////////////////////////////////////////////////////////////////
  1180.     // needed to allow window close
  1181.     
  1182.     public boolean handleEvent(Event e)
  1183.     {
  1184.         if (e.id == Event.WINDOW_DESTROY)
  1185.         {
  1186.             // exit the program
  1187.             // System.exit(0);
  1188.             dispose();
  1189.             return true;
  1190.         }
  1191.        
  1192.         // it's good form to let the super class look at any 
  1193.         // unhandled events
  1194.         return super.handleEvent(e);
  1195.     }
  1196.     
  1197.     //////////////////////////////////////////////////////////////////////////
  1198.  
  1199.     int SIGN_EXTEND(int w)
  1200.     {
  1201.         return ((((int)(w)) << 16) >> 16);
  1202.     }
  1203.  
  1204. }
  1205.  
  1206. //////////////////////////////////////////////////////////////////////////
  1207. //////////////////////////////////////////////////////////////////////////
  1208. //////////////////////////////////////////////////////////////////////////
  1209.  
  1210. class FileName implements FilenameFilter 
  1211. {
  1212.     public String path;
  1213.     public String fileName;
  1214.     
  1215.     FileName(String p, String n) 
  1216.     {
  1217.         path = p;
  1218.         fileName = n;
  1219.     }
  1220.  
  1221.     public boolean accept(File dir, String name) 
  1222.     {
  1223.         if(path.equals(dir.getPath()) && name.equals(fileName)) 
  1224.         {
  1225.             return true;
  1226.         }
  1227.         return false;
  1228.     }
  1229. }
  1230.