Files
BlitzNext/Runtime/blitz3d/loader.cpp
T

91 lines
1.9 KiB
C++
Raw Normal View History

2014-01-31 08:23:00 +13:00
2019-01-18 15:55:06 +01:00
#include "meshloader.hpp"
#include "meshmodel.hpp"
2019-01-18 17:04:17 +01:00
#include "std.hpp"
2014-01-31 08:23:00 +13:00
2019-01-18 17:04:17 +01:00
struct Surf {
2014-01-31 08:23:00 +13:00
vector<Surface::Triangle> tris;
};
2019-01-18 17:04:17 +01:00
static map<Brush, Surf*> brush_map;
2014-01-31 08:23:00 +13:00
static vector<Surface::Vertex> verts;
2019-01-18 17:04:17 +01:00
void MeshLoader::clear()
{
map<Brush, Surf*>::const_iterator it;
for (it = brush_map.begin(); it != brush_map.end(); ++it) {
2014-01-31 08:23:00 +13:00
delete it->second;
}
brush_map.clear();
verts.clear();
}
2019-01-18 17:04:17 +01:00
int MeshLoader::numVertices()
{
2014-01-31 08:23:00 +13:00
return verts.size();
}
2019-01-18 17:04:17 +01:00
void MeshLoader::addVertex(const Surface::Vertex& v)
{
verts.push_back(v);
2014-01-31 08:23:00 +13:00
}
2019-01-18 17:04:17 +01:00
Surface::Vertex& refVertex(int n)
{
2014-01-31 08:23:00 +13:00
return verts[n];
}
2019-01-18 17:04:17 +01:00
void MeshLoader::addTriangle(const int verts[3], const Brush& b)
{
addTriangle(verts[0], verts[1], verts[2], b);
2014-01-31 08:23:00 +13:00
}
2019-01-18 17:04:17 +01:00
void MeshLoader::addTriangle(int v0, int v1, int v2, const Brush& b)
{
2014-01-31 08:23:00 +13:00
//find surface
2019-01-18 17:04:17 +01:00
Surf* surf;
map<Brush, Surf*>::const_iterator it = brush_map.find(b);
if (it != brush_map.end())
surf = it->second;
else {
surf = d_new Surf;
brush_map.insert(make_pair(b, surf));
2014-01-31 08:23:00 +13:00
}
Surface::Triangle tri;
2019-01-18 17:04:17 +01:00
tri.verts[0] = v0;
tri.verts[1] = v1;
tri.verts[2] = v2;
surf->tris.push_back(tri);
2014-01-31 08:23:00 +13:00
}
2019-01-18 17:04:17 +01:00
void MeshLoader::updateMesh(MeshModel* mesh)
{
map<int, int> vert_map;
map<Brush, Surf*>::iterator it;
for (it = brush_map.begin(); it != brush_map.end(); ++it) {
2014-01-31 08:23:00 +13:00
vert_map.clear();
2019-01-18 17:04:17 +01:00
Brush b = it->first;
Surf* t = it->second;
Surface* surf = mesh->findSurface(b);
if (!surf)
surf = mesh->createSurface(b);
for (int k = 0; k < t->tris.size(); ++k) {
for (int j = 0; j < 3; ++j) {
int n = t->tris[k].verts[j], id;
map<int, int>::const_iterator it = vert_map.find(n);
if (it != vert_map.end())
id = it->second;
else {
id = surf->numVertices();
surf->addVertex(verts[n]);
vert_map.insert(make_pair(n, id));
2014-01-31 08:23:00 +13:00
}
2019-01-18 17:04:17 +01:00
t->tris[k].verts[j] = id;
2014-01-31 08:23:00 +13:00
}
2019-01-18 17:04:17 +01:00
surf->addTriangle(t->tris[k]);
2014-01-31 08:23:00 +13:00
}
}
clear();
}