Examples of TriangleNormalGenerator


Examples of org.mt4j.util.TriangleNormalGenerator

    long timeA = System.currentTimeMillis();
    this.pa = pa;
   
    ArrayList<MTTriangleMesh> returnMeshList = new ArrayList<MTTriangleMesh>();
   
    TriangleNormalGenerator normalGenerator = new TriangleNormalGenerator();
//    normalGenerator.setDebug(debug);
   
    HashMap<Integer, Group> materialIdToGroup = new HashMap<Integer, Group>();
   
    //TODO implement
    if (textureCache != null)
      textureCache.clear();
    textureCache = new WeakHashMap<String, PImage>();
   
    Scene3ds scene = null;
   
    try{
      TextDecode3ds decode = new TextDecode3ds();
//      int level = Scene3ds.DECODE_USED_PARAMS_AND_CHUNKS; //Scene3ds.DECODE_ALL; DECODE_USED_PARAMS, DECODE_USED_PARAMS_AND_CHUNKS
      int level = Scene3ds.DECODE_ALL;

      //LOAD all meshes from file into scene object
      File file = new File(pathToModel);
      if (file.exists()){
        scene = new Scene3ds(file, decode, level );
      }else{
        InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(pathToModel);
        if (in == null){
          in = pa.getClass().getResourceAsStream(pathToModel);
        }
        if (in != null){
          scene = new Scene3ds(in, decode, level );
        }else{
          throw new FileNotFoundException("File not found: " + file.getAbsolutePath());
        }
      }
       
     
      if (debug)
        logger.debug("\n-> Loading model: " + file.getName() + " <-");
     

      if (debug){
        //Go through all MATERIALS
        logger.debug("\nNum Scene Materials: " + scene.materials() );
        for( int m=0; m < scene.materials(); m++ ){
          Material3ds mat = scene.material( m );
          logger.debug("  Material " + m + ": \" " + mat.name() + "\"");
        }
        logger.debug("");
      }


      ///////// Go through all MESHES //////////////////////////
      for( int i=0; i<scene.meshes(); i++ ) {
        Mesh3ds m = scene.mesh( i );
       
        if (debug){
          int texMapType = m.texMapType();
          logger.debug("Texture coordinates provided: " + m.texCoords());
          logger.debug("Texture mapping type: " + texMapType);
          logger.debug("Mesh:" + m.name() + " Pivot:" + m.pivot());
        }
       
        /*
        XYZTrack3ds pos     = m.positionTrack();
        RotationTrack3ds rot   = m.rotationTrack();
        XYZTrack3ds sc       = m.scaleTrack();
        //FIXME .track and key(i) werden nicht zur verf�gung gestellt?!? aber in javadoc
        */
       
        if (debug){
          logger.debug("->Processing mesh: "   + i + " of " + scene.meshes() + " Name: \"" + m.name() + "\"");
          logger.debug("  Num Faces: "       + m.faces());
          logger.debug("  Num Vertices: "     + m.vertices());
          logger.debug("  Num TextureCoordinates: " + m.texCoords());
          logger.debug("");
        }
       
        //Create the arrays needed for the cruncher
        Vertex[] vertices     = new Vertex[m.vertices()];
        int[] indices       = new int[m.faces()*3];
       
        int[] texCoordIndices   = new int[m.faces()*3];
        float[][] textureCoords = new float[m.texCoords()][2];
       
        //Fill Vertices array
        for (int j = 0; j < m.vertices(); j++) {
          Vertex3ds vert = m.vertex(j);
         
          if (this.flipY){
            vertices[j] = new Vertex(vert.X, -vert.Y, vert.Z, -1,-1);
          }else{
            vertices[j] = new Vertex(vert.X, vert.Y, vert.Z, -1,-1);
          }
         
          if (m.texCoords()> j)
            textureCoords[j] = new float[]{m.texCoord(j).U, m.texCoord(j).V };
        }
       
        //Fill texcoords array
        for (int j = 0; j < m.texCoords(); j++) {
          TexCoord3ds tex =  m.texCoord(j);
         
          float[] texCoord = new float[2];
          texCoord[0] = tex.U;
          texCoord[1] = tex.V;
         
          textureCoords[j] = texCoord;
        }
       
        //TODO so werden gleiche materials in verschiedenen meshes nicht zu einem mesh gemacht!
        //also m�sste also ohne clear machen und daf�r vertices + texcoords in einen grossen
        //array, daf�r m�ssten indices aber per offset angepasst werden dass die wieder stimmen!
        materialIdToGroup.clear();
       
        if (m.faceMats() > 0){
          //List face Materials  //TODO USE LOGGERS!!
          logger.debug("  Num Face-Materials: " + m.faceMats() );
          for( int n = 0; n < m.faceMats(); n++ ){
            FaceMat3ds fmat = m.faceMat( n );
            logger.debug("    FaceMat ID: "     + fmat.matIndex() );
            logger.debug("    FaceMat indices: "   + fmat.faceIndexes());
           
            int[] faceIndicesForMaterial = fmat.faceIndex();
            if (faceIndicesForMaterial.length <= 0){
              continue;
            }

            //Check if there already is a group with the same material
            Group group = materialIdToGroup.get(fmat.matIndex());

            //If not, create a new group and save it in map
            if (group == null){
              group = new Group(new Integer(fmat.matIndex()).toString());
              materialIdToGroup.put(fmat.matIndex(), group);
            }

            //Go through all pointers to the faces for this material
            //and get the corresponding face
            for (int j = 0; j < faceIndicesForMaterial.length; j++) {
              int k = faceIndicesForMaterial[j];
              Face3ds face = m.face(k);

              AFace aFace = new AFace();
              aFace.p0 = face.P0;
              aFace.p1 = face.P1;
              aFace.p2 = face.P2;

              aFace.t0 = face.P0;
              aFace.t1 = face.P1;
              aFace.t2 = face.P2;

              group.addFace(aFace);
            }
          }

          Iterator<Integer> it = materialIdToGroup.keySet().iterator();
          logger.debug("Mesh: " + m.name() + " Anzahl Groups:" + materialIdToGroup.keySet().size());
          while (it.hasNext()) {
            int currentGroupName =  it.next();
            Group currentGroup = materialIdToGroup.get(currentGroupName);
            logger.debug("Current group: " + currentGroupName);

            currentGroup.compileItsOwnLists(vertices, textureCoords);

            //Get the new arrays
            Vertex[] newVertices     = currentGroup.getGroupVertices();
            int[] newIndices       = currentGroup.getIndexArray();
            float[][] newTextureCoords  = currentGroup.getGroupTexCoords();
            int[] newTexIndices     = currentGroup.getTexCoordIndices();

            logger.debug("\nGroup: \"" + currentGroup.name + "\" ->Vertices: " + currentGroup.verticesForGroup.size()+ " ->TextureCoords: " + currentGroup.texCoordsForGroup.size() + " ->Indices: " + currentGroup.indexArray.length + " ->Texcoord Indices: " + currentGroup.texCoordIndexArray.length );
            logger.debug("");

            if (vertices.length > 2){
              GeometryInfo geometry  = null;
              //Load as all vertex normals smoothed if creaseAngle == 180;
              if (creaseAngle == 180){
                geometry = normalGenerator.generateSmoothNormals(pa, newVertices , newIndices, newTextureCoords, newTexIndices, creaseAngle, flipTextureY, flipTextureX);
              }else{
                geometry = normalGenerator.generateCreaseAngleNormals(pa, newVertices, newIndices, newTextureCoords, newTexIndices, creaseAngle, flipTextureY, flipTextureX);
              }

              MTTriangleMesh mesh = new MTTriangleMesh(pa, geometry);

              if (mesh != null){
                mesh.setName(m.name() + " material: " + new Integer(currentGroupName).toString());
                //Assign texture
                this.assignMaterial(pathToModel, file, scene, m, currentGroupName, mesh);

                if (mesh.getTexture() != null){
                  mesh.setTextureEnabled(true);
                }else{
                  logger.debug("No texture could be assigned to mesh.");
                }
                returnMeshList.add(mesh);
              }
            }
          }
        }else{
          //If there are no materials for this mesh dont split mesh into
          //groups by material
          //Fill indices array and texcoords array (Here: vertex index = texcoord index)
          for( int faceIndex = 0; faceIndex < m.faces(); faceIndex++ ){
            Face3ds f = m.face( faceIndex );

            indices[faceIndex*3]   = f.P0;
            indices[faceIndex*3+1]   = f.P1;
            indices[faceIndex*3+2]   = f.P2;

            texCoordIndices[faceIndex*3]   = f.P0;
            texCoordIndices[faceIndex*3+1]   = f.P1;
            texCoordIndices[faceIndex*3+2]   = f.P2;
          }//for faces

          //Create the Mesh and set a texture
          if (vertices.length > 2){
            //Create normals for the mesh and duplicate vertices for faces that share the same
            //Vertex, but with different texture coordinates or different normals
            GeometryInfo geometry = null;
            //Generate normals and denormalize vertices with more than 1 texture coordinate
            if (creaseAngle == 180){
              geometry = normalGenerator.generateSmoothNormals(pa, vertices, indices, textureCoords, texCoordIndices, creaseAngle, flipTextureY, flipTextureX);
            }else{
              geometry = normalGenerator.generateCreaseAngleNormals(pa, vertices, indices, textureCoords, texCoordIndices, creaseAngle, flipTextureY, flipTextureX);
            }
            MTTriangleMesh mesh = new MTTriangleMesh(pa, geometry);
            mesh.setName(m.name());
//            this.assignMaterial(file, scene, m, sceneMaterialID, mesh);
            returnMeshList.add(mesh);
View Full Code Here

Examples of org.mt4j.util.TriangleNormalGenerator

   * @return
   */
  private MTTriangleMesh[] createMeshesFromGroups(float creaseAngle, boolean flipTextureY, boolean flipTextureX){
    ArrayList<MTTriangleMesh> meshList = new ArrayList<MTTriangleMesh>();

    TriangleNormalGenerator normalGenerator = new TriangleNormalGenerator();
    normalGenerator.setDebug(this.debugNormalGenerator);

    //Go through all groups and create the meshes
    int totalNumVerts = 0;
    Iterator e = groupNameToGroupObj.keySet().iterator();
    while (e.hasNext()) {
      String currentGroupName = (String) e.next();
      Group currentGroup = groupNameToGroupObj.get(currentGroupName);

      //Compile vertices/indices/texture arrays just for this group as a teilmenge from all with recalculated indices
      currentGroup.compileItsOwnLists(coordList, texList);

      //Get the new arrays
      Vertex[] vertices     = currentGroup.getGroupVertices(); //currentGroup.verticesForGroup.toArray(new Vertex[currentGroup.verticesForGroup.size()]);
      int[] indices       = currentGroup.getIndexArray(); //currentGroup.indexArray;
      float[][] textureCoords = currentGroup.getGroupTexCoords(); //currentGroup.texCoordsForGroup.toArray(new float[currentGroup.texCoordsForGroup.size()][]);
      int[] texIndices     = currentGroup.getTexCoordIndices(); //currentGroup.texCoordIndexArray;

      System.out.println("\nGroup: \"" + currentGroup.name + "\" ->Vertices: " + currentGroup.verticesForGroup.size()+ " ->TextureCoords: " + currentGroup.texCoordsForGroup.size() + " ->Indices: " + currentGroup.indexArray.length + " ->Texcoord Indices: " + currentGroup.texCoordIndexArray.length );
      System.out.println();

      if (vertices.length > 2){
        GeometryInfo geometry  = null;

        //Load as all vertex normals smoothed if creaseAngle == 180;
        if (creaseAngle == 180){
          geometry = normalGenerator.generateSmoothNormals(pa, vertices , indices, textureCoords, texIndices, creaseAngle, flipTextureY, flipTextureX);
        }else{
          geometry = normalGenerator.generateCreaseAngleNormals(pa, vertices, indices, textureCoords, texIndices, creaseAngle, flipTextureY, flipTextureX);
        }

        MTTriangleMesh mesh = new MTTriangleMesh(pa, geometry);

        if (mesh != null){
View Full Code Here

Examples of org.mt4j.util.TriangleNormalGenerator

              ,0 ,4 ,5
              ,0 ,5 ,1
          })
    );
    //Set crease angle 89 normals
    this.getGeometryInfo().setNormals(new TriangleNormalGenerator().generateTriangleNormals(pApplet, this.getGeometryInfo(), 89).getNormals(), true, false);
    this.setName("unnamed mt cube");
    this.setBoundsBehaviour(AbstractShape.BOUNDS_ONLY_CHECK);
  }
View Full Code Here
TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.