tge/lib/dtsSDK/DTSMesh.h
2025-02-17 23:17:30 -06:00

200 lines
6.7 KiB
C++
Executable File

#ifndef __DTSMESH_H
#define __DTSMESH_H
#include "DTSPoint.h"
#include "DTSMatrix.h"
namespace DTS
{
// Forward reference;
class Quaternion;
//! Defines a primitive as stored in the DTS file
struct Primitive
{
short firstElement ; //!< Number of consecutive indices used
short numElements ; //!< Number of the first index
int type ; //!< Type of primitive and number of material used
enum /* type */
{
Triangles = 0x00000000,
Strip = 0x40000000,
Fan = 0x80000000, //!< WARNING! May not be supported
TypeMask = 0xC0000000,
Indexed = 0x20000000, //!< WARNING! Non-indexed primitives not supported in the engine
NoMaterial = 0x10000000,
MaterialMask = 0x0FFFFFFF,
};
};
//! Defines type used by sort meshes (cluster of faces that are rendered together)
struct Cluster
{
int startPrimitive;
int endPrimitive;
Point3D normal;
float k;
int frontCluster; ///< go to this cluster if in front of plane, if frontCluster<0, no cluster
int backCluster; ///< go to this cluster if in back of plane, if backCluster<0, no cluster
///< if frontCluster==backCluster, no plane to test against...
};
//! Defines a Mesh as stored in the DTS file
// Skin render...
// NodeIndex loop
// Vb[n] = nodeTransform[nodeIndex[n]] * InitialTransform[n]
// Vertex loop
// v[vindex[n]] += initialVerts[n] * Vb[boneIndex[n]] * weight[n]
class Mesh
{
friend class ShapeMimic;
friend class TranslucentSort;
public:
//! Mesh types
enum Type
{
T_Standard = 0, //!< Rigid mesh
T_Skin = 1, //!< TODO: Skined (mesh with bones)
T_Decal = 2, //!< DEPRECATED
T_Sorted = 3, //!< BSP Sorted for correct alpha rendering
T_Null = 4 //!< Null mesh, used in collision objects as the visible meshes
};
//!< Mesh flags
enum Flag
{
Billboard = 0x80000000, //!< Mesh always faces the camera
HasDetail = 0x40000000, //!< Mesh use Detailmap, search for Detailmap reference in Material
BillboardZ = 0x20000000, //!< If billboard, only rotate around Z axis
EncodedNormals = 0x10000000, //!< Mesh uses encoded normals
} ;
//! Create an empty mesh of the given type
Mesh (Type t = T_Null) ;
//! Change object type
Type getType() { return (Type)type; }
void setType(Type t) { type = t; }
//! Set mesh flags
void setFlag(int f) { flags |= f; }
//! Save the mesh to a special DTS stream
void save (class OutputStream &) const ;
//! Read the mesh from a special DTS stream
void read (class InputStream &stream) ;
//! Calculates and returns the number of polygons
int getPolyCount() const ;
//! Get the radius of the bounding sphere
float getRadius() const { return radius ; }
//! Get the center point of mesh (and mesh's bounding sphere)
Point getCenter() const { return center ; }
//! Get the bounding box of the mesh
Box getBounds() const { return bounds ; }
//! Get the transformed bounding box of the mesh
Box getBounds(Point, Quaternion) const;
//! Calculate the radius of a bounding sphere, if it is centered in the given point
float getRadiusFrom(Point, Quaternion, Point center) const ;
//! Get the tube radius (radius of bounding cylinder)
float getTubeRadius() const ;
//! Calculate the radius of a bounding cylinder, if it is centered in the given point
float getTubeRadiusFrom(Point, Quaternion, Point center) const ;
//! Joins another mesh with this one (imports all vertexes and triangles)
Mesh & operator += (const Mesh &) ;
//! Change the material of the mesh
void setMaterial(int n) ;
//! Move all the vertexes in a direction
void translate(const Point n) ;
//! Rotates all vertexes
void rotate (const class Quaternion &q) ;
//! Return a vertex bone number for the given node
int getVertexBone(int node);
//! Return the node for a given vertex bone
int getNodeIndexCount() { return nodeIndex.size(); }
int getNodeIndex(int node) {
return (node >= 0 && node < nodeIndex.size())? nodeIndex[node]: -1;
}
void setNodeTransform(int node,Point t, Quaternion q);
protected:
void setCenter(Point c) { center = c; }
void setBounds(Box b) { bounds = b; }
void setRadius(float r) { radius = r; }
void setFrames(int n) { numFrames = n ; vertsPerFrame = verts.size()/n ; }
void setParent(int n) { parent = n; }
protected:
void calculateBounds() ;
void calculateCenter() ;
void calculateRadius() ;
static char encodeNormal(const Point &) ;
std::vector <Point> verts ; //!< Contains all mesh vertexes
std::vector <Point2D> tverts ; //!< Texture coordinates s, t for each vertex
std::vector <Point> normals ; //!< Normals for each vertex
std::vector <char> enormals ; //!< Encoded normals (see encodeNormal)
std::vector <Primitive> primitives; //!< Mesh primitives
std::vector <unsigned short> indices ; //!< Vertex index array, for primitives
std::vector <unsigned short> mindices ; //!< ?
// Extended data used by Skin Meshes
std::vector <int> vindex; //!< Vertex index
std::vector <int> vbone; //!< Vertex vbone
std::vector <float> vweight; //!< Vertex weight
std::vector <int> nodeIndex; //!< vbone -> node
std::vector <Matrix<4,4> > nodeTransform; //!<
// Extended data used by sort Meshes
std::vector <Cluster> clusters; ///< All of the clusters of primitives to be drawn
std::vector <int> startCluster; ///< indexed by frame number
std::vector <int> firstVerts; ///< indexed by frame number
std::vector <int> numVerts; ///< indexed by frame number
std::vector <int> firstTVerts; ///< indexed by frame number or matFrame number, depending on which one animates (never both)
private:
int type ;
int numFrames ;
int matFrames ;
int parent ;
Box bounds ;
Point center ;
float radius ;
int vertsPerFrame ;
int flags ;
};
}
#endif