2014-12-23 5 views
0

OBJ 로딩 클래스를 패치하려고합니다. Short 번호 만 지원하므로 Short 번호 제한을 초과하는 큰 OBJ가 있습니다.ShortBuffer를 IntBuffer로 변경하면 BufferOverFlowException이 발생합니다.

Short Vector 대신 Integer Vectors를 사용하도록 코드를 변경하고 ShortBuffer를 IntBuffer로 변경해야했습니다.

이제 기본 OBJ에 3 초 안에로드하는 데 사용 된 (10,000 줄)로드가 더 이상 필요하지 않으며 BufferOverflowException이 발생합니다.

아래는 코드의 문제 덩어리입니다 : 내가 allocateDirect의 4에 2를 변경 한 경우 다음 함수가, 이상하게도 toPrimitiveArrayS

private static int[] toPrimitiveArrayS(Vector<Integer> vector){ 
    int[] s; 
    s = new int[vector.size()]; 
    for (int i=0; i<vector.size(); i++){ 
     s[i] = vector.get(i); 
    } 
    return s; 
} 

입니다

ByteBuffer fBuf = ByteBuffer.allocateDirect(faces.size() * 2); 
fBuf.order(ByteOrder.nativeOrder()); 
faceBuffer = fBuf.asIntBuffer(); 
faceBuffer.put(toPrimitiveArrayS(faces)); // this gives the exception 
faceBuffer.position(0); 

, 모델로드, 그러나 잘못 렌더링되었습니다 (이전에는 2로 표시된 숫자로 잘로드되어 방금보기 위해 바뀌 었습니다)

푸 아래 LL 클래스 코드 : 당신이 인덱스 당 하나 개의 INT를 사용하고 있기 때문에 당신은 얼굴 인덱스 당 두 바이트 (16 비트)를 할당하는

public class TDModelPart { 
Vector<Integer> faces; 
Vector<Integer> vtPointer; 
Vector<Integer> vnPointer; 
Material material; 
private FloatBuffer normalBuffer; 
IntBuffer faceBuffer; 

public TDModelPart(Vector<Integer> faces, Vector<Integer> vtPointer, Vector<Integer> vnPointer, Material material, Vector<Float> vn) { 
    super(); 

    this.faces = faces; 
    this.vtPointer = vtPointer; 
    this.vnPointer = vnPointer; 
    this.material = material; 

    ByteBuffer byteBuf = ByteBuffer.allocateDirect(vnPointer.size() * 4 * 3); 
    byteBuf.order(ByteOrder.nativeOrder()); 
    normalBuffer = byteBuf.asFloatBuffer(); 

    for(int i=0; i<vnPointer.size(); i++){ 
     float x=vn.get(vnPointer.get(i)*3); 
     float y=vn.get(vnPointer.get(i)*3+1); 
     float z=vn.get(vnPointer.get(i)*3+2); 
     normalBuffer.put(x); 
     normalBuffer.put(y); 
     normalBuffer.put(z); 
    } 

    normalBuffer.position(0); 

    ByteBuffer fBuf = ByteBuffer.allocateDirect(faces.size() * 2); 
    fBuf.order(ByteOrder.nativeOrder()); 
    faceBuffer = fBuf.asIntBuffer(); 
    faceBuffer.put(toPrimitiveArrayS(faces)); 
    faceBuffer.position(0); 
} 

public String toString(){ 
    String str=new String(); 
    if(material!=null) 
     str+="Material name:"+material.getName(); 
    else 
     str+="Material not defined!"; 
    str+="\nNumber of faces:"+faces.size(); 
    str+="\nNumber of vnPointers:"+vnPointer.size(); 
    str+="\nNumber of vtPointers:"+vtPointer.size(); 
    return str; 
} 

public IntBuffer getFaceBuffer(){ 
    return faceBuffer; 
} 

public FloatBuffer getNormalBuffer(){ 
    return normalBuffer; 
} 

private static int[] toPrimitiveArrayS(Vector<Integer> vector){ 
    int[] s; 
    s = new int[vector.size()]; 
    for (int i=0; i<vector.size(); i++){ 
     s[i] = vector.get(i); 
    } 
    return s; 
} 

public int getFacesCount(){ 
    return faces.size(); 
} 

public Material getMaterial(){ 
    return material; 
} 
} 

답변

0

, 네 개의 할당해야합니다 (int로는 32 비트 정수 4 바이트입니다) , 당신은 faceBuffer가 처리 할 수있는 두 배의 바이트를 할당하려고 시도합니다

+0

그래서 무엇을 고쳐야합니까? ShortBuffer를 사용할 수는 없지만 IntBuffer를 사용하면 작동하지 않으며 그래픽 카드에 인덱스를 업로드 할 때 –

+0

이 필요합니다. 이제 부호없는 정수임을 나타냅니다. –

+0

솔직히 무슨 말인지 모르겠군요. 간단히 ShortBuffer를 IntBuffer로 변경했습니다. 내 질문을 읽으십시오, 그게 내가 가진 모든 정보입니다. –