void BinaryConverter::LoadMaterials(Serializer::Reader &rd) { for (Uint32 numMats = rd.Int32(); numMats > 0; numMats--) { MaterialDefinition m(""); m.name = rd.String(); m.tex_diff = rd.String(); m.tex_spec = rd.String(); m.tex_glow = rd.String(); m.tex_ambi = rd.String(); m.tex_norm = rd.String(); m.diffuse = rd.Color4UB(); m.specular = rd.Color4UB(); m.ambient = rd.Color4UB(); m.emissive = rd.Color4UB(); m.shininess = rd.Int16(); m.opacity = rd.Int16(); m.alpha_test = rd.Bool(); m.unlit = rd.Bool(); m.use_pattern = rd.Bool(); if (m.use_pattern) m_patternsUsed = true; ConvertMaterialDefinition(m); } }
GeomTree::GeomTree(Serializer::Reader &rd) { m_numVertices = rd.Int32(); m_numEdges = rd.Int32(); m_numTris = rd.Int32(); m_radius = rd.Double(); m_aabb.max = rd.Vector3d(); m_aabb.min = rd.Vector3d(); m_aabb.radius = rd.Double(); const Uint32 numAabbs = rd.Int32(); m_aabbs.resize(numAabbs); for (Uint32 iAabb = 0; iAabb < numAabbs; ++iAabb) { m_aabbs[iAabb].max = rd.Vector3d(); m_aabbs[iAabb].min = rd.Vector3d(); m_aabbs[iAabb].radius = rd.Double(); } m_edges.resize(m_numEdges); for (Sint32 iEdge = 0; iEdge < m_numEdges; ++iEdge) { m_edges[iEdge].Load(rd); } m_vertices.resize(m_numVertices); for (Sint32 iVert = 0; iVert < m_numVertices; ++iVert) { m_vertices[iVert] = rd.Vector3f(); } const int numIndicies(m_numTris * 3); m_indices.resize(numIndicies); for (Sint32 iIndi = 0; iIndi < numIndicies; ++iIndi) { m_indices[iIndi] = rd.Int16(); } m_triFlags.resize(m_numTris); for (Sint32 iTri = 0; iTri < m_numTris; ++iTri) { m_triFlags[iTri] = rd.Int32(); } // activeTris = tris we are still trying to put into leaves std::vector<int> activeTris; activeTris.reserve(m_numTris); // So, we ignore tris with flag >= 0x8000 for (int i = 0; i<m_numTris; i++) { if (m_triFlags[i] >= IGNORE_FLAG) continue; activeTris.push_back(i * 3); } // regenerate the aabb data Aabb *aabbs = new Aabb[activeTris.size()]; for (unsigned int i = 0; i<activeTris.size(); i++) { const vector3d v1 = vector3d(m_vertices[m_indices[activeTris[i] + 0]]); const vector3d v2 = vector3d(m_vertices[m_indices[activeTris[i] + 1]]); const vector3d v3 = vector3d(m_vertices[m_indices[activeTris[i] + 2]]); aabbs[i].min = aabbs[i].max = v1; aabbs[i].Update(v2); aabbs[i].Update(v3); } m_triTree.reset(new BVHTree(activeTris.size(), &activeTris[0], aabbs)); delete[] aabbs; // int *edgeIdxs = new int[m_numEdges]; memset(edgeIdxs, 0, sizeof(int)*m_numEdges); for (int i = 0; i<m_numEdges; i++) { edgeIdxs[i] = i; } m_edgeTree.reset(new BVHTree(m_numEdges, edgeIdxs, &m_aabbs[0])); }