Beispiel #1
0
            public void read()
            {
                BlendStruct s = blend.getStruct("CustomDataLayer");

                for (int a = 0; a < s.nr; a++)
                {
                    BlendMember m = s.members.Get(a);
                    if (m.name.Equals("type"))
                    {
                        type = blend.readuint32();
                    }
                    else if (m.name.Equals("name[64]"))
                    {
                        name = blend.readString(m.size);
                    }
                    else if (m.name.Equals("*data"))
                    {
                        data = blend.readptr();
                    }
                    else
                    {
                        blend.datapos += m.size;
                    }
                }
            }
Beispiel #2
0
            public void read()
            {
                BlendStruct s = blend.getStruct("Object");

                for (int a = 0; a < s.nr; a++)
                {
                    BlendMember m = s.members.Get(a);
                    if (m.name.Equals("*data"))
                    {
                        data = blend.readptr();
                    }
                    else if (m.name.Equals("loc[3]"))
                    {
                        blend.readFloatArray(loc);
                    }
                    else if (m.name.Equals("type"))
                    {
                        type = blend.readuint16();
                    }
                    else if (m.name.Equals("id"))
                    {
                        id.read();
                    }
                    else
                    {
                        blend.datapos += m.size;
                    }
                }
            }
Beispiel #3
0
            public void read()
            {
                BlendStruct s = blend.getStruct("Base");

                for (int a = 0; a < s.nr; a++)
                {
                    BlendMember m = s.members.Get(a);
                    if (m.name.Equals("*next"))
                    {
                        next = blend.readptr();
                    }
                    else if (m.name.Equals("*prev"))
                    {
                        prev = blend.readptr();
                    }
                    else if (m.name.Equals("*object"))
                    {
                        bobject = blend.readptr();
                    }
                    else
                    {
                        blend.datapos += m.size;
                    }
                }
            }
Beispiel #4
0
 private BlendStruct getStruct(String name)
 {
     for (int a = 0; a < structs.Size(); a++)
     {
         BlendStruct s = structs.Get(a);
         if (s.name.Equals(name))
         {
             return(s);
         }
     }
     throw new Exception("Struct not found:" + name);
 }
Beispiel #5
0
            public void read()
            {
                BlendStruct s = blend.getStruct("Mesh");

                for (int a = 0; a < s.nr; a++)
                {
                    BlendMember m = s.members.Get(a);
                    if (m.name.Equals("*mpoly"))
                    {
                        mpoly = blend.readptr();
                    }
                    else if (m.name.Equals("*mloop"))
                    {
                        mloop = blend.readptr();
                    }
                    else if (m.name.Equals("*mloopuv"))
                    {
                        mloopuv = blend.readptr();
                    }
                    else if (m.name.Equals("*mvert"))
                    {
                        mvert = blend.readptr();
                    }
                    else if (m.name.Equals("vdata"))
                    {
                        vdata.read("vdata");
                    }
                    else if (m.name.Equals("edata"))
                    {
                        edata.read("edata");
                    }
                    else if (m.name.Equals("fdata"))
                    {
                        fdata.read("fdata");
                    }
                    else if (m.name.Equals("pdata"))
                    {
                        pdata.read("pdata");
                    }
                    else if (m.name.Equals("ldata"))
                    {
                        ldata.read("ldata");
                    }
                    else if (m.name.Equals("id"))
                    {
                        id.read();
                    }
                    else
                    {
                        blend.datapos += m.size;
                    }
                }
            }
Beispiel #6
0
            public void read(String name)
            {
                BlendStruct s = blend.getStruct("CustomData");

                for (int a = 0; a < s.nr; a++)
                {
                    BlendMember m = s.members.Get(a);
                    if (m.name.Equals("*layers"))
                    {
                        layers = blend.readptr();
                    }
                    else
                    {
                        blend.datapos += m.size;
                    }
                }
            }
Beispiel #7
0
            public void read()
            {
                BlendStruct s = blend.getStruct("ID");

                for (int a = 0; a < s.nr; a++)
                {
                    BlendMember m = s.members.Get(a);
                    if (m.name.Equals("name[66]"))
                    {
                        name = blend.readString(m.size);
                    }
                    else
                    {
                        blend.datapos += m.size;
                    }
                }
            }
