///////////////////////////////////////////////////////////////////////////////
// Copyright (c) 1995-1996 Virtual Design All Rights Reserved.
//
// Permission to use,  copy,  modify,  and  distribute  this  software and its
// documentation for NON-COMMERCIAL purposes and without fee is hereby granted.
//
// VIRTUAL DESIGN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY
// OF THE SOFTWARE, EITHER EXPRESS  OR  IMPLIED,  INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
// OR NON-INFRINGEMENT. VIRTUAL DESIGN SHALL  NOT  BE LIABLE FOR ANY DAMAGES
// SUFFERED BY  LICENSEE AS A RESULT OF USING,  MODIFYING OR DISTRIBUTING THIS
// SOFTWARE OR ITS DERIVATIVES.
//
// THIS SOFTWARE  IS   NOT  DESIGNED  OR  INTENDED FOR USE OR RESALE AS ONLINE
// OR NOT ONLINE CONTROL  EQUIPMENT IN HAZARDOUS  ENVIRONMENTS REQUIRING  FAIL-
// SAFE PERFORMANCE,  SUCH  AS  IN   THE   OPERATION   OF  NUCLEAR  FACILITIES,
// AIRCRAFT   NAVIGATION  OR  COMMUNICATION  SYSTEMS,  AIR   TRAFFIC   CONTROL,
// DIRECT LIFE  SUPPORT  MACHINES, OR WEAPONS SYSTEMS, IN  WHICH  THE  FAILURE
// OF  THE SOFTWARE COULD  LEAD DIRECTLY  TO DEATH, PERSONAL INJURY, OR SEVERE
// PHYSICAL OR ENVIRONMENTAL  DAMAGE ("HIGH RISK ACTIVITIES").  VIRTUAL DESIGN
// SPECIFICALLY DISCLAIMS  ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR HIGH
// RISK ACTIVITIES.
///////////////////////////////////////////////////////////////////////////////

/**
 * Classe des maillages 3D.
 * @author Guillaume Pelletier.
 * @version 1.0
 */

 /**
  * La classe des arcs droits.
  */
class ArcD
 {
 int m_sini, m_sfin ;

 public ArcD()
   {
   this(0,0);
   }

 public ArcD(int p_sini, int p_sfin )
   {
   m_sini = p_sini ; m_sfin = p_sfin ;
   }
 }

 /**
  * La classe de base des face.
  */
class Face
  {
  public int [ ] m_data ;

  public int count(){ return m_data.length ; }

  public int AIni() { return (m_data.length == 0)? m_data[0]:-1; }
  public int AFin() { return (m_data.length == 0)? m_data[count()-1]:-1;}
  }

 /**
  * La classe des facettes triangulaires.
  */
class FaceT extends Face
  {
  public FaceT() { m_data = new int[3] ; }
  public FaceT( int p_a, int p_b, int p_c )
    {
    this() ;
    m_data[0] = p_a ; m_data[1] = p_b ; m_data[2] = p_c ;
    }
  }

 /**
  * La classe des facettes carrées.
  */
class FaceC extends Face
  {
  public FaceC() { m_data = new int[4] ; }
  public FaceC( int p_a, int p_b, int p_c , int p_d )
    {
    this() ;
    m_data[0] = p_a ; m_data[1] = p_b ;
    m_data[2] = p_c ; m_data[3] = p_d ;
    }
  }

  /**
   * La classe des maillages en coordonnées homogènes, arcs droits et facettes
   * carrées.
   */

class Maillage3DH
  {
  public Sommet3DH [] m_sommets  ;
  public Sommet3DH [] m_normales ;
  public ArcD      [] m_arcs     ;
  public Face      [] m_faces    ;

  public Maillage3DH() {}
  public Maillage3DH( int p_s, int p_a, int p_f ){ init(p_s,p_a,p_f) ; }

  public void init( int p_s, int p_a, int p_f ) throws OutOfMemoryError
    {
    try
     {
     if ( p_s != 0 ) m_sommets = new Sommet3DH[p_s] ;
     if ( p_a != 0 ) m_arcs = new ArcD[p_a] ;
     if ( p_f != 0 )
        {
        m_faces = new Face[p_f] ;
        m_normales = new Sommet3DH[p_f] ;
        }
     }
    catch ( OutOfMemoryError l_e )
     {
     throw l_e ;
     }
    }
  }
