mirror of
https://github.com/ncblakely/GiantsTools
synced 2024-11-27 08:03:09 +01:00
126 lines
3.2 KiB
C++
126 lines
3.2 KiB
C++
#include "Gb2Importer.h"
|
|
#include "StdUtil.h"
|
|
|
|
void Gb2Importer::ImportFile(const MCHAR* name, ImpInterface* ii, Interface* i, BOOL suppressPrompts)
|
|
{
|
|
ReadGb2File(name);
|
|
|
|
BuildMeshes(ii);
|
|
ii->RedrawViews();
|
|
}
|
|
|
|
|
|
void Gb2Importer::ReadGb2File(const MCHAR* Name)
|
|
{
|
|
FILE* file = nullptr;
|
|
try
|
|
{
|
|
errno_t err = _tfopen_s(&file, Name, (_T("rb")));
|
|
if (err != 0)
|
|
{
|
|
throw std::exception("Could not open input file.");
|
|
}
|
|
|
|
// Read object into memory
|
|
m_gb2Data.Read(file);
|
|
|
|
fclose(file);
|
|
}
|
|
catch (const std::exception& e)
|
|
{
|
|
if (file)
|
|
fclose(file);
|
|
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
void Gb2Importer::BuildMeshes(ImpInterface* ii)
|
|
{
|
|
for (auto& obj : this->m_gb2Data.objdata)
|
|
{
|
|
assert(obj.ntris > 0);
|
|
assert(obj.nverts > 0);
|
|
|
|
Mesh mesh;
|
|
mesh.setNumVerts(obj.nverts);
|
|
mesh.setNumTVerts(obj.nverts);
|
|
mesh.setNumVertCol(obj.nverts);
|
|
mesh.setNumFaces(obj.ntris);
|
|
mesh.setNumTVFaces(obj.ntris);
|
|
mesh.setNumVCFaces(obj.ntris);
|
|
|
|
for (int i = 0; i < obj.nverts; i++)
|
|
{
|
|
Point3 point(obj.verts[i].x, obj.verts[i].y, obj.verts[i].z);
|
|
mesh.setVert(i, point);
|
|
|
|
const UV& uv = obj.vertuv.at(i);
|
|
mesh.setTVert(i, UVVert(uv.u, uv.v, 0.0f));
|
|
}
|
|
|
|
int faceIndex = 0;
|
|
for (int i = 0; i < obj.tris.size(); i += 3)
|
|
{
|
|
int v0 = obj.tris.at(i);
|
|
int v1 = obj.tris.at(i + 1);
|
|
int v2 = obj.tris.at(i + 2);
|
|
|
|
// Create faces
|
|
Face& face = mesh.faces[faceIndex];
|
|
face.setVerts(v0, v1, v2);
|
|
face.setEdgeVisFlags(EDGE_VIS, EDGE_VIS, EDGE_VIS);
|
|
|
|
// Set per-vertex coloring (appears to be unused by game)
|
|
TVFace& vcFace = mesh.vcFace[faceIndex];
|
|
vcFace.setTVerts(v0, v1, v2);
|
|
|
|
// Set textured (UV) vertices
|
|
TVFace& tvFace = mesh.tvFace[faceIndex];
|
|
tvFace.setTVerts(v0, v1, v2);
|
|
|
|
faceIndex++;
|
|
}
|
|
|
|
mesh.buildNormals();
|
|
mesh.buildBoundingBox();
|
|
mesh.InvalidateEdgeList();
|
|
|
|
TriObject* tri = CreateNewTriObject();
|
|
tri->mesh = mesh;
|
|
Matrix3 tm;
|
|
tm.IdentityMatrix();
|
|
|
|
ImpNode* Node = ii->CreateNode();
|
|
if (!Node)
|
|
{
|
|
throw std::exception("Could not create Node");
|
|
}
|
|
|
|
Mtl* material = BuildMaterial(obj);
|
|
|
|
Node->Reference(tri);
|
|
Node->SetTransform(0, tm);
|
|
ii->AddNodeToScene(Node);
|
|
INode* iNode = Node->GetINode();
|
|
iNode->SetMtl(material);
|
|
Node->SetName(util::to_wstring(obj.name).c_str());
|
|
}
|
|
}
|
|
|
|
Mtl* Gb2Importer::BuildMaterial(SingleObjectData& obj)
|
|
{
|
|
auto bitmapTex = NewDefaultBitmapTex();
|
|
bitmapTex->SetName(util::to_wstring(obj.texname).c_str());
|
|
bitmapTex->SetMapName(util::to_wstring(obj.texname).c_str());
|
|
|
|
StdMat2* stdMat = NewDefaultStdMat();
|
|
stdMat->EnableMap(ID_DI, true);
|
|
if (bitmapTex)
|
|
{
|
|
stdMat->SetSubTexmap(ID_DI, bitmapTex);
|
|
}
|
|
|
|
stdMat->SetName(util::to_wstring(obj.texname).c_str());
|
|
return stdMat;
|
|
} |