| 30 |
30 |
import org.distorted.library.program.DistortedProgram;
|
| 31 |
31 |
import org.distorted.library.type.Static4D;
|
| 32 |
32 |
|
|
33 |
import java.io.DataOutputStream;
|
|
34 |
import java.io.FileNotFoundException;
|
|
35 |
import java.io.FileOutputStream;
|
| 33 |
36 |
import java.io.IOException;
|
|
37 |
import java.io.DataInputStream;
|
| 34 |
38 |
import java.nio.ByteBuffer;
|
| 35 |
39 |
import java.nio.ByteOrder;
|
| 36 |
40 |
import java.nio.FloatBuffer;
|
| 37 |
|
import java.nio.channels.FileChannel;
|
| 38 |
41 |
import java.util.ArrayList;
|
| 39 |
42 |
|
| 40 |
43 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| ... | ... | |
| 716 |
719 |
if( mJobNode[0]!=null )
|
| 717 |
720 |
{
|
| 718 |
721 |
mJobNode[0].execute(); // this will set itself to null
|
|
722 |
/*
|
|
723 |
try
|
|
724 |
{
|
|
725 |
String name = "/sdcard/"+mNumVertices+".dmesh";
|
|
726 |
DataOutputStream dos = new DataOutputStream(new FileOutputStream(name));
|
|
727 |
write(dos);
|
|
728 |
android.util.Log.e("mesh", "file wrritten: "+name);
|
|
729 |
}
|
|
730 |
catch(FileNotFoundException ex)
|
|
731 |
{
|
|
732 |
android.util.Log.e("mesh", "file not found exception: "+ex.toString());
|
|
733 |
}
|
|
734 |
*/
|
| 719 |
735 |
}
|
| 720 |
736 |
|
| 721 |
737 |
int index1 = mVBO1.createImmediately(mNumVertices*VERT1_SIZE, mVertAttribs1);
|
| ... | ... | |
| 770 |
786 |
|
| 771 |
787 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 772 |
788 |
|
| 773 |
|
void read(FileChannel file) throws IOException
|
|
789 |
void read(DataInputStream stream)
|
| 774 |
790 |
{
|
| 775 |
|
ByteBuffer buffer = ByteBuffer.allocate(BYTES_PER_FLOAT*4);
|
| 776 |
|
int version, numVertices=0, numEff=0, numTex=0;
|
|
791 |
byte[] buffer = new byte[BYTES_PER_FLOAT*4];
|
|
792 |
int version, numEff, numTex;
|
| 777 |
793 |
|
| 778 |
794 |
try
|
| 779 |
795 |
{
|
| 780 |
|
file.read(buffer);
|
|
796 |
stream.read(buffer);
|
|
797 |
ByteBuffer byteBuf = ByteBuffer.wrap(buffer);
|
| 781 |
798 |
|
| 782 |
|
version = buffer.getInt(0);
|
|
799 |
version = byteBuf.getInt(0);
|
| 783 |
800 |
|
| 784 |
801 |
if( version==1 )
|
| 785 |
802 |
{
|
| 786 |
|
numVertices = buffer.getInt(4);
|
| 787 |
|
numTex = buffer.getInt(8);
|
| 788 |
|
numEff = buffer.getInt(12);
|
|
803 |
mNumVertices= byteBuf.getInt(4);
|
|
804 |
numTex = byteBuf.getInt(8);
|
|
805 |
numEff = byteBuf.getInt(12);
|
|
806 |
|
|
807 |
// android.util.Log.e("mesh", "version: "+version+" vert: "+mNumVertices+" numTex: "+numTex+" numEff: "+numEff);
|
| 789 |
808 |
}
|
| 790 |
809 |
else
|
| 791 |
810 |
{
|
| 792 |
|
android.util.Log.e("mesh", "Error: unknown mesh file version "+version);
|
| 793 |
|
file.close();
|
|
811 |
android.util.Log.e("mesh", "Error: unknown mesh file version "+String.format("0x%08X", version));
|
| 794 |
812 |
return;
|
| 795 |
813 |
}
|
| 796 |
814 |
}
|
| 797 |
815 |
catch(IOException e)
|
| 798 |
816 |
{
|
| 799 |
|
file.close();
|
| 800 |
|
throw e;
|
|
817 |
android.util.Log.e("mesh", "IOException1 trying to read file: "+e.toString());
|
|
818 |
return;
|
| 801 |
819 |
}
|
| 802 |
820 |
|
| 803 |
|
if( numVertices>0 && numEff>0 && numTex>0 )
|
|
821 |
if( mNumVertices>0 && numEff>0 && numTex>0 )
|
| 804 |
822 |
{
|
| 805 |
823 |
int size = numEff+TEX_COMP_SIZE*numTex;
|
| 806 |
824 |
float[] tmp = new float[size];
|
| 807 |
|
mVertAttribs1 = new float[VERT1_SIZE*mNumVertices];
|
| 808 |
|
mVertAttribs2 = new float[VERT2_SIZE*mNumVertices];
|
|
825 |
mVertAttribs1 = new float[VERT1_ATTRIBS*mNumVertices];
|
|
826 |
mVertAttribs2 = new float[VERT2_ATTRIBS*mNumVertices];
|
| 809 |
827 |
|
| 810 |
|
buffer = ByteBuffer.allocate(BYTES_PER_FLOAT*size + mNumVertices*(VERT1_SIZE+VERT2_SIZE));
|
|
828 |
buffer = new byte[BYTES_PER_FLOAT*(size + mNumVertices*(VERT1_ATTRIBS+VERT2_ATTRIBS))];
|
| 811 |
829 |
|
| 812 |
|
file.read(buffer);
|
|
830 |
try
|
|
831 |
{
|
|
832 |
stream.read(buffer);
|
|
833 |
}
|
|
834 |
catch(IOException e)
|
|
835 |
{
|
|
836 |
android.util.Log.e("mesh", "IOException2 trying to read file: "+e.toString());
|
|
837 |
return;
|
|
838 |
}
|
|
839 |
|
|
840 |
|
|
841 |
ByteBuffer byteBuf = ByteBuffer.wrap(buffer);
|
|
842 |
FloatBuffer floatBuf = byteBuf.asFloatBuffer();
|
| 813 |
843 |
|
| 814 |
|
buffer.asFloatBuffer().get(tmp,0,size);
|
| 815 |
|
buffer.asFloatBuffer().get(mVertAttribs1, 0, VERT1_SIZE*mNumVertices);
|
| 816 |
|
buffer.asFloatBuffer().get(mVertAttribs2, 0, VERT2_SIZE*mNumVertices);
|
|
844 |
floatBuf.get(tmp,0,size);
|
| 817 |
845 |
|
|
846 |
/*
|
|
847 |
for(int f=0; f<size; f++)
|
|
848 |
{
|
|
849 |
android.util.Log.e("mesh", "tmp "+f+": "+tmp[f]);
|
|
850 |
}
|
|
851 |
*/
|
|
852 |
|
|
853 |
floatBuf.get(mVertAttribs1, 0, VERT1_ATTRIBS*mNumVertices);
|
|
854 |
floatBuf.get(mVertAttribs2, 0, VERT2_ATTRIBS*mNumVertices);
|
|
855 |
/*
|
|
856 |
for(int f=0; f<mNumVertices; f++)
|
|
857 |
{
|
|
858 |
android.util.Log.e("mesh", "vert "+f+": "+mVertAttribs1[9*f]+" "+mVertAttribs1[9*f+1]+" "+mVertAttribs1[9*f+2]+" "+mVertAttribs1[9*f+3]+" "+mVertAttribs1[9*f+4]+" "+mVertAttribs1[9*f+5]+" "+mVertAttribs1[9*f+6]+" "+mVertAttribs1[9*f+7]+" "+mVertAttribs1[9*f+8]);
|
|
859 |
}
|
|
860 |
*/
|
| 818 |
861 |
TexComponent tex;
|
| 819 |
862 |
int index, texComp;
|
| 820 |
863 |
float x, y, z, w;
|
| ... | ... | |
| 828 |
871 |
z= tmp[TEX_COMP_SIZE*texComp+3];
|
| 829 |
872 |
w= tmp[TEX_COMP_SIZE*texComp+4];
|
| 830 |
873 |
|
|
874 |
//android.util.Log.e("mesh", "tex comp "+texComp+" index="+index+" x="+x+" y="+y+" z="+z+" w="+w);
|
|
875 |
|
| 831 |
876 |
tex = new TexComponent(index);
|
| 832 |
877 |
tex.setMap(new Static4D(x,y,z,w));
|
| 833 |
878 |
|
| ... | ... | |
| 838 |
883 |
{
|
| 839 |
884 |
index = (int)tmp[TEX_COMP_SIZE*texComp + effComp ];
|
| 840 |
885 |
mEffComponent.add(index);
|
|
886 |
|
|
887 |
|
|
888 |
//android.util.Log.e("mesh", "eff comp "+effComp+" index="+index);
|
|
889 |
|
| 841 |
890 |
}
|
| 842 |
891 |
}
|
| 843 |
|
|
| 844 |
|
file.close();
|
| 845 |
892 |
}
|
| 846 |
893 |
|
| 847 |
894 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| ... | ... | |
| 850 |
897 |
/**
|
| 851 |
898 |
* Write the Mesh to a File.
|
| 852 |
899 |
*/
|
| 853 |
|
public void write(FileChannel file) throws IOException
|
|
900 |
public void write(DataOutputStream stream)
|
| 854 |
901 |
{
|
| 855 |
902 |
TexComponent tex;
|
| 856 |
903 |
|
| 857 |
904 |
int numTex = mTexComponent.size();
|
| 858 |
905 |
int numEff = mEffComponent.size();
|
| 859 |
906 |
|
| 860 |
|
ByteBuffer buffer = ByteBuffer.allocate(BYTES_PER_FLOAT*(numEff+TEX_COMP_SIZE*numTex+4));
|
| 861 |
|
FloatBuffer buf = buffer.asFloatBuffer();
|
| 862 |
|
|
| 863 |
|
buf.put(1); // version
|
| 864 |
|
buf.put(mNumVertices);
|
| 865 |
|
buf.put(numTex);
|
| 866 |
|
buf.put(numEff);
|
| 867 |
|
|
| 868 |
|
for(int i=0; i<numTex; i++)
|
|
907 |
try
|
| 869 |
908 |
{
|
| 870 |
|
tex = mTexComponent.get(i);
|
|
909 |
stream.writeInt(1); // version
|
|
910 |
stream.writeInt(mNumVertices);
|
|
911 |
stream.writeInt(numTex);
|
|
912 |
stream.writeInt(numEff);
|
| 871 |
913 |
|
| 872 |
|
buf.put(tex.mEndIndex);
|
| 873 |
|
buf.put(tex.mTextureMap.get0());
|
| 874 |
|
buf.put(tex.mTextureMap.get1());
|
| 875 |
|
buf.put(tex.mTextureMap.get2());
|
| 876 |
|
buf.put(tex.mTextureMap.get3());
|
| 877 |
|
}
|
|
914 |
for(int i=0; i<numTex; i++)
|
|
915 |
{
|
|
916 |
tex = mTexComponent.get(i);
|
| 878 |
917 |
|
| 879 |
|
for(int i=0; i<numEff; i++)
|
| 880 |
|
{
|
| 881 |
|
buf.put(mEffComponent.get(i));
|
| 882 |
|
}
|
|
918 |
stream.writeFloat((float)tex.mEndIndex);
|
|
919 |
stream.writeFloat(tex.mTextureMap.get0());
|
|
920 |
stream.writeFloat(tex.mTextureMap.get1());
|
|
921 |
stream.writeFloat(tex.mTextureMap.get2());
|
|
922 |
stream.writeFloat(tex.mTextureMap.get3());
|
|
923 |
}
|
| 883 |
924 |
|
| 884 |
|
ByteBuffer vertBuf1 = ByteBuffer.allocate(VERT1_SIZE*mNumVertices);
|
| 885 |
|
vertBuf1.asFloatBuffer().put(mVertAttribs1);
|
| 886 |
|
ByteBuffer vertBuf2 = ByteBuffer.allocate(VERT2_SIZE*mNumVertices);
|
| 887 |
|
vertBuf2.asFloatBuffer().put(mVertAttribs2);
|
|
925 |
for(int i=0; i<numEff; i++)
|
|
926 |
{
|
|
927 |
stream.writeFloat((float)mEffComponent.get(i));
|
|
928 |
}
|
| 888 |
929 |
|
| 889 |
|
try
|
| 890 |
|
{
|
| 891 |
|
file.write(buffer);
|
| 892 |
|
file.write(vertBuf1);
|
| 893 |
|
file.write(vertBuf2);
|
|
930 |
ByteBuffer vertBuf1 = ByteBuffer.allocate(VERT1_SIZE*mNumVertices);
|
|
931 |
vertBuf1.asFloatBuffer().put(mVertAttribs1);
|
|
932 |
ByteBuffer vertBuf2 = ByteBuffer.allocate(VERT2_SIZE*mNumVertices);
|
|
933 |
vertBuf2.asFloatBuffer().put(mVertAttribs2);
|
|
934 |
|
|
935 |
stream.write(vertBuf1.array());
|
|
936 |
stream.write(vertBuf2.array());
|
| 894 |
937 |
}
|
| 895 |
|
catch(IOException e)
|
|
938 |
catch(IOException ex)
|
| 896 |
939 |
{
|
| 897 |
|
file.close();
|
| 898 |
|
throw e;
|
|
940 |
android.util.Log.e("mesh", "IOException trying to write a mesh: "+ex.toString());
|
| 899 |
941 |
}
|
| 900 |
|
|
| 901 |
|
file.close();
|
| 902 |
942 |
}
|
| 903 |
943 |
|
| 904 |
944 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
Reading a mesh from the .dmesh file might work now. Checked on two small meshes.