2014-01-31 08:23:00 +13:00
|
|
|
|
|
|
|
|
#ifndef SURFACE_H
|
|
|
|
|
#define SURFACE_H
|
|
|
|
|
|
2019-01-18 15:55:06 +01:00
|
|
|
#include "model.hpp"
|
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 17:04:17 +01:00
|
|
|
void setName(const string& t);
|
|
|
|
|
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);
|
|
|
|
|
void addVertices(const vector<Vertex>& verts);
|
|
|
|
|
void addTriangles(const vector<Triangle>& tris);
|
2014-01-31 08:23:00 +13:00
|
|
|
|
|
|
|
|
void updateNormals();
|
|
|
|
|
|
2019-01-18 17:04:17 +01:00
|
|
|
gxMesh* getMesh();
|
|
|
|
|
gxMesh* getMesh(const vector<Bone>& bones);
|
|
|
|
|
|
|
|
|
|
string getName() const
|
|
|
|
|
{
|
|
|
|
|
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;
|
|
|
|
|
string name;
|
|
|
|
|
gxMesh* mesh;
|
|
|
|
|
vector<Vertex> vertices;
|
2014-01-31 08:23:00 +13:00
|
|
|
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
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif
|