Files

149 lines
2.7 KiB
C++
Raw Permalink Normal View History

2019-01-18 21:26:42 +01:00
#pragma once
2019-01-18 15:55:06 +01:00
#include "model.hpp"
2019-01-18 21:26:42 +01:00
#include "geom.hpp"
#include "gxmesh.hpp"
#include <vector>
2014-01-31 08:23:00 +13:00
#define MAX_SURFACE_BONES 4
2019-01-18 17:04:17 +01:00
class Surface {
public:
struct Vertex {
Vector coords;
Vector normal;
unsigned color;
float tex_coords[2][2];
2014-01-31 08:23:00 +13:00
unsigned char bone_bones[MAX_SURFACE_BONES];
2019-01-18 17:04:17 +01:00
float bone_weights[MAX_SURFACE_BONES];
2014-01-31 08:23:00 +13:00
2019-01-18 17:04:17 +01:00
Vertex() : color(~0)
{
bone_bones[0] = 255;
memset(tex_coords, 0, sizeof(tex_coords));
2014-01-31 08:23:00 +13:00
}
2019-01-18 17:04:17 +01:00
bool operator<(const Vertex& t) const
{
return memcmp(this, &t, sizeof(*this)) == -1;
2014-01-31 08:23:00 +13:00
}
};
2019-01-18 17:04:17 +01:00
struct Triangle {
2014-01-31 08:23:00 +13:00
unsigned short verts[3];
};
2019-01-18 17:04:17 +01:00
struct Bone {
2014-01-31 08:23:00 +13:00
Transform coord_tform;
2019-01-18 17:04:17 +01:00
Matrix normal_tform;
2014-01-31 08:23:00 +13:00
};
2019-01-18 17:04:17 +01:00
struct Monitor {
int brush_changes, geom_changes;
2014-01-31 08:23:00 +13:00
};
Surface();
2019-01-18 17:04:17 +01:00
Surface(Monitor* mon);
2014-01-31 08:23:00 +13:00
~Surface();
2019-01-18 21:26:42 +01:00
void setName(const std::string& t);
2019-01-18 17:04:17 +01:00
void setBrush(const Brush& b);
2014-01-31 08:23:00 +13:00
2019-01-18 17:04:17 +01:00
void clear(bool verts, bool tris);
2014-01-31 08:23:00 +13:00
2019-01-18 17:04:17 +01:00
void addVertex(const Vertex& v)
{
2014-01-31 08:23:00 +13:00
vertices.push_back(v);
++mon->geom_changes;
}
2019-01-18 17:04:17 +01:00
void setVertex(int n, const Vertex& v)
{
vertices[n] = v;
if (n < valid_vs)
valid_vs = n;
2014-01-31 08:23:00 +13:00
++mon->geom_changes;
}
2019-01-18 17:04:17 +01:00
void setCoords(int n, const Vector& v)
{
vertices[n].coords = v;
if (n < valid_vs)
valid_vs = n;
2014-01-31 08:23:00 +13:00
++mon->geom_changes;
}
2019-01-18 17:04:17 +01:00
void setNormal(int n, const Vector& v)
{
vertices[n].normal = v;
if (n < valid_vs)
valid_vs = n;
2014-01-31 08:23:00 +13:00
}
2019-01-18 17:04:17 +01:00
void setColor(int n, unsigned argb)
{
vertices[n].color = argb;
if (n < valid_vs)
valid_vs = n;
2014-01-31 08:23:00 +13:00
}
2019-01-18 17:04:17 +01:00
void setTexCoords(int n, const Vector& v, int i)
{
vertices[n].tex_coords[i][0] = v.x;
vertices[n].tex_coords[i][1] = v.y;
if (n < valid_vs)
valid_vs = n;
2014-01-31 08:23:00 +13:00
}
2019-01-18 17:04:17 +01:00
void addTriangle(const Triangle& t)
{
2014-01-31 08:23:00 +13:00
triangles.push_back(t);
++mon->geom_changes;
}
2019-01-18 17:04:17 +01:00
void setTriangle(int n, const Triangle& t)
{
triangles[n] = t;
if (n < valid_ts)
valid_ts = n;
2014-01-31 08:23:00 +13:00
++mon->geom_changes;
}
2019-01-18 17:04:17 +01:00
Vector getColor(int index) const;
void setColor(int index, const Vector& v);
2019-01-18 21:26:42 +01:00
void addVertices(const std::vector<Vertex>& verts);
void addTriangles(const std::vector<Triangle>& tris);
2014-01-31 08:23:00 +13:00
void updateNormals();
2019-01-18 17:04:17 +01:00
gxMesh* getMesh();
2019-01-18 21:26:42 +01:00
gxMesh* getMesh(const std::vector<Bone>& bones);
2019-01-18 17:04:17 +01:00
2019-01-18 21:26:42 +01:00
std::string getName() const
2019-01-18 17:04:17 +01:00
{
return name;
}
const Brush& getBrush() const
{
return brush;
}
int numVertices() const
{
return vertices.size();
}
int numTriangles() const
{
return triangles.size();
}
const Vertex& getVertex(int n) const
{
return vertices[n];
}
const Triangle& getTriangle(int n) const
{
return triangles[n];
}
private:
Brush brush;
2019-01-18 21:26:42 +01:00
std::string name;
2019-01-18 17:04:17 +01:00
gxMesh* mesh;
2019-01-18 21:26:42 +01:00
std::vector<Vertex> vertices;
std::vector<Triangle> triangles;
2019-01-18 17:04:17 +01:00
int mesh_vs, mesh_ts;
int valid_vs, valid_ts;
Monitor* mon;
2014-01-31 08:23:00 +13:00
};