Beispiel #8
0
            public void read()
            {
                BlendStruct s = blend.getStruct("MTexPoly");

                for (int a = 0; a < s.nr; a++)
                {
                    BlendMember m = s.members.Get(a);
                    if (m.name.Equals("*tpage"))
                    {
                        tpage = blend.readptr();
                    }
                    else
                    {
                        blend.datapos += m.size;
                    }
                }
            }
Beispiel #9
0
            public void read()
            {
                BlendStruct s = blend.getStruct("MLoop");

                for (int a = 0; a < s.nr; a++)
                {
                    BlendMember m = s.members.Get(a);
                    if (m.name.Equals("v"))
                    {
                        v = blend.readuint32();
                    }
                    else
                    {
                        blend.datapos += m.size;
                    }
                }
            }
Beispiel #10
0
            public void read()
            {
                BlendStruct s = blend.getStruct("OpenGLScene");

                for (int a = 0; a < s.nr; a++)
                {
                    BlendMember m = s.members.Get(a);
                    if (m.name.Equals("_base"))
                    {
                        first = blend.readptr();
                        last  = blend.readptr();
                    }
                    else
                    {
                        blend.datapos += m.size;
                    }
                }
            }
Beispiel #11
0
            public void read()
            {
                BlendStruct s = blend.getStruct("MLoopUV");

                for (int a = 0; a < s.nr; a++)
                {
                    BlendMember m = s.members.Get(a);
                    if (m.name.Equals("uv[2]"))
                    {
                        uv[0] = blend.readfloat();
                        uv[1] = blend.readfloat();
                    }
                    else
                    {
                        blend.datapos += m.size;
                    }
                }
            }
Beispiel #12
0
            public void read()
            {
                BlendStruct s = blend.getStruct("MVert");

                for (int a = 0; a < s.nr; a++)
                {
                    BlendMember m = s.members.Get(a);
                    if (m.name.Equals("co[3]"))
                    {
                        for (int b = 0; b < 3; b++)
                        {
                            v[b] = blend.readfloat() + blend.org[b]; //xyz position
                        }
                    }
                    else
                    {
                        blend.datapos += m.size;
                    }
                }
            }
Beispiel #13
0
            public void read()
            {
                BlendStruct s = blend.getStruct("MPoly");

                for (int a = 0; a < s.nr; a++)
                {
                    BlendMember m = s.members.Get(a);
                    if (m.name.Equals("loopstart"))
                    {
                        loopstart = blend.readuint32();
                    }
                    else if (m.name.Equals("totloop"))
                    {
                        totloop = blend.readuint32();
                    }
                    else
                    {
                        blend.datapos += m.size;
                    }
                }
            }
