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