mirror of
https://github.com/ncblakely/GiantsTools
synced 2024-11-27 08:03:09 +01:00
143 lines
3.8 KiB
C++
143 lines
3.8 KiB
C++
#include "Importer.h"
|
|
|
|
void GbsData::Read(FILE* file)
|
|
{
|
|
DWORD versionHeader;
|
|
fread(&versionHeader, 4, 1, file);
|
|
if (versionHeader != GBS_VERSION)
|
|
{
|
|
throw std::exception("File does not appear to be a GBS file.");
|
|
}
|
|
|
|
fread(&optionsflags, 4, 1, file);
|
|
fread(&naverts, 4, 1, file);
|
|
|
|
averts.resize(naverts);
|
|
for (int i = 0; i < naverts; i++)
|
|
{
|
|
fread(&averts.at(i).x, 4, 1, file);
|
|
fread(&averts.at(i).y, 4, 1, file);
|
|
fread(&averts.at(i).z, 4, 1, file);
|
|
}
|
|
if (FlagIsSet(optionsflags, GBSFlagNormals))
|
|
{
|
|
fread(&nndefs, 4, 1, file);
|
|
fread(&sizendefs, 4, 1, file);
|
|
ndefs.resize(sizendefs);
|
|
|
|
for (uint i = 0; i < sizendefs; i++)
|
|
fread(&ndefs.at(i), 2, 1, file);
|
|
}
|
|
|
|
fread(&nverts, 4, 1, file);
|
|
iverts.resize(nverts);
|
|
for (int i = 0; i < nverts; i++)
|
|
fread(&iverts.at(i), 2, 1, file);
|
|
|
|
if (FlagIsSet(optionsflags, GBSFlagNormals))
|
|
{
|
|
inorms.resize(nverts);
|
|
for (int i = 0; i < nverts; i++)
|
|
fread(&inorms.at(i), 2, 1, file);
|
|
}
|
|
|
|
if (FlagIsSet(optionsflags, GBSFlagUVs))
|
|
{
|
|
vertuv.resize(nverts);
|
|
for (int i = 0; i < nverts; i++)
|
|
{
|
|
fread(&vertuv.at(i).u, 4, 1, file);
|
|
fread(&vertuv.at(i).v, 4, 1, file);
|
|
vertuv.at(i).v = vertuv.at(i).v + 1.0f;
|
|
}
|
|
}
|
|
|
|
if (FlagIsSet(optionsflags, GBSFlagRGBs))
|
|
{
|
|
vertrgb.resize(nverts);
|
|
for (int i = 0; i < nverts; i++)
|
|
{
|
|
fread(&vertrgb.at(i).r, 1, 1, file);
|
|
fread(&vertrgb.at(i).g, 1, 1, file);
|
|
fread(&vertrgb.at(i).b, 1, 1, file);
|
|
}
|
|
}
|
|
|
|
// Get number of max objects
|
|
fread(&nmobjs, 4, 1, file);
|
|
MaxObjs.resize(nmobjs);
|
|
for (auto& maxObj : MaxObjs)
|
|
{
|
|
FileMaxObj fileMaxObj;
|
|
fread(&fileMaxObj, sizeof(FileMaxObj), 1, file);
|
|
|
|
maxObj.vstart = fileMaxObj.vstart;
|
|
maxObj.vcount = fileMaxObj.vcount;
|
|
maxObj.nstart = fileMaxObj.nstart;
|
|
maxObj.ncount = fileMaxObj.ncount;
|
|
maxObj.noffset = fileMaxObj.noffset;
|
|
maxObj.fstart = 0;
|
|
maxObj.fcount = 0;
|
|
maxObj.sostart = 0;
|
|
maxObj.socount = 0;
|
|
}
|
|
|
|
VerifyMaxObjs();
|
|
|
|
// Get number of subobjects
|
|
fread(&nsobjs, 4, 1, file);
|
|
|
|
SubObjs.resize(nsobjs);
|
|
for (int ns = 0; ns < nsobjs; ns++)
|
|
{
|
|
SubObject& object = SubObjs.at(ns);
|
|
fread(&object.objname, sizeof(object.objname), 1, file);
|
|
fread(&object.maxobjindex, 4, 1, file);
|
|
fread(&object.totaltris, 4, 1, file);
|
|
fread(&object.ntris, 4, 1, file);
|
|
|
|
assert((object.ntris - 1) / 3 == object.totaltris);
|
|
|
|
object.tridata.resize(object.ntris + 1);
|
|
fread(object.tridata.data(), sizeof(unsigned short) * object.ntris, 1, file);
|
|
|
|
fread(&object.vstart, 4, 1, file);
|
|
fread(&object.vcount, 4, 1, file);
|
|
if (FlagIsSet(optionsflags, GBSFlagUVs))
|
|
{
|
|
fread(&object.texname, 1, 32, file);
|
|
fread(&object.texname2, 1, 32, file);
|
|
}
|
|
fread(&object.falloff, 4, 1, file);
|
|
|
|
if (FlagIsSet(optionsflags, GBSFlagRGBs))
|
|
fread(&object.blend, 4, 1, file);
|
|
|
|
fread(&object.flags, 4, 1, file);
|
|
fread(&object.emissive, 1, 4, file);
|
|
fread(&object.ambient, 1, 4, file);
|
|
fread(&object.diffuse, 1, 4, file);
|
|
fread(&object.specular, 1, 4, file);
|
|
fread(&object.power, 4, 1, file);
|
|
|
|
MaxObj& maxobj = MaxObjs.at(object.maxobjindex);
|
|
maxobj.fcount += object.totaltris;
|
|
if (!maxobj.socount)
|
|
{
|
|
maxobj.sostart = ns;
|
|
}
|
|
maxobj.socount++;
|
|
}
|
|
}
|
|
|
|
bool GbsData::VerifyMaxObjs()
|
|
{
|
|
int nmcount = 0;
|
|
for (const auto& maxObj : MaxObjs)
|
|
{
|
|
nmcount += maxObj.vcount;
|
|
}
|
|
|
|
assert(nmcount == naverts);
|
|
return nmcount == naverts;
|
|
} |