Beispiel #14
0
        private OpenGLModel loadBlend(IOStream fis)
        {
            setData(fis.ReadAll().ToArray());

            if (data.Length < 12)
            {
                throw new Exception("GL_BLEND:File too small");
            }

            model = new OpenGLModel();

            //load signature (12 bytes) "BLENDER_V100"
            if (!new String(data, 0, 7).Equals("BLENDER"))
            {
                throw new Exception("Not a blender file");
            }
            switch ((char)data[7])
            {
            case '-': x64 = true; break;

            case '_': x64 = false; break;

            default:
                throw new Exception("GL_BLEND:Unknown bit size");
            }

            switch ((char)data[8])
            {
            case 'v': le = true; break;

            case 'V': le = false; break;

            default:
                throw new Exception("GL_BLEND:Unknown Endianness");
            }

            String version = new String(data, 9, 3);
//        Console.WriteLine("Blender file version:" + version);
            int ver = Int32.ValueOf(version);

            if (ver < 263)
            {
                throw new Exception("Error:Blender file too old, can not read.");
            }

            datapos = 12; //skip main header

            //first phase - read raw chunks
            while (!eof())
            {
                BlendChunk chunk = new BlendChunk(this);
                chunk.filepos = datapos;
                chunk.read();
                BlendChunk ochunk = chunks.Get(chunk.ptr);
                if (ochunk != null)
                {
                    if (!haveDups)
                    {
                        Console.WriteLine("Warning:This file contains duplicate BHeads.");
                        haveDups = true;
                    }
                    ochunk.dup = true;
                    while (ochunk.nextdup != null)
                    {
                        ochunk = ochunk.nextdup;
                    }
                    ochunk.nextdup = chunk;
                }
                else
                {
                    chunks.Set(chunk.ptr, chunk);
                }
            }

            int chunkCnt = chunks.Size();

            BlendChunk[] chunkArray = chunks.Values();
            BlendChunk   raw;

            //2nd phase - parse DNA chunk
            for (int i = 0; i < chunkCnt; i++)
            {
                if (chunkArray[i].id == ID_DNA1)
                {
                    raw = chunkArray[i];
                    setData(raw.raw);
                    //SDNA
                    String SDNA = readString(4);
                    if (!SDNA.Equals("SDNA"))
                    {
                        throw new Exception("Bad DNA Struct:SDNA");
                    }
                    //NAME
                    String NAME = readString(4);
                    if (!NAME.Equals("NAME"))
                    {
                        throw new Exception("Bad DNA Struct:NAME");
                    }
                    int nr_names = readuint32();
                    for (int a = 0; a < nr_names; a++)
                    {
                        String str = readString();
//                    Console.WriteLine("name=" + str);
                        names.Add(str);
                    }
                    //align pointer
                    datapos += 3;
                    datapos &= 0x7ffffffc;
                    //TYPE
                    String TYPE = readString(4);
                    if (!TYPE.Equals("TYPE"))
                    {
                        throw new Exception("Bad DNA Struct:TYPE");
                    }
                    int nr_types = readuint32();
                    for (int a = 0; a < nr_types; a++)
                    {
                        String str = readString();
//                    Console.WriteLine("type=" + str);
                        types.Add(str);
                    }
                    //align pointer
                    datapos += 3;
                    datapos &= 0x7ffffffc;
                    //TLEN
                    String TLEN = readString(4);
                    if (!TLEN.Equals("TLEN"))
                    {
                        throw new Exception("Bad DNA Struct:TLEN");
                    }
                    for (int a = 0; a < nr_types; a++)
                    {
                        typelen.Add(readuint16());
                    }
                    //align pointer
                    datapos += 3;
                    datapos &= 0x7ffffffc;
                    //STRC
                    String STRC = readString(4);
                    if (!STRC.Equals("STRC"))
                    {
                        throw new Exception("Bad DNA Struct:STRC");
                    }
                    int nr_structs = readuint32();
                    for (int a = 0; a < nr_structs; a++)
                    {
                        BlendStruct s = new BlendStruct();
                        s.typeidx = readuint16();
                        s.nr      = readuint16();
                        s.name    = types.Get(s.typeidx);
//                    Console.WriteLine("Struct:" + s.name + "==" + a);
                        for (int b = 0; b < s.nr; b++)
                        {
                            BlendMember m = new BlendMember();
                            m.typelenidx = readuint16();
                            m.nameidx    = readuint16();
                            m.name       = names.Get(m.nameidx);
                            m.typelen    = typelen.Get(m.typelenidx);
                            m.size       = calcMemberSize(m);
//                        Console.WriteLine("    Member:" + m.name + "=" + m.Length);
                            s.members.Add(m);
                        }
                        structs.Add(s);
                    }
                    break;
                }
            }

            //3nd phase - now look for objects and piece together chunks
            for (int i = 0; i < chunkCnt; i++)
            {
                if (chunkArray[i].id == ID_SC)
                {
                    setData(chunkArray[i].raw);
                    BlendScene OpenGLScene = new BlendScene(this);
                    OpenGLScene.read();
                    long ptr = OpenGLScene.last;
                    while (ptr != 0)
                    {
                        BlendChunk chunk = findChunkByPtr(ptr);
                        if (chunk == null)
                        {
                            break;
                        }
                        setData(chunk.raw);
                        BlendBase _base = new BlendBase(this);
                        _base.read();
                        chunk = findChunkByPtr(_base.bobject);
                        if (chunk.id == ID_OB)
                        {
                            readObject(chunk);
                        }
                        ptr = _base.prev;
                    }
                }
            }

            return(model);
        }