// ------------------------------------------------------------------------------------------------ void COBImporter::ReadBitM_Binary(COB::Scene& /*out*/, StreamReaderLE& reader, const ChunkInfo& nfo) { if(nfo.version > 1) { return UnsupportedChunk_Binary(reader,nfo,"BitM"); } const chunk_guard cn(nfo,reader); const uint32_t len = reader.GetI4(); reader.IncPtr(len); reader.GetI4(); reader.IncPtr(reader.GetI4()); }
// ------------------------------------------------------------------------------------------------ void COBImporter::UnsupportedChunk_Binary( StreamReaderLE& reader, const ChunkInfo& nfo, const char* name) { const std::string error = format("Encountered unsupported chunk: ") << name << " [version: "<<nfo.version<<", size: "<<nfo.size<<"]"; // we can recover if the chunk size was specified. if(nfo.size != static_cast<unsigned int>(-1)) { DefaultLogger::get()->error(error); reader.IncPtr(nfo.size); } else ThrowException(error); }
// ------------------------------------------------------------------------------------------------ void COBImporter::ReadBasicNodeInfo_Binary(Node& msh, StreamReaderLE& reader, const ChunkInfo& /*nfo*/) { const unsigned int dupes = reader.GetI2(); ReadString_Binary(msh.name,reader); msh.name = format(msh.name)<<'_'<<dupes; // skip local axes for the moment reader.IncPtr(48); msh.transform = aiMatrix4x4(); for(unsigned int y = 0; y < 3; ++y) { for(unsigned int x =0; x < 4; ++x) { msh.transform[y][x] = reader.GetF4(); } } }
// ------------------------------------------------------------------------------------------------ void COBImporter::ReadCame_Binary(COB::Scene& out, StreamReaderLE& reader, const ChunkInfo& nfo) { if(nfo.version > 2) { return UnsupportedChunk_Binary(reader,nfo,"Came"); } const chunk_guard cn(nfo,reader); out.nodes.push_back(std::shared_ptr<Camera>(new Camera())); Camera& msh = (Camera&)(*out.nodes.back().get()); msh = nfo; ReadBasicNodeInfo_Binary(msh,reader,nfo); // the rest is not interesting for us, so we skip over it. if(nfo.version > 1) { if (reader.GetI2()==512) { reader.IncPtr(42); } } }
// ------------------------------------------------------------------------------------------------ void COBImporter::ReadMat1_Binary(COB::Scene& out, StreamReaderLE& reader, const ChunkInfo& nfo) { if(nfo.version > 8) { return UnsupportedChunk_Binary(reader,nfo,"Mat1"); } const chunk_guard cn(nfo,reader); out.materials.push_back(Material()); Material& mat = out.materials.back(); mat = nfo; mat.matnum = reader.GetI2(); switch(reader.GetI1()) { case 'f': mat.type = Material::FLAT; break; case 'p': mat.type = Material::PHONG; break; case 'm': mat.type = Material::METAL; break; default: LogError_Ascii(format("Unrecognized shader type in `Mat1` chunk with id ")<<nfo.id); mat.type = Material::FLAT; } switch(reader.GetI1()) { case 'f': mat.autofacet = Material::FACETED; break; case 'a': mat.autofacet = Material::AUTOFACETED; break; case 's': mat.autofacet = Material::SMOOTH; break; default: LogError_Ascii(format("Unrecognized faceting mode in `Mat1` chunk with id ")<<nfo.id); mat.autofacet = Material::FACETED; } mat.autofacet_angle = static_cast<float>(reader.GetI1()); mat.rgb.r = reader.GetF4(); mat.rgb.g = reader.GetF4(); mat.rgb.b = reader.GetF4(); mat.alpha = reader.GetF4(); mat.ka = reader.GetF4(); mat.ks = reader.GetF4(); mat.exp = reader.GetF4(); mat.ior = reader.GetF4(); char id[2]; id[0] = reader.GetI1(),id[1] = reader.GetI1(); if (id[0] == 'e' && id[1] == ':') { mat.tex_env.reset(new Texture()); reader.GetI1(); ReadString_Binary(mat.tex_env->path,reader); // advance to next texture-id id[0] = reader.GetI1(),id[1] = reader.GetI1(); } if (id[0] == 't' && id[1] == ':') { mat.tex_color.reset(new Texture()); reader.GetI1(); ReadString_Binary(mat.tex_color->path,reader); mat.tex_color->transform.mTranslation.x = reader.GetF4(); mat.tex_color->transform.mTranslation.y = reader.GetF4(); mat.tex_color->transform.mScaling.x = reader.GetF4(); mat.tex_color->transform.mScaling.y = reader.GetF4(); // advance to next texture-id id[0] = reader.GetI1(),id[1] = reader.GetI1(); } if (id[0] == 'b' && id[1] == ':') { mat.tex_bump.reset(new Texture()); reader.GetI1(); ReadString_Binary(mat.tex_bump->path,reader); mat.tex_bump->transform.mTranslation.x = reader.GetF4(); mat.tex_bump->transform.mTranslation.y = reader.GetF4(); mat.tex_bump->transform.mScaling.x = reader.GetF4(); mat.tex_bump->transform.mScaling.y = reader.GetF4(); // skip amplitude for I don't know its purpose. reader.GetF4(); } reader.IncPtr(-2); }