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; } } }
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; } } }
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; } } }
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); }
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; } } }
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; } } }
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; } } }
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; } } }
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; } } }
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; } } }
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; } } }
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; } } }
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; } } }
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); }