diff --git a/code/BlenderDNA.inl b/code/BlenderDNA.inl index 6a73f15a2..bcfa7ed8d 100644 --- a/code/BlenderDNA.inl +++ b/code/BlenderDNA.inl @@ -530,23 +530,18 @@ template inline void ConvertDispatcher(T& out, const Structure& in, { if (in.name == "int") { out = static_cast_silent()(db.reader->GetU4()); - //db.reader->IncPtr(-4); } else if (in.name == "short") { out = static_cast_silent()(db.reader->GetU2()); - //db.reader->IncPtr(-2); } else if (in.name == "char") { out = static_cast_silent()(db.reader->GetU1()); - //db.reader->IncPtr(-1); } else if (in.name == "float") { out = static_cast(db.reader->GetF4()); - //db.reader->IncPtr(-4); } else if (in.name == "double") { out = static_cast(db.reader->GetF8()); - //db.reader->IncPtr(-8); } else { throw DeadlyImportError("Unknown source for conversion to primitive data type: "+in.name); @@ -562,6 +557,17 @@ template <> inline void Structure :: Convert (int& dest,const FileDataba // ------------------------------------------------------------------------------------------------ template <> inline void Structure :: Convert (short& dest,const FileDatabase& db) const { + // automatic rescaling from short to float and vice versa (seems to be used by normals) + if (name == "float") { + dest = static_cast(db.reader->GetF4() * 32767.f); + //db.reader->IncPtr(-4); + return; + } + else if (name == "double") { + dest = static_cast(db.reader->GetF8() * 32767.); + //db.reader->IncPtr(-8); + return; + } ConvertDispatcher(dest,*this,db); } @@ -571,12 +577,10 @@ template <> inline void Structure :: Convert (char& dest,const FileDatab // automatic rescaling from char to float and vice versa (seems useful for RGB colors) if (name == "float") { dest = static_cast(db.reader->GetF4() * 255.f); - //db.reader->IncPtr(-4); return; } else if (name == "double") { dest = static_cast(db.reader->GetF8() * 255.f); - //db.reader->IncPtr(-8); return; } ConvertDispatcher(dest,*this,db); @@ -588,7 +592,11 @@ template <> inline void Structure :: Convert (float& dest,const FileData // automatic rescaling from char to float and vice versa (seems useful for RGB colors) if (name == "char") { dest = db.reader->GetI1() / 255.f; - //db.reader->IncPtr(-1); + return; + } + // automatic rescaling from short to float and vice versa (used by normals) + else if (name == "short") { + dest = db.reader->GetI2() / 32767.f; return; } ConvertDispatcher(dest,*this,db); @@ -598,8 +606,11 @@ template <> inline void Structure :: Convert (float& dest,const FileData template <> inline void Structure :: Convert (double& dest,const FileDatabase& db) const { if (name == "char") { - dest = db.reader->GetI1() / 255.f; - //db.reader->IncPtr(-1); + dest = db.reader->GetI1() / 255.; + return; + } + else if (name == "short") { + dest = db.reader->GetI2() / 32767.; return; } ConvertDispatcher(dest,*this,db); diff --git a/code/BlenderModifier.cpp b/code/BlenderModifier.cpp index b0fa255db..54366b4c4 100644 --- a/code/BlenderModifier.cpp +++ b/code/BlenderModifier.cpp @@ -185,6 +185,8 @@ void BlenderModifier_Mirror :: DoIt(aiNode& out, ConversionData& conv_data, co const MirrorModifierData& mir = static_cast(orig_modifier); ai_assert(mir.modifier.type == ModifierData::eModifierType_Mirror); + // XXX not entirely correct, mirroring on two axes results in 4 distinct objects in blender ... + // take all input meshes and clone them for (unsigned int i = 0; i < out.mNumMeshes; ++i) { aiMesh* mesh;