1 #ifndef __GNUC__
2 #pragma once
3 #endif
4 #ifndef __XR_MESH_H__
5 #define __XR_MESH_H__
6
7 #include <string>
8 #include <vector>
9 #include "xr_vector3.h"
10 #include "xr_vector2.h"
11 #include "xr_fixed_vector.h"
12 #include "xr_aabb.h"
13
14 namespace xray_re {
15
16 // editable mesh flags
17 enum {
18 EMF_VALID = 0x01, // no rendering and collision (wireframe works though)
19 EMF_3DSMAX = 0x04, // generated by 3ds Max export plugin (different sgroups)
20 };
21
22 const uint32_t EMESH_NO_SG = 0xffffffff;
23
24 class xr_reader;
25 class xr_writer;
26 class xr_object;
27 class xr_surface;
28
29 class xr_vmap {
30 public:
31 xr_vmap();
32 xr_vmap(const char* name);
33 xr_vmap(const std::string& name);
34 virtual ~xr_vmap();
35 virtual void load_data(xr_reader& r) = 0;
36 virtual void save_data(xr_writer& w) const = 0;
37 virtual void reserve(size_t _size);
38 uint32_t add_vertex(uint32_t vert_idx);
39
40 static xr_vmap* create(const char* name, unsigned type, unsigned dimension, bool discontiguous);
41
42 struct f_read_0 { void operator()(xr_vmap*& vmap, xr_reader& r); };
43 struct f_read_1 { void operator()(xr_vmap*& vmap, xr_reader& r); };
44 struct f_read_2 { void operator()(xr_vmap*& vmap, xr_reader& r); };
45 struct f_write { void operator()(const xr_vmap* vmap, xr_writer& w) const; };
46
47 enum {
48 VMT_UV,
49 VMT_WEIGHT,
50 };
51
52
53 virtual unsigned type() const = 0;
54 size_t size() const;
55 const std::string& name() const;
56 const std::vector<uint32_t>& vertices() const;
57
58 protected:
59 std::string m_name;
60 std::vector<uint32_t> m_vertices;
61 };
62
63 class xr_uv_vmap: public xr_vmap {
64 public:
65 xr_uv_vmap(const char* name);
66 xr_uv_vmap(const std::string& name);
67 virtual void load_data(xr_reader& r);
68 virtual void save_data(xr_writer& w) const;
69 virtual void reserve(size_t _size);
70 uint32_t add_uv(const fvector2& uv, uint32_t vert_idx);
71
72 virtual unsigned type() const;
73 const std::vector<fvector2>& uvs() const;
74
75 protected:
76 std::vector<fvector2> m_uvs;
77 };
78
TYPEDEF_STD_VECTOR_PTR(xr_vmap)79 TYPEDEF_STD_VECTOR_PTR(xr_vmap)
80
81 class xr_face_uv_vmap: public xr_uv_vmap {
82 public:
83 xr_face_uv_vmap(const char* name);
84 xr_face_uv_vmap(const std::string& name);
85 virtual void load_data(xr_reader& r);
86 virtual void save_data(xr_writer& w) const;
87 virtual void reserve(size_t _size);
88 uint32_t add_uv(const fvector2& uv, uint32_t vert_idx, uint32_t face_idx);
89
90 const std::vector<uint32_t>& faces() const;
91
92 protected:
93 std::vector<uint32_t> m_faces;
94 };
95
96 class xr_weight_vmap: public xr_vmap {
97 public:
98 xr_weight_vmap(const char* name);
99 xr_weight_vmap(const std::string& name);
100 virtual void load_data(xr_reader& r);
101 virtual void save_data(xr_writer& w) const;
102 virtual void reserve(size_t _size);
103 uint32_t add_weight(float weight, uint32_t vert_idx);
104
105 virtual unsigned type() const;
106 const std::vector<float>& weights() const;
107
108 protected:
109 std::vector<float> m_weights;
110 };
111
112 TYPEDEF_STD_VECTOR_PTR(xr_weight_vmap)
113
114 struct xr_surfmap {
115 xr_surfmap();
116 xr_surfmap(xr_surface* _surface);
117 xr_surface* surface;
118 std::vector<uint32_t> faces;
119 };
120
121 TYPEDEF_STD_VECTOR_PTR(xr_surfmap)
122
123 struct lw_options {
124 uint32_t unk1;
125 uint32_t unk2;
126 };
127
128 struct lw_face {
129 lw_face();
130 lw_face(uint32_t _v0, uint32_t _v1, uint32_t _v2);
131 union {
132 struct {
133 uint32_t v[3];
134 uint32_t ref[3];
135 };
136 struct {
137 uint32_t v0, v1, v2;
138 uint32_t ref0, ref1, ref2;
139 };
140 };
141 };
142
143 TYPEDEF_STD_VECTOR(lw_face)
144
145 struct lw_vmref_entry {
146 lw_vmref_entry();
147 lw_vmref_entry(uint32_t _vmap, uint32_t _offset);
148 bool operator==(const lw_vmref_entry& right) const;
149 bool operator<(const lw_vmref_entry& right) const;
150
151 uint32_t vmap;
152 uint32_t offset;
153 };
154
155 typedef _svector<lw_vmref_entry, 5> lw_vmref;
156
TYPEDEF_STD_VECTOR(lw_vmref)157 TYPEDEF_STD_VECTOR(lw_vmref)
158
159 class xr_mesh {
160 public:
161 xr_mesh();
162 virtual ~xr_mesh();
163 void load(xr_reader& r, xr_object& object);
164 void save(xr_writer& w) const;
165
166 std::string& name();
167 const std::string& name() const;
168 uint8_t flags() const;
169 uint8_t& flags();
170 fbox& bbox();
171 const fbox& bbox() const;
172 std::vector<fvector3>& points();
173 const std::vector<fvector3>& points() const;
174 lw_face_vec& faces();
175 const lw_face_vec& faces() const;
176 std::vector<uint32_t>& sgroups();
177 const std::vector<uint32_t>& sgroups() const;
178 lw_vmref_vec& vmrefs();
179 const lw_vmref_vec& vmrefs() const;
180 xr_surfmap_vec& surfmaps();
181 const xr_surfmap_vec& surfmaps() const;
182 xr_vmap_vec& vmaps();
183 const xr_vmap_vec& vmaps() const;
184
185 void calculate_bbox();
186
187 protected:
188 std::string m_name; // EMESH_CHUNK_MESHNAME
189 uint8_t m_flags; // EMESH_CHUNK_FLAGS
190 lw_options m_options; // EMESH_CHUNK_OPTIONS
191 fbox m_bbox; // EMESH_CHUNK_BBOX
192 std::vector<fvector3> m_points; // EMESH_CHUNK_VERTS
193 std::vector<uint8_t> m_adj_counts;
194 std::vector<uint32_t> m_adj_refs;
195 lw_face_vec m_faces; // EMESH_CHUNK_FACES
196 std::vector<uint32_t> m_sgroups; // EMESH_CHUNK_SG
197 lw_vmref_vec m_vmrefs; // EMESH_CHUNK_VMREFS
198 xr_surfmap_vec m_surfmaps; // EMESH_CHUNK_SFACE
199 xr_vmap_vec m_vmaps; // EMESH_CHUNK_VMAPS
200 };
201
TYPEDEF_STD_VECTOR_PTR(xr_mesh)202 TYPEDEF_STD_VECTOR_PTR(xr_mesh)
203
204 inline size_t xr_vmap::size() const { return m_vertices.size(); }
name()205 inline const std::string& xr_vmap::name() const { return m_name; }
vertices()206 inline const std::vector<uint32_t>& xr_vmap::vertices() const { return m_vertices; }
uvs()207 inline const std::vector<fvector2>& xr_uv_vmap::uvs() const { return m_uvs; }
faces()208 inline const std::vector<uint32_t>& xr_face_uv_vmap::faces() const { return m_faces; }
weights()209 inline const std::vector<float>& xr_weight_vmap::weights() const { return m_weights; }
210
lw_face()211 inline lw_face::lw_face() {}
lw_face(uint32_t _v0,uint32_t _v1,uint32_t _v2)212 inline lw_face::lw_face(uint32_t _v0, uint32_t _v1, uint32_t _v2):
213 v0(_v0), v1(_v1), v2(_v2), ref0(UINT32_MAX), ref1(UINT32_MAX), ref2(UINT32_MAX) {}
214
lw_vmref_entry()215 inline lw_vmref_entry::lw_vmref_entry() {}
lw_vmref_entry(uint32_t _vmap,uint32_t _offset)216 inline lw_vmref_entry::lw_vmref_entry(uint32_t _vmap, uint32_t _offset):
217 vmap(_vmap), offset(_offset) {}
218
219 inline bool lw_vmref_entry::operator==(const lw_vmref_entry& right) const
220 {
221 return vmap == right.vmap && offset == right.offset;
222 }
223
224 inline bool lw_vmref_entry::operator<(const lw_vmref_entry& right) const
225 {
226 return vmap < right.vmap || (vmap == right.vmap && offset < right.offset);
227 }
228
xr_surfmap()229 inline xr_surfmap::xr_surfmap(): surface(0) {}
xr_surfmap(xr_surface * _surface)230 inline xr_surfmap::xr_surfmap(xr_surface* _surface): surface(_surface) {}
231
name()232 inline std::string& xr_mesh::name() { return m_name; }
name()233 inline const std::string& xr_mesh::name() const { return m_name; }
flags()234 inline uint8_t& xr_mesh::flags() { return m_flags; }
flags()235 inline uint8_t xr_mesh::flags() const { return m_flags; }
bbox()236 inline fbox& xr_mesh::bbox() { return m_bbox; }
bbox()237 inline const fbox& xr_mesh::bbox() const { return m_bbox; }
points()238 inline std::vector<fvector3>& xr_mesh::points() { return m_points; }
points()239 inline const std::vector<fvector3>& xr_mesh::points() const { return m_points; }
faces()240 inline lw_face_vec& xr_mesh::faces() { return m_faces; }
faces()241 inline const lw_face_vec& xr_mesh::faces() const { return m_faces; }
sgroups()242 inline std::vector<uint32_t>& xr_mesh::sgroups() { return m_sgroups; }
sgroups()243 inline const std::vector<uint32_t>& xr_mesh::sgroups() const { return m_sgroups; }
vmrefs()244 inline lw_vmref_vec& xr_mesh::vmrefs() { return m_vmrefs; }
vmrefs()245 inline const lw_vmref_vec& xr_mesh::vmrefs() const { return m_vmrefs; }
surfmaps()246 inline xr_surfmap_vec& xr_mesh::surfmaps() { return m_surfmaps; }
surfmaps()247 inline const xr_surfmap_vec& xr_mesh::surfmaps() const { return m_surfmaps; }
vmaps()248 inline xr_vmap_vec& xr_mesh::vmaps() { return m_vmaps; }
vmaps()249 inline const xr_vmap_vec& xr_mesh::vmaps() const { return m_vmaps; }
250
251 } // end of namespace xray_re
252
253 #endif
254