ld33_umonster

annotate src/mesh.h @ 5:1e8d90aeae34

added Mesh::texcoord_gen_cylinder()
author John Tsiombikas <nuclear@member.fsf.org>
date Sun, 23 Aug 2015 04:45:24 +0300
parents 35349df5392d
children
rev   line source
nuclear@0 1 #ifndef MESH_H_
nuclear@0 2 #define MESH_H_
nuclear@0 3
nuclear@2 4 #include <stdio.h>
nuclear@0 5 #include <string>
nuclear@0 6 #include <vector>
nuclear@0 7 #include "vmath/vmath.h"
nuclear@0 8 #include "geom.h"
nuclear@0 9
nuclear@0 10 enum {
nuclear@0 11 MESH_ATTR_VERTEX,
nuclear@0 12 MESH_ATTR_NORMAL,
nuclear@0 13 MESH_ATTR_TANGENT,
nuclear@0 14 MESH_ATTR_TEXCOORD,
nuclear@0 15 MESH_ATTR_COLOR,
nuclear@0 16 MESH_ATTR_BONEWEIGHTS,
nuclear@0 17 MESH_ATTR_BONEIDX,
nuclear@0 18
nuclear@0 19 NUM_MESH_ATTR
nuclear@0 20 };
nuclear@0 21
nuclear@0 22 // intersection mode flags
nuclear@0 23 enum {
nuclear@0 24 ISECT_DEFAULT = 0, // default (whole mesh, all intersections)
nuclear@0 25 ISECT_FRONT = 1, // front-faces only
nuclear@0 26 ISECT_FACE = 2, // return intersected face pointer instead of mesh
nuclear@0 27 ISECT_VERTICES = 4 // return (?) TODO
nuclear@0 28 };
nuclear@0 29
nuclear@0 30 //class XFormNode;
nuclear@0 31
nuclear@0 32
nuclear@0 33 class Triangle {
nuclear@0 34 public:
nuclear@0 35 Vector3 v[3];
nuclear@0 36 Vector3 normal;
nuclear@0 37 bool normal_valid;
nuclear@0 38 int id;
nuclear@0 39
nuclear@0 40 Triangle();
nuclear@0 41 Triangle(const Vector3 &v0, const Vector3 &v1, const Vector3 &v2);
nuclear@0 42 Triangle(int n, const Vector3 *varr, const unsigned int *idxarr = 0);
nuclear@0 43
nuclear@0 44 /// calculate normal (quite expensive)
nuclear@0 45 void calc_normal();
nuclear@0 46 const Vector3 &get_normal() const;
nuclear@0 47
nuclear@0 48 void transform(const Matrix4x4 &xform);
nuclear@0 49
nuclear@0 50 void draw() const;
nuclear@0 51 void draw_wire() const;
nuclear@0 52
nuclear@0 53 /// calculate barycentric coordinates of a point
nuclear@0 54 Vector3 calc_barycentric(const Vector3 &pos) const;
nuclear@0 55
nuclear@0 56 bool intersect(const Ray &ray, HitPoint *hit = 0) const;
nuclear@0 57 };
nuclear@0 58
nuclear@0 59
nuclear@0 60 class Mesh {
nuclear@0 61 private:
nuclear@0 62 std::string name;
nuclear@0 63 unsigned int nverts, nfaces;
nuclear@0 64
nuclear@0 65 // current value for each attribute for the immedate mode
nuclear@0 66 // interface.
nuclear@0 67 Vector4 cur_val[NUM_MESH_ATTR];
nuclear@0 68
nuclear@0 69 unsigned int buffer_objects[NUM_MESH_ATTR + 1];
nuclear@0 70
nuclear@0 71 // vertex attribute data and buffer objects
nuclear@0 72 struct {
nuclear@0 73 int nelem; // number of elements per attribute range: [1, 4]
nuclear@0 74 std::vector<float> data;
nuclear@0 75 unsigned int vbo;
nuclear@0 76 mutable bool vbo_valid; // if this is false, the vbo needs updating from the data
nuclear@0 77 mutable bool data_valid; // if this is false, the data needs to be pulled from the vbo
nuclear@0 78 //int sdr_loc;
nuclear@0 79 } vattr[NUM_MESH_ATTR];
nuclear@0 80
nuclear@0 81 static int global_sdr_loc[NUM_MESH_ATTR];
nuclear@0 82
nuclear@0 83 //std::vector<XFormNode*> bones; // bones affecting this mesh
nuclear@0 84
nuclear@0 85 // index data and buffer object
nuclear@0 86 std::vector<unsigned int> idata;
nuclear@0 87 unsigned int ibo;
nuclear@0 88 mutable bool ibo_valid;
nuclear@0 89 mutable bool idata_valid;
nuclear@0 90
nuclear@0 91 // index buffer object for wireframe rendering (constructed on demand)
nuclear@0 92 unsigned int wire_ibo;
nuclear@0 93 mutable bool wire_ibo_valid;
nuclear@0 94
nuclear@0 95 // axis-aligned bounding box
nuclear@0 96 mutable AABox aabb;
nuclear@0 97 mutable bool aabb_valid;
nuclear@0 98
nuclear@0 99 // bounding sphere
nuclear@0 100 mutable Sphere bsph;
nuclear@0 101 mutable bool bsph_valid;
nuclear@0 102
nuclear@0 103 // keeps the last intersected face
nuclear@0 104 mutable Triangle hitface;
nuclear@0 105 // keeps the last intersected vertex position
nuclear@0 106 mutable Vector3 hitvert;
nuclear@0 107
nuclear@0 108 void calc_aabb();
nuclear@0 109 void calc_bsph();
nuclear@0 110
nuclear@0 111 static unsigned int intersect_mode;
nuclear@0 112 static float vertex_sel_dist;
nuclear@0 113
nuclear@0 114 static float vis_vecsize;
nuclear@0 115
nuclear@0 116 /// update the VBOs after data has changed (invalid vbo/ibo)
nuclear@0 117 void update_buffers();
nuclear@0 118 /// construct/update the wireframe index buffer (called from draw_wire).
nuclear@0 119 void update_wire_ibo();
nuclear@0 120
nuclear@0 121 mutable int cur_sdr;
nuclear@0 122 bool pre_draw() const;
nuclear@0 123 void post_draw() const;
nuclear@0 124
nuclear@0 125
nuclear@0 126 public:
nuclear@0 127 static bool use_custom_sdr_attr;
nuclear@0 128
nuclear@0 129 Mesh();
nuclear@0 130 ~Mesh();
nuclear@0 131
nuclear@0 132 Mesh(const Mesh &rhs);
nuclear@0 133 Mesh &operator =(const Mesh &rhs);
nuclear@0 134 bool clone(const Mesh &m);
nuclear@0 135
nuclear@0 136 void set_name(const char *name);
nuclear@0 137 const char *get_name() const;
nuclear@0 138
nuclear@0 139 bool has_attrib(int attr) const;
nuclear@0 140 bool is_indexed() const;
nuclear@0 141
nuclear@0 142 // clears everything about this mesh, and returns to the newly constructed state
nuclear@0 143 void clear();
nuclear@0 144
nuclear@0 145 // access the vertex attribute data
nuclear@0 146 // if vdata == 0, space is just allocated
nuclear@0 147 float *set_attrib_data(int attrib, int nelem, unsigned int num, const float *vdata = 0); // invalidates vbo
nuclear@0 148 float *get_attrib_data(int attrib); // invalidates vbo
nuclear@0 149 const float *get_attrib_data(int attrib) const;
nuclear@0 150
nuclear@0 151 // simple access to any particular attribute
nuclear@0 152 void set_attrib(int attrib, int idx, const Vector4 &v); // invalidates vbo
nuclear@0 153 Vector4 get_attrib(int attrib, int idx) const;
nuclear@0 154
nuclear@0 155 int get_attrib_count(int attrib) const;
nuclear@0 156
nuclear@0 157 // ... same for index data
nuclear@0 158 unsigned int *set_index_data(int num, const unsigned int *indices = 0); // invalidates ibo
nuclear@0 159 unsigned int *get_index_data(); // invalidates ibo
nuclear@0 160 const unsigned int *get_index_data() const;
nuclear@0 161
nuclear@0 162 int get_index_count() const;
nuclear@0 163
nuclear@0 164 void append(const Mesh &mesh);
nuclear@0 165
nuclear@0 166 // immediate-mode style mesh construction interface
nuclear@0 167 void vertex(float x, float y, float z);
nuclear@0 168 void normal(float nx, float ny, float nz);
nuclear@0 169 void tangent(float tx, float ty, float tz);
nuclear@0 170 void texcoord(float u, float v, float w);
nuclear@0 171 void boneweights(float w1, float w2, float w3, float w4);
nuclear@0 172 void boneidx(int idx1, int idx2, int idx3, int idx4);
nuclear@0 173
nuclear@0 174 int get_poly_count() const;
nuclear@0 175
nuclear@0 176 /* apply a transformation to the vertices and its inverse-transpose
nuclear@0 177 * to the normals and tangents.
nuclear@0 178 */
nuclear@0 179 void apply_xform(const Matrix4x4 &xform);
nuclear@0 180 void apply_xform(const Matrix4x4 &xform, const Matrix4x4 &dir_xform);
nuclear@0 181
nuclear@0 182 void flip(); // both faces and normals
nuclear@0 183 void flip_faces();
nuclear@0 184 void flip_normals();
nuclear@0 185
nuclear@0 186 // adds a bone and returns its index
nuclear@0 187 /*int add_bone(XFormNode *bone);
nuclear@0 188 const XFormNode *get_bone(int idx) const;
nuclear@0 189 int get_bones_count() const;*/
nuclear@0 190
nuclear@0 191 // access the shader attribute locations
nuclear@0 192 static void set_attrib_location(int attr, int loc);
nuclear@0 193 static int get_attrib_location(int attr);
nuclear@0 194 static void clear_attrib_locations();
nuclear@0 195
nuclear@0 196 static void set_vis_vecsize(float sz);
nuclear@0 197 static float get_vis_vecsize();
nuclear@0 198
nuclear@0 199 void draw() const;
nuclear@0 200 void draw_wire() const;
nuclear@0 201 void draw_vertices() const;
nuclear@0 202 void draw_normals() const;
nuclear@0 203 void draw_tangents() const;
nuclear@0 204
nuclear@0 205 /** get the bounding box in local space. The result will be cached, and subsequent
nuclear@0 206 * calls will return the same box. The cache gets invalidated by any functions that can affect
nuclear@0 207 * the vertex data (non-const variant of get_attrib_data(MESH_ATTR_VERTEX, ...) included).
nuclear@0 208 * @{ */
nuclear@0 209 void get_aabbox(Vector3 *vmin, Vector3 *vmax) const;
nuclear@0 210 const AABox &get_aabbox() const;
nuclear@0 211 /// @}
nuclear@0 212
nuclear@0 213 /** get the bounding sphere in local space. The result will be cached, and subsequent
nuclear@0 214 * calls will return the same box. The cache gets invalidated by any functions that can affect
nuclear@0 215 * the vertex data (non-const variant of get_attrib_data(MESH_ATTR_VERTEX, ...) included).
nuclear@0 216 * @{ */
nuclear@0 217 float get_bsphere(Vector3 *center, float *rad) const;
nuclear@0 218 const Sphere &get_bsphere() const;
nuclear@0 219
nuclear@0 220 static void set_intersect_mode(unsigned int mode);
nuclear@0 221 static unsigned int get_intersect_mode();
nuclear@0 222 static void set_vertex_select_distance(float dist);
nuclear@0 223 static float get_vertex_select_distance();
nuclear@0 224
nuclear@0 225 /** Find the intersection between the mesh and a ray.
nuclear@0 226 * XXX Brute force at the moment, not intended to be used for anything other than picking in tools.
nuclear@0 227 * If you intend to use it in a speed-critical part of the code, you'll *have* to optimize it!
nuclear@0 228 */
nuclear@0 229 bool intersect(const Ray &ray, HitPoint *hit = 0) const;
nuclear@0 230
nuclear@0 231 // texture coordinate manipulation
nuclear@0 232 void texcoord_apply_xform(const Matrix4x4 &xform);
nuclear@0 233 void texcoord_gen_plane(const Vector3 &norm, const Vector3 &tang);
nuclear@0 234 void texcoord_gen_box();
nuclear@5 235 void texcoord_gen_cylinder();
nuclear@2 236
nuclear@2 237 void dump(FILE *fp) const;
nuclear@0 238 };
nuclear@0 239
nuclear@0 240 #endif // MESH_H_