Пример #1
0
        public override Mesh decode(MeshInfo minfo, CtmInputStream input)
        {
            int vc = minfo.getVertexCount();

            checkTag(input.readLittleInt(), MG2_HEADER_TAG);
            float vertexPrecision = input.readLittleFloat();
            float normalPrecision = input.readLittleFloat();

            Grid grid = Grid.fromStream(input);
            if(!grid.checkIntegrity()) {
                throw new InvalidDataException("The vertex size grid is corrupt!");
            }

            float[] vertices = readVertices(input, grid, vc, vertexPrecision);

            int[] indices = readIndices(input, minfo.getTriangleCount(), vc);

            float[] normals = null;
            if (minfo.hasNormals()) {
                normals = readNormals(input, vertices, indices, normalPrecision, vc);
            }

            AttributeData[] uvData = new AttributeData[minfo.getUvMapCount()];
            for (int i = 0; i < uvData.Length; i++) {
                uvData[i] = readUvData(input, vc);
            }

            AttributeData[] attributs = new AttributeData[minfo.getAttrCount()];
            for (int i = 0; i < attributs.Length; i++) {
                attributs[i] = readAttribute(input, vc);
            }

            return new Mesh(vertices, normals, indices, uvData, attributs);
        }
Пример #2
0
 protected virtual float[] readFloatArray(CtmInputStream input, int count, int size)
 {
     float[] array = new float[count * size];
     for (int i = 0; i < array.Length; i++) {
         array[i] = input.readLittleFloat();
     }
     return array;
 }
Пример #3
0
 protected virtual float[] readFloatArray(CtmInputStream input, int count, int size)
 {
     float[] array = new float[count * size];
     for (int i = 0; i < array.Length; i++)
     {
         array[i] = input.readLittleFloat();
     }
     return(array);
 }
Пример #4
0
        public override Mesh decode(MeshInfo minfo, CtmInputStream input)
        {
            int vc = minfo.getVertexCount();

            checkTag(input.readLittleInt(), MG2_HEADER_TAG);
            float vertexPrecision = input.readLittleFloat();
            float normalPrecision = input.readLittleFloat();

            Grid grid = Grid.fromStream(input);

            if (!grid.checkIntegrity())
            {
                throw new InvalidDataException("The vertex size grid is corrupt!");
            }

            float[] vertices = readVertices(input, grid, vc, vertexPrecision);

            int[] indices = readIndices(input, minfo.getTriangleCount(), vc);

            float[] normals = null;
            if (minfo.hasNormals())
            {
                normals = readNormals(input, vertices, indices, normalPrecision, vc);
            }

            AttributeData[] uvData = new AttributeData[minfo.getUvMapCount()];
            for (int i = 0; i < uvData.Length; i++)
            {
                uvData[i] = readUvData(input, vc);
            }

            AttributeData[] attributs = new AttributeData[minfo.getAttrCount()];
            for (int i = 0; i < attributs.Length; i++)
            {
                attributs[i] = readAttribute(input, vc);
            }

            return(new Mesh(vertices, normals, indices, uvData, attributs));
        }
Пример #5
0
        private AttributeData readAttribute(CtmInputStream input, int vc)
        {
            checkTag(input.readLittleInt(), ATTR);

            String name = input.readString();
            float precision = input.readLittleFloat();
            if (precision <= 0f) {
                throw new InvalidDataException("An attribute precision value <= 0.0 was read");
            }

            int[] intData = input.readPackedInts(vc, Mesh.CTM_ATTR_ELEMENT_COUNT, true);
            float[] data = restoreAttribs(precision, intData);

            return new AttributeData(name, null, precision, data);
        }
        protected virtual float[] readFloatArray(CtmInputStream input, int count, int size)
        {
            //   float[] floatArray = new float[count * size];
            //for (int i = 0; i < floatArray.Length; i++) {
            //       floatArray[i] = input.readLittleFloat();
            //}
            //return floatArray;

            int length = count * size;

            for (int i = 0; i < length; i++)
            {
                floatArray.Add(input.readLittleFloat());
            }
            return(floatArray.ToArray());
        }
Пример #7
0
        private AttributeData readUvData(CtmInputStream input, int vcount)
        {
            checkTag(input.readLittleInt(), TEXC);
            String name      = input.readString();
            String material  = input.readString();
            float  precision = input.readLittleFloat();

            if (precision <= 0f)
            {
                throw new InvalidDataException("A uv precision value <= 0.0 was read");
            }

            int[]   intCoords = input.readPackedInts(vcount, Mesh.CTM_UV_ELEMENT_COUNT, true);
            float[] data      = restoreUVCoords(precision, intCoords);

            return(new AttributeData(name, material, precision, data));
        }
Пример #8
0
        private AttributeData readAttribute(CtmInputStream input, int vc)
        {
            checkTag(input.readLittleInt(), ATTR);

            String name      = input.readString();
            float  precision = input.readLittleFloat();

            if (precision <= 0f)
            {
                throw new InvalidDataException("An attribute precision value <= 0.0 was read");
            }

            int[]   intData = input.readPackedInts(vc, Mesh.CTM_ATTR_ELEMENT_COUNT, true);
            float[] data    = restoreAttribs(precision, intData);

            return(new AttributeData(name, null, precision, data));
        }
Пример #9
0
        private AttributeData readUvData(CtmInputStream input, int vcount)
        {
            checkTag(input.readLittleInt(), TEXC);
            String name = input.readString();
            String material = input.readString();
            float precision = input.readLittleFloat();
            if (precision <= 0f) {
                throw new InvalidDataException("A uv precision value <= 0.0 was read");
            }

            int[] intCoords = input.readPackedInts(vcount, Mesh.CTM_UV_ELEMENT_COUNT, true);
            float[] data = restoreUVCoords(precision, intCoords);

            return new AttributeData(name, material, precision, data);
        }