void Mesh::generate_weights (void) { _weights_index_stream.resize(_vertex_stream.size(), WeightsIndex(0, 0, 0, 0)); _weights_strength_stream.resize(_vertex_stream.size(), Vector4(1.0F, 0.0F, 0.0F, 0.0F)); }
DTerr ImporterGeometryTWM::import(GeometryResource *target, std::string args) { FilePath pathname(target->path()); // open the file BinaryFileStream file; FileManager::open(file, pathname, true); // // Read_ in header // DTuint magic; file >> magic; if (magic != MAGIC) { return DT3_ERR_FILE_WRONG_TYPE; } DTuint version; file >> version; // // Read_ in data // _normals_count = 0; _uv_set_0_count = 0; _uv_set_1_count = 0; _weights_count = 0; DTint section,size; file >> section >> size; switch(section) { case FILE: read_file(file, size); break; default: WARNINGMSG("Invalid section"); break; }; // // Build Streams // // Calculate sizes needed DTuint joints_size = 0; for (DTuint i = 0; i < _meshes.size(); ++i) { joints_size += _meshes[i]._joint_names.size(); } // allocate joint names, force first one to always be identity std::vector<std::string> joint_names; joint_names.resize(joints_size); DTuint joint_offset = 0; // Account for identity above for (DTuint i = 0; i < _meshes.size(); ++i) { MeshData &meshdata = _meshes[i]; if (meshdata._vertices.size() == 0) continue; std::shared_ptr<Mesh> mesh = Mesh::create(); // copy joint names for (DTuint j = 0; j < meshdata._joint_names.size(); ++j) { joint_names[joint_offset + j] = meshdata._joint_names[j]; } std::vector<Vector3> vertex_stream; std::vector<Vector3> normals_stream; std::vector<Vector2> uvs_stream_0; std::vector<Vector2> uvs_stream_1; std::vector<Vector4> weights_strength; std::vector<WeightsIndex> weights_index; std::vector<Triangle> indices; vertex_stream = meshdata._vertices; normals_stream = meshdata._normals; uvs_stream_0 = meshdata._uv_sets[0]._uvs; uvs_stream_1 = meshdata._uv_sets[1]._uvs; indices = meshdata._indices; if (meshdata._weights.size()) { weights_index.resize(meshdata._weights.size()); weights_strength.resize(meshdata._weights.size()); for (DTuint j = 0; j < meshdata._weights.size(); ++j) { weights_strength[j] = Vector4( meshdata._weights[j].weight_1(), meshdata._weights[j].weight_2(), meshdata._weights[j].weight_3(), meshdata._weights[j].weight_4() ); weights_index[j] = WeightsIndex( meshdata._weights[j].bone_1(), meshdata._weights[j].bone_2(), meshdata._weights[j].bone_3(), meshdata._weights[j].bone_4() ); } } mesh->set_vertex_stream(vertex_stream); mesh->set_normals_stream(normals_stream); mesh->set_uv_stream0(uvs_stream_0); mesh->set_uv_stream1(uvs_stream_1); mesh->set_index_stream(indices); mesh->set_weights_index_stream(weights_index); mesh->set_weights_strength_stream(weights_strength); // Some stuff we can generate if (normals_stream.size() == 0) mesh->generate_normals(); if (uvs_stream_0.size() != 0) mesh->generate_tangents(); // Add the mesh target->add_mesh(mesh); joint_offset += (DTushort) meshdata._joint_names.size(); } // Build skeleton std::vector<SkeletonJoint> s; build_skeleton(joint_names, _skeleton._joints, s); Skeleton skeleton; skeleton.set_skeleton(s); target->set_skeleton(skeleton); return DT3_ERR_NONE; }