Files
BlitzNext/Runtime/blitz3d/surface.hpp
T

150 lines
2.6 KiB
C++
Raw Normal View History

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