/** * コンストラクタ ここでファイルからデータを読み込んでいる * * @param in_gl OpenGLコマンド群をカプセル化したクラス * @param in_texPool テクスチャ管理クラス * @param i_provider ファイルデータプロバイダ * @param mqoFile 読み込みファイル * @param scale モデルの倍率 * @param isUseVBO 頂点配列バッファを使用するかどうか */ protected KGLMetaseq( GL10 gl, KGLTextures in_texPool, AssetManager am, String msqname, float scale) { super(in_texPool, am, scale); // targetMQO = in_moq; material mats[] = null; InputStream fis = null; // InputStreamReader isr = null ; // BufferedReader br = null; multiInput br = null; String chankName[] = null; GLObject glo = null; ArrayList<GLObject> globjs = new ArrayList<GLObject>(); try { fis = am.open(msqname); // isr = new InputStreamReader(fis) ; // br = new BufferedReader(isr); br = new multiInput(fis); while ((chankName = Chank(br, false)) != null) { /* * for( int i = 0 ; i < chankName.length ; i++ ) { * System.out.print(chankName[i]+" ") ; } System.out.println() ; */ if (chankName[0].trim().toUpperCase().equals("MATERIAL")) { try { mats = new material[Integer.parseInt(chankName[1])]; for (int m = 0; m < mats.length; m++) { mats[m] = new material(); mats[m].set(br.readLine().trim()); // Log.i("KGLMetaseq", "Material(" + m+") :" + mats[m].toString()); } } catch (Exception mat_e) { Log.e("KGLMetaseq", "MQOファイル Materialチャンク読み込み例外発生 " + mat_e.getMessage()); throw new KGLException(mat_e); } } try { if (chankName[0].trim().toUpperCase().equals("OBJECT")) { objects object = new objects(); object.set(chankName[1], br, scale); // System.out.println(object.toString()) ; if (object.face == null) { continue; // 面情報のないオブジェクトは飛ばす } glo = makeObjs(gl, mats, object); if (glo != null) { globjs.add(glo); } } } catch (Exception obj_e) { Log.e( "KGLMetaseq", "MQOファイル Object[" + chankName[1] + "]チャンク読み込み例外発生 " + obj_e.toString()); throw new KGLException(obj_e); } } br.close(); // 読み込み終了 br = null; glObj = globjs.toArray(new GLObject[0]); } catch (Exception e) { e.printStackTrace(); } finally { try { if (br != null) br.close(); } catch (IOException e) { e.printStackTrace(); } } }
/** * faceチャンクの読み込み * * @param br 読み込みストリーム * @return 面配列 * @throws Exception */ private Face[] readFace(multiInput br) throws Exception { ArrayList<Face> qf; String line = null; String[] s; Integer Mn; Face[] wface = null; int p; int pe; qf = new ArrayList<Face>(); try { while ((line = br.readLine()) != null) { if (line.length() <= 0) continue; line = line.trim(); if (line.equals("}")) break; wface = null; Mn = null; p = line.indexOf("M("); if (p != -1) { pe = line.indexOf(")", p); Mn = Integer.parseInt(line.substring(p + 2, pe)); } p = line.indexOf("V("); if (p == -1) continue; pe = line.indexOf(")", p); s = line.substring(p + 2, pe).split(" "); if (s.length == 3) { wface = new Face[1]; wface[0] = new Face(); wface[0].V = new Integer[3]; wface[0].V[0] = Integer.parseInt(s[0]); wface[0].V[1] = Integer.parseInt(s[1]); wface[0].V[2] = Integer.parseInt(s[2]); wface[0].M = Mn; p = line.indexOf("UV("); if (p != -1) { pe = line.indexOf(")", p); s = line.substring(p + 3, pe).split(" "); if (s.length != 2 * 3) throw new Exception("UVの数が不正"); wface[0].UV = new Float[2 * 3]; for (int i = 0; i < s.length; i++) { wface[0].UV[i] = Float.parseFloat(s[i]); } } p = line.indexOf("COL("); if (p != -1) { pe = line.indexOf(")", p); s = line.substring(p + 4, pe).split(" "); if (s.length != 3) throw new Exception("COLの数が不正"); wface[0].COL = new Float[4 * 3]; long wl; float wf; for (int i = 0; i < s.length; i++) { wl = Long.parseLong(s[i]); wf = (wl >>> 0) & 0x000000ff; wface[0].COL[i * 4 + 0] = wf / 255f; wf = (wl >>> 8) & 0x000000ff; wface[0].COL[i * 4 + 1] = wf / 255f; wf = (wl >>> 16) & 0x000000ff; wface[0].COL[i * 4 + 2] = wf / 255f; wf = (wl >>> 24) & 0x000000ff; wface[0].COL[i * 4 + 3] = wf / 255f; } } } // 頂点配列はすべて三角にするので、四角は三角x2に分割 // 0 3 0 0 3 // □ → △ ▽ // 1 2 1 2 2 if (s.length == 4) { wface = new Face[2]; wface[0] = new Face(); wface[1] = new Face(); wface[0].V = new Integer[3]; wface[0].V[0] = Integer.parseInt(s[0]); wface[0].V[1] = Integer.parseInt(s[1]); wface[0].V[2] = Integer.parseInt(s[2]); wface[0].M = Mn; wface[1].V = new Integer[3]; wface[1].V[0] = Integer.parseInt(s[0]); wface[1].V[1] = Integer.parseInt(s[2]); wface[1].V[2] = Integer.parseInt(s[3]); wface[1].M = Mn; p = line.indexOf("UV("); if (p != -1) { int uv_p; pe = line.indexOf(")", p); s = line.substring(p + 3, pe).split(" "); if (s.length != 2 * 4) throw new Exception("UVの数が不正"); wface[0].UV = new Float[2 * 3]; wface[1].UV = new Float[2 * 3]; for (int i = 0; i < 2; i++) { uv_p = 0; for (int j = 0; j < 4; j++) { if (i == 0 && j == 3) continue; if (i == 1 && j == 1) continue; wface[i].UV[uv_p++] = Float.parseFloat(s[j * 2 + 0]); wface[i].UV[uv_p++] = Float.parseFloat(s[j * 2 + 1]); } } } p = line.indexOf("COL("); if (p != -1) { pe = line.indexOf(")", p); s = line.substring(p + 4, pe).split(" "); if (s.length != 4) throw new Exception("COLの数が不正"); wface[0].COL = new Float[4 * 3]; wface[1].COL = new Float[4 * 3]; long wl; float wf; int col_p; for (int i = 0; i < 2; i++) { col_p = 0; for (int j = 0; j < s.length; j++) { if (i == 0 && j == 3) continue; if (i == 1 && j == 1) continue; wl = Long.parseLong(s[j]); wf = (wl >>> 0) & 0x000000ff; wface[i].COL[col_p * 4 + 0] = wf / 255f; wf = (wl >>> 8) & 0x000000ff; wface[i].COL[col_p * 4 + 1] = wf / 255f; wf = (wl >>> 16) & 0x000000ff; wface[i].COL[col_p * 4 + 2] = wf / 255f; wf = (wl >>> 24) & 0x000000ff; wface[i].COL[col_p * 4 + 3] = wf / 255f; col_p++; } } } } if (wface != null) { for (int i = 0; i < wface.length; i++) { qf.add(wface[i]); } } } } catch (Exception e) { Log.e("KGLMetaseq", "MQOファイル フォーマットエラー(Object>face)" + e.getMessage() + "[" + line + "]"); throw e; } if (qf.size() == 0) return null; return qf.toArray(new Face[0]); }