/**
Copyright (C) 2010 Tobias Domhan
This file is part of AndObjViewer.
AndObjViewer is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
AndObjViewer is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with AndObjViewer. If not, see <http://www.gnu.org/licenses/>.
*/
package edu.dhbw.andobjviewer.models;
import java.io.Serializable;
import java.nio.ByteBuffer;
import java.nio.FloatBuffer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Vector;
import edu.dhbw.andobjviewer.util.MemUtil;
/**
* a group of faces.
* @author Tobi
*
*/
public class Group implements Serializable {
private String materialName = "default";
private transient Material material;
/**
* is there a texture associated with this group?
*/
private boolean textured = false;
//access not via getters for performance reasons
public transient FloatBuffer vertices = null;
public transient FloatBuffer texcoords = null;
public transient FloatBuffer normals = null;
public int vertexCount = 0;
public ArrayList<Float> groupVertices = new ArrayList<Float>(500);
public ArrayList<Float> groupNormals = new ArrayList<Float>(500);
public ArrayList<Float> groupTexcoords = new ArrayList<Float>();
public Group() {
}
public void setMaterialName(String currMat) {
this.materialName = currMat;
}
public String getMaterialName() {
return materialName;
}
public Material getMaterial() {
return material;
}
public void setMaterial(Material material) {
if(texcoords != null && material != null && material.hasTexture()) {
textured = true;
}
if(material != null)
this.material = material;
}
public boolean containsVertices() {
if(groupVertices != null)
return groupVertices.size()>0;
else if(vertices != null)
return vertices.capacity()>0;
else
return false;
}
public void setTextured(boolean b) {
textured = b;
}
public boolean isTextured() {
return textured;
}
/**
* convert all dynamic arrays to final non alterable ones.
*/
public void finalize() {
if (null !=groupTexcoords && groupTexcoords.size() > 0) {
textured = true;
texcoords = MemUtil.makeFloatBuffer(groupTexcoords.size());
for (Iterator<Float> iterator = groupTexcoords.iterator(); iterator.hasNext();) {
Float curVal = iterator.next();
texcoords.put(curVal.floatValue());
}
texcoords.position(0);
if(material != null && material.hasTexture()) {
textured = true;
} else {
textured = false;
}
}
groupTexcoords = null;
//System.gc();
vertices = MemUtil.makeFloatBuffer(groupVertices.size());
vertexCount = groupVertices.size()/3;//three floats pers vertex
for (Iterator<Float> iterator = groupVertices.iterator(); iterator.hasNext();) {
Float curVal = iterator.next();
vertices.put(curVal.floatValue());
}
//let the garbage collector free the memory
groupVertices = null;
//System.gc();
normals = MemUtil.makeFloatBuffer(groupNormals.size());
for (Iterator<Float> iterator = groupNormals.iterator(); iterator.hasNext();) {
Float curVal = iterator.next();
normals.put(curVal.floatValue());
}
//let the garbage collector free the memory
groupNormals = null;
//System.gc();
vertices.position(0);
normals.position(0);
}
/*
* get a google protocol buffers builder, that may be serialized
*/
/*public BufferGroup getProtocolBuffer() {
ModelProtocolBuffer.BufferGroup.Builder builder = ModelProtocolBuffer.BufferGroup.newBuilder();
return builder.build();
}*/
}