You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openmw-tes3mp/components/nif/niffile.hpp

101 lines
2.5 KiB
C++

///Main header for reading .nif files
#ifndef OPENMW_COMPONENTS_NIF_NIFFILE_HPP
#define OPENMW_COMPONENTS_NIF_NIFFILE_HPP
#include <stdexcept>
#include <vector>
#include <iostream>
#include <components/files/constrainedfilestream.hpp>
#include "record.hpp"
namespace Nif
{
class NIFFile
{
enum NIFVersion {
VER_MW = 0x04000002 // Morrowind NIFs
};
/// Nif file version
unsigned int ver;
/// File name, used for error messages and opening the file
std::string filename;
/// Record list
std::vector<Record*> records;
/// Root list. This is a select portion of the pointers from records
std::vector<Record*> roots;
bool mUseSkinning;
/// Parse the file
void parse(Files::IStreamPtr stream);
/// Get the file's version in a human readable form
///\returns A string containing a human readable NIF version number
std::string printVersion(unsigned int version);
///Private Copy Constructor
NIFFile (NIFFile const &);
///\overload
void operator = (NIFFile const &);
public:
/// Used if file parsing fails
void fail(const std::string &msg) const
{
std::string err = " NIFFile Error: " + msg;
err += "\nFile: " + filename;
throw std::runtime_error(err);
}
/// Used when something goes wrong, but not catastrophically so
void warn(const std::string &msg) const
{
std::cerr << " NIFFile Warning: " << msg <<std::endl
<< "File: " << filename <<std::endl;
}
/// Open a NIF stream. The name is used for error messages.
NIFFile(Files::IStreamPtr stream, const std::string &name);
~NIFFile();
/// Get a given record
Record *getRecord(size_t index) const
{
Record *res = records.at(index);
return res;
}
/// Number of records
size_t numRecords() const { return records.size(); }
/// Get a given root
Record *getRoot(size_t index=0) const
{
Record *res = roots.at(index);
return res;
}
/// Number of roots
size_t numRoots() const { return roots.size(); }
/// Set whether there is skinning contained in this NIF file.
/// @note This is just a hint for users of the NIF file and has no effect on the loading procedure.
void setUseSkinning(bool skinning);
bool getUseSkinning() const;
/// Get the name of the file
std::string getFilename() const { return filename; }
};
typedef std::shared_ptr<const Nif::NIFFile> NIFFilePtr;
} // Namespace
#endif