package dxg;

import java.util.*;
import java.nio.*;

public class MeshData {
    MeshHeader mesh_header;

    // vertex_info: 分解して以下のフィールドに保存。
    int[] vertex_lut;	// int[vertex_info_nr]
    int[] normal_lut;	// int[vertex_info_nr]
    int[] uv_lut;	// int[vertex_info_nr]

    // face_info: 3要素でface_info構造体に対応。
    short[] face_info;	// short[face_info_nr * 3]

    String[] nameT;
    byte[] dataU;

    MeshData(ByteBuffer bf, int nr, ArrayList<Span> ranges) {
	int i, n;
	Span span = new Span("  メッシュ" + nr, bf.position(), -1, 1, -1);
	ranges.add(span);

	// メッシュヘッダを読み取り
	mesh_header = new MeshHeader(bf, ranges);

	// 頂点情報を読み取り
	n = mesh_header.vertex_info_nr;
	ranges.add(new Span("  頂点情報", bf.position(), n * 5 * 2, n, 5 * 2));
	vertex_lut = new int[n];
	normal_lut = new int[n];
	uv_lut = new int[n];
	for(i = 0; i < n; i++) {
	    vertex_lut[i] = bf.getShort();
	    normal_lut[i] = bf.getShort();
	    uv_lut[i] = bf.getShort();
	    bf.getShort(); // 捨てる
	    bf.getShort(); // 捨てる
	}

	// 面情報を読み取り
	n = mesh_header.face_info_nr;
	ranges.add(new Span("  面情報", bf.position(), n * 3 * 2, n, 3 * 2));
	face_info = new short[n * 3];
	for(i = 0; i < n * 3; i++)
	    face_info[i] = bf.getShort();

	// 名前T
	if(mesh_header.name_t_nr == 0) {
	    nameT = new String[0];
	} else {
	    n = bf.getInt();
	    ranges.add(new Span("  名前T", bf.position() - 4, 4 + n, 4 + n, 1));
	    nameT = Util.getNames(bf, n);
	}

	// データU
	n = (mesh_header.data_u_nr + 3) / 4 * 4;
	ranges.add(new Span("  データU", bf.position(), n, 1, n));
	bf.position(bf.position() + n);

	span.setLength(bf.position() - span.start);
    }
}
