#include "lod_info.hpp" #include "read_helpers.hpp" namespace ace { namespace p3d { lod::lod() {} lod::lod(std::istream & stream_, uint32_t id_, uint32_t version = 68) : id(id_) { uint32_t temp_count; // proxies stream_.read((char *)&temp_count, sizeof(uint32_t)); assert(temp_count < 4096 * 10); for (int x = 0; x < temp_count; x++) { proxies.push_back(std::make_shared(stream_, version)); } LOG(DEBUG) << "Found Proxies:"; for (auto & proxy : proxies) { LOG(DEBUG) << "\t" << proxy->name; } compressed item(stream_, false, false); items.resize(item.data.size()); std::copy(item.data.begin(), item.data.end(), items.begin()); // bone links stream_.read((char *)&temp_count, sizeof(uint32_t)); assert(temp_count < 4096 * 10); for (int x = 0; x < temp_count; x++) { // @ TODO: BoneLInks uint32_t link_count; std::vector links; stream_.read((char *)&link_count, sizeof(uint32_t)); for (int x = 0; x < link_count; x++) { uint32_t val; stream_.read((char *)&val, sizeof(uint32_t)); links.push_back(val); } bone_links.push_back(links); } stream_.read((char *)&point_count, sizeof(uint32_t)); stream_.read((char *)&u_float_1, sizeof(float)); // Derp, this was only TOH apparently!? //point_flags = compressed(stream_, true, true, version); stream_.read((char *)&u_float_2, sizeof(float)); stream_.read((char *)&u_float_3, sizeof(float)); min_pos = ace::vector3(stream_); max_pos = ace::vector3(stream_); autocenter_pos = ace::vector3(stream_); stream_.read((char *)&sphere, sizeof(float)); // Texture strings stream_.read((char *)&temp_count, sizeof(uint32_t)); for (int x = 0; x < temp_count; x++) { std::string temp; READ_STRING(temp); textures.push_back(temp); LOG(DEBUG) << "Found texture: " << temp << " pos: " << stream_.tellg(); } //Materials stream_.read((char *)&temp_count, sizeof(uint32_t)); for (int x = 0; x < temp_count; x++) { materials.push_back(std::make_shared(stream_, version)); } edges.mlod = compressed(stream_, true, false, version).data; edges.vertex = compressed(stream_, true, false, version).data; // @TODO: THIS IS OFF WTF?! // The first face is coming up null, so we missed something // Faces magic stream_.read((char *)&temp_count, sizeof(uint32_t)); stream_.read((char *)&faces_allocation_size, sizeof(uint32_t)); // WTF IS GOING ON!? stream_.seekg(2, stream_.cur); for (int x = 0; x < temp_count; x++) { faces.push_back(std::make_shared(stream_, version)); } // Sections stream_.read((char *)&temp_count, sizeof(uint32_t)); for (int x = 0; x < temp_count; x++) { sections.push_back(std::make_shared
(stream_, version)); } stream_.read((char *)&temp_count, sizeof(uint32_t)); for (int x = 0; x < temp_count; x++) { selections.push_back(std::make_shared(stream_, version)); } // named properties LOG(DEBUG) << "Loaded properties"; stream_.read((char *)&temp_count, sizeof(uint32_t)); for (int x = 0; x < temp_count; x++) { std::string key, value; READ_STRING(key); READ_STRING(value); named_properties[key] = value; LOG(DEBUG) << "\t\t" << key << "->" << value; } stream_.read((char *)&temp_count, sizeof(uint32_t)); for (int x = 0; x < temp_count; x++) { frames.push_back(std::make_shared(stream_, version)); } stream_.read((char *)&icon_color, sizeof(uint32_t)); stream_.read((char *)&selected_color, sizeof(uint32_t)); stream_.read((char *)&u_residue, sizeof(uint32_t)); stream_.read((char *)&u_byte_1, sizeof(uint8_t)); stream_.read((char *)&temp_count, sizeof(uint32_t)); // Vertex Table starts here vertices = std::make_shared(stream_, temp_count, version); } lod::~lod() {} uv::uv() {} uv::uv(std::istream &stream_, uint32_t version = 68) { stream_.read((char *)&uv_scale, sizeof(float) * 4); data = compressed(stream_, true, true, version); } c_vertex_table::c_vertex_table() {} c_vertex_table::c_vertex_table(std::istream &stream_, uint32_t size_, uint32_t version = 68) : size(size_) { uint32_t temp_count; point_flags = compressed(stream_, true, true, version); uvsets.push_back(std::make_shared(stream_, version)); // UV optionala additional sets stream_.read((char *)&temp_count, sizeof(uint32_t)); for (int x = 0; x < temp_count-1; x++) { uvsets.push_back(std::make_shared(stream_, version)); } points = compressed>(stream_, true, false, false, version); size = points.size; } named_selection::named_selection() {} named_selection::named_selection(std::istream &stream_, uint32_t version = 68) { uint32_t count; uint32_t junk; READ_STRING(name); faces = compressed(stream_, true, false, version); //face_weights = compressed(stream_, true, false, version); // Face weights face_weights = compressed(stream_, true, false, version); READ_BOOL(is_sectional); sections = compressed(stream_, true, false, version); vertex_table = compressed(stream_, true, false, version); texture_weights = compressed(stream_, true, false, version); //stream_.read((char *)&junk, 4); } section::section() {} section::section(std::istream &stream_, uint32_t version = 68) { stream_.read((char *)&face_offsets, sizeof(uint32_t) * 2); stream_.read((char *)&material_offsets, sizeof(uint32_t) * 2); stream_.read((char *)&common_points_user_value, sizeof(uint32_t)); stream_.read((char *)&common_texture, sizeof(uint16_t)); stream_.read((char *)&common_face_flags, sizeof(uint32_t)); stream_.read((char *)&material_index, sizeof(int32_t)); if (material_index == -1) { stream_.read((char *)&extra, sizeof(uint8_t)); } if(version >= 68) stream_.read((char *)&u_long_2, sizeof(uint32_t)); stream_.read((char *)&u_long_1, sizeof(uint32_t)); stream_.read((char *)&u_float_resolution_1, sizeof(float)); stream_.read((char *)&u_float_resolution_2, sizeof(float)); } face::face() { } face::face(std::istream & stream_, uint32_t version = 68) { stream_.read((char *)&type, sizeof(uint8_t)); assert(type == 3 || type == 4); for (int x = 0; x < type; x++) { uint16_t val; stream_.read((char *)&val, sizeof(uint16_t)); vertex_table.push_back(val); } } uint32_t flags; //ODOL7 ONLY see P3D Point and Face Flags uint16_t texture; //ODOL7 ONLY uint8_t type; // 3==Triangle or 4==Box std::vector vertex_table; stage_texture::stage_texture() : file(""), filter(0), transform_id(0) { } stage_texture::stage_texture(std::istream &stream_, uint32_t type_) { stream_.read((char *)&filter, sizeof(uint32_t)); READ_STRING(file); stream_.read((char *)&transform_id, sizeof(uint32_t)); if (type_ == 11) { READ_BOOL(wtf); } } material::material() { } material::material(std::istream &stream_, uint32_t version = 68) { uint32_t textures_count, transforms_count; READ_STRING(name); stream_.read((char *)&type, sizeof(uint32_t)); stream_.read((char *)&emissive, sizeof(float) * 4); stream_.read((char *)&ambient, sizeof(float) * 4); stream_.read((char *)&diffuse, sizeof(float) * 4); stream_.read((char *)&forced_diffuse, sizeof(float) * 4); stream_.read((char *)&specular, sizeof(float) * 4); stream_.read((char *)&specular_2, sizeof(float) * 4); stream_.read((char *)&specular_power, sizeof(float)); stream_.read((char *)&pixel_shader, sizeof(uint32_t)); stream_.read((char *)&vertex_shader, sizeof(uint32_t)); stream_.read((char *)&u_long_1, sizeof(uint32_t)); stream_.read((char *)&an_index, sizeof(uint32_t)); stream_.read((char *)&u_long_2, sizeof(uint32_t)); READ_STRING(surface); stream_.read((char *)&u_long_3, sizeof(uint32_t)); stream_.read((char *)&render_flags, sizeof(uint32_t)); stream_.read((char *)&textures_count, sizeof(uint32_t)); stream_.read((char *)&transforms_count, sizeof(uint32_t)); for (int x = 0; x < textures_count; x++) { texture_stages.push_back(std::make_shared(stream_, type)); } for (int x = 0; x < textures_count; x++) { uint32_t uv_source; stream_.read((char *)&uv_source, sizeof(uint32_t)); transform_stages.push_back(std::pair(uv_source, transform_matrix(stream_))); } if (type >= 10) { texture_stages.push_back(std::make_shared(stream_, type)); } } frame::frame() {} frame::frame(std::istream &stream_, uint32_t version = 68) { uint32_t count; stream_.read((char *)&time, sizeof(float)); stream_.read((char *)&count, sizeof(uint32_t)); for (int x = 0; x < count; x++) { bone_positions.push_back(ace::vector3(stream_)); } } proxy::proxy() { } proxy::proxy(std::istream &stream_, uint32_t version = 68) { READ_STRING(name); transform = ace::transform_matrix(stream_); stream_.read((char *)&sequence_id, sizeof(uint32_t)); stream_.read((char *)&named_selection_id, sizeof(uint32_t)); stream_.read((char *)&bone_id, sizeof(uint32_t)); stream_.read((char *)§ion_id, sizeof(uint32_t)); LOG(DEBUG) << "Proxy: [" << name << "]"; } } }