/*+-------------+-------------------------------------------------------------*\
 *|  |  |_|_|_|_|     Fraunhofer-Institut fuer Graphische Datenverarbeitung   *
 *|__|__|_|_|_|_|         (Fraunhofer Institute for Computer Graphics)        *
 *|  |  |_|_|_|_|                                                             *
 *|__|__|_|_|_|_|                                                             *
 *|  __ |    ___|     Fraunhofer-IGD                                          *
 *| /_  /_  / _ |     Rundeturmstr. 6                                         *
 *|/   / / /__/ |     64283 Darmstadt, Germany                                *
 *+-------------+-------------------------------------------------------------*
 *    		                                                              *
 * Project PROGIS                                                     *
 * File    SmfLoader.java    				              *
 *                                                                            *
 * Copyright © 2000 Fraunhofer IGD                                            *
 * ALL Rights Reserved.                                                       *
 *                                                                            *
 *+---------------------------------------------------------------------------*
 *                                                                             
 *       Author: Volker Coors                                                   
 *       $Locker:  $    
 *       $Revision: 1.3 $     
 *       $Log: Gis3d.java,v $
 *                               
 *----------------------------------------------------------------------------*/


import java.io.*;
import java.lang.*;
import java.util.Vector;
import java.lang.Math;

import javax.vecmath.Point3d;



/**
 * load TRI files
 * the TRXI file format .
 * 
 * @author Volker Coors
 */


public class NewTriLoader {

  /**
   * initialize Tri-loader
   */
  public NewTriLoader() {
    
  }
  
  public Point3d[] getVertices() {
    Point3d[] vertices = new Point3d[coord.length/3];
    for (int i=0; i<vertices.length; i++) {
        vertices[i] = new Point3d(coord[3*i], coord[3*i+1], coord[3*i+2]);
    }
    return vertices; 
  }
  
  public int[] getConnectivity() {
    return connect;
  }
  /**
   * parses SMF file
   * each SMF contains only one feature. 
   * The feature's geometry will be a triangle mesh 
   * with color per vertex.
   * (currently, colors are not parsed)
   * 
   * @return true if file was parsed successfully, otherwise false.
   */
  
  

  public boolean parse() {
    int token;


    int vno;
    int tno;

    try{
        //
        // file format: number vertices 
        // vertices
        // number triangles
        // t0 t1 t2
        //
        token=m_tokenizer.nextToken();  
        //
        if (token == StreamTokenizer.TT_NUMBER) {
            vno=(int)m_tokenizer.nval;
        }
        else {
            System.out.println("ERROR: number of vertices expected.");
            return false;
        }
        //while(token != StreamTokenizer.TT_EOF) {
        coord = new double[ 3*vno ]; 
        for (int j=0; j<vno; j++) {
            // read coordinates
            for (int i=3*j; i<3*j+3; i++) { //invert for cow
	    //for (int i=3*j+2; i>3*j-1; i--) {
                if (parseDouble()) {
                    coord[i]=getDouble();
                }
                else {
                    return false;
                }
		//System.out.println("coord["+i+"]: "+coord[i]);
            }
        }
        token=m_tokenizer.nextToken();  
        //
        if (token == StreamTokenizer.TT_NUMBER) {
            tno=(int)m_tokenizer.nval;
        }
        else {
            System.out.println("ERROR: number of triangles expected.");
            return false;
        }
        connect = new int[3*tno];
        for (int j=0; j<tno; j++) {
            // read coordindex
            //for (int i=3*j; i<3*j+3; i++) {
                token=m_tokenizer.nextToken(); 
                if (token != StreamTokenizer.TT_NUMBER) {
                    System.err.println ("Parse Vertex coordinate: number " + 
					"expected ! "+token);
                    return false;
                }
                connect[3*j+2]=(int)m_tokenizer.nval;
                token=m_tokenizer.nextToken(); 
                if (token != StreamTokenizer.TT_NUMBER) {
                    System.err.println ("Parse Vertex coordinate: number expected ! "+token);
                    return false;
                }
                connect[3*j+1]=(int)m_tokenizer.nval;
                token=m_tokenizer.nextToken(); 
                if (token != StreamTokenizer.TT_NUMBER) {
                    System.err.println ("Parse Vertex coordinate: number expected ! "+token);
                    return false;
                }
                connect[3*j]=(int)m_tokenizer.nval;
            //}
        }

    }

    catch (FileNotFoundException e) { 
      
          System.err.println(e);
    }
    catch (IOException e) {
        System.err.println ("IOException. " +e);
    }
    
    return true;
    
 }
 public void setFile (String in) {
    try {
        FileReader source = new FileReader (in);    
        m_tokenizer = new StreamTokenizer (source);
        m_tokenizer.eolIsSignificant(false);
        m_tokenizer.whitespaceChars(0, 35);          
        m_tokenizer.commentChar('#');
        m_tokenizer.ordinaryChar('{'); 
        m_tokenizer.ordinaryChar('}'); 
        m_tokenizer.parseNumbers();
    }
    catch (FileNotFoundException e) {  
          System.err.println(e);
    }
  }

 protected boolean parseDouble() {
    int token;
    try {
        token=m_tokenizer.nextToken(); 
        if (token != StreamTokenizer.TT_NUMBER) {
            System.err.println ("ParseCoord: number expected ! "+token);
            return false;
        }
        // aus irgendeinem Grunde hat der Parser probleme mit 7.23e+004
        nval = (double) m_tokenizer.nval;
        // e-05 is one token !?
        if (m_tokenizer.nextToken() == StreamTokenizer.TT_WORD && 
	    m_tokenizer.sval.toLowerCase().startsWith("e")) {
            
            String exp = m_tokenizer.sval;
            if (exp.substring(1, 2).equals("+")) {
                nval *= Math.pow(10.0, Double.valueOf(exp.substring(2)).doubleValue());
            }
            else if (exp.substring(1, 2).equals("-")) {
                nval /= Math.pow(10.0, Double.valueOf(exp.substring(2)).doubleValue());
            }
            /*
            if (m_tokenizer.nextToken() == '+') {
                m_tokenizer.nextToken(); // Exponent
                nval *= Math.pow (10.0, (double) m_tokenizer.nval);
            }
            else if (m_tokenizer.nextToken() == '-') {
                m_tokenizer.nextToken(); // Exponent
                nval /= Math.pow (10.0, (double) m_tokenizer.nval);
            }
            else {
                m_tokenizer.pushBack();
            }
            */
        }
        else {
            m_tokenizer.pushBack();
        }
        
    }
    
    catch (IOException e) { 
      System.err.println(e);
    }  
    return true;
  }
  
  protected double getDouble() {
    return nval;
  }
  

  
  protected StreamTokenizer m_tokenizer;
  protected double nval;
  double[] coord = null;
  int[] connect = null;

}
