+aliaslayer_t;
+
+// indicates this skin is transparent
+#define ALIASSKIN_TRANSPARENT 1
+
+typedef struct aliasskin_s
+{
+ int flags;
+ int num_layers;
+ aliaslayer_t *data_layers;
+}
+aliasskin_t;
+
+typedef struct aliasvertexboneweight_s
+{
+ unsigned int vertexindex;
+ unsigned int boneindex;
+ float origin[3];
+ float weight;
+}
+aliasvertexboneweight_t;
+
+typedef struct aliasmesh_s
+{
+ // skins to choose from (indexed by entity skin)
+ int num_skins;
+ aliasskin_t *data_skins;
+
+ // triangles comprising the mesh
+ int num_triangles;
+ int *data_element3i;
+ int *data_neighbor3i;
+
+ // skin texcoords do not change
+ int num_vertices;
+ float *data_texcoord2f;
+
+ // morph blending, these are zero if model is skeletal
+ int num_morphframes;
+ float *data_morphvertex3f;
+
+ // base frame (frame zero typically)
+ // since most models do not animate, caching the base frame helps
+ float *data_basevertex3f;
+ float *data_basesvector3f;
+ float *data_basetvector3f;
+ float *data_basenormal3f;
+
+ // skeletal blending, these are zero if model is morph
+ int num_vertexboneweights;
+ aliasvertexboneweight_t *data_vertexboneweights;
+}
+aliasmesh_t;
+
+typedef struct aliastag_s
+{
+ char name[MD3NAME];
+ matrix4x4_t matrix;
+}
+aliastag_t;
+
+typedef struct aliasbone_s
+{
+ char name[MD3NAME];
+ int flags;
+ int parent; // -1 for no parent
+}
+aliasbone_t;
+
+struct frameblend_s;
+void Mod_Alias_GetMesh_Vertex3f(const struct model_s *model, const struct frameblend_s *frameblend, const struct aliasmesh_s *mesh, float *out3f);