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.
101 lines
2.5 KiB
C++
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
|