1 #ifndef __GNUC__
2 #pragma once
3 #endif
4 #ifndef __XR_SCENE_DETAILS_H__
5 #define __XR_SCENE_DETAILS_H__
6 
7 #include <string>
8 #include <vector>
9 #include "xr_scene_part.h"
10 #include "xr_aabb.h"
11 #include "xr_color.h"
12 #include "xr_details.h"
13 
14 namespace xray_re {
15 
16 // EDetail
17 const uint32_t DETOBJ_VERSION = 0x1;
18 
19 enum {
20 	DETOBJ_CHUNK_VERSION		= 0x1000,
21 	DETOBJ_CHUNK_REFERENCE		= 0x0101,
22 	DETOBJ_CHUNK_SCALE_LIMITS	= 0x0102,
23 	DETOBJ_CHUNK_DENSITY		= 0x0103,
24 	DETOBJ_CHUNK_FLAGS		= 0x0104,
25 };
26 
27 // EDetailManager
28 enum {
29 	DETMGR_FLAG_DRAW_OBJECTS		= 0x10000000,
30 	DETMGR_FLAG_DRAW_SLOT_BOXES		= 0x20000000,
31 	DETMGR_FLAG_BASE_TEXTURE_BLENDED	= 0x40000000,
32 	DETMGR_FLAG_DRAW_BASE_TEXTURE		= 0x80000000,
33 };
34 
35 const uint32_t DETMGR_VERSION = 3;
36 
37 enum {
38 	DETMGR_CHUNK_HEADER		= 0x0000,
39 	DETMGR_CHUNK_OBJECTS		= 0x0001,
40 	DETMGR_CHUNK_SLOTS		= 0x0002,
41 	DETMGR_CHUNK_VERSION		= 0x1000,
42 	DETMGR_CHUNK_BBOX		= 0x1001,
43 	DETMGR_CHUNK_TEXTURE		= 0x1002,
44 	DETMGR_CHUNK_COLOR_INDEX	= 0x1003,
45 	DETMGR_CHUNK_SNAP_OBJECTS	= 0x1004,
46 	DETMGR_CHUNK_DENSITY		= 0x1005,
47 	DETMGR_CHUNK_FLAGS		= 0x1006,
48 };
49 
50 struct detail_object {
51 			detail_object();
52 
53 	std::string	reference;	// DETOBJ_CHUNK_REFERENCE
54 	float		min_scale;	// DETOBJ_CHUNK_SCALE_LIMITS
55 	float		max_scale;
56 	float		density;	// DETOBJ_CHUNK_DENSITY
57 	uint32_t	flags;		// DETOBJ_CHUNK_FLAGS
58 };
59 
60 TYPEDEF_STD_VECTOR_PTR(detail_object);
61 
62 struct color_index {
63 	rgba32				color;
64 	std::vector<std::string>	references;
65 };
66 
67 TYPEDEF_STD_VECTOR_PTR(color_index);
68 
69 class xr_scene_details: public xr_scene_part {
70 public:
71 				xr_scene_details(xr_scene& scene);
72 	virtual			~xr_scene_details();
73 	virtual void		load(xr_reader& r);
74 	virtual void		save(xr_writer& w) const;
75 
76 	virtual void		save_v12(xr_ini_writer* w) const;
77 
78 	uint32_t&		flags();
79 	details_header&		header();
80 	uint32_t&		num_slots();
81 	detail_slot_v3*&	slots();
82 	detail_object_vec&	objects();
83 	color_index_vec&	indices();
84 	fbox&			bbox();
85 	float&			density();
86 	std::string&		texture();
87 	std::vector<std::string>&	snap_objects();
88 
89 private:
90 	uint32_t		m_flags;	// DETMGR_CHUNK_FLAGS
91 	details_header		m_header;	// DETMGR_CHUNK_HEADER
92 	uint32_t		m_num_slots;	// DETMGR_CHUNK_SLOTS
93 	detail_slot_v3*		m_slots;
94 	detail_object_vec	m_objects;	// DETMGR_CHUNK_OBJECTS
95 	color_index_vec		m_indices;	// DETMGR_CHUNK_COLOR_INDEX
96 	fbox			m_bbox;		// DETMGR_CHUNK_BBOX
97 	float			m_density;	// DETMGR_CHUNK_DENSITY
98 	std::string		m_texture;	// DETMGR_CHUNK_TEXTURE
99 	std::vector<std::string>m_snap_objects;	// DETMGR_CHUNK_SNAP_OBJECTS
100 };
101 
flags()102 inline uint32_t& xr_scene_details::flags() { return m_flags; }
header()103 inline details_header& xr_scene_details::header() { return m_header; }
num_slots()104 inline uint32_t& xr_scene_details::num_slots() { return m_num_slots; }
slots()105 inline detail_slot_v3*& xr_scene_details::slots() { return m_slots; }
objects()106 inline detail_object_vec& xr_scene_details::objects() { return m_objects; }
indices()107 inline color_index_vec& xr_scene_details::indices() { return m_indices; }
bbox()108 inline fbox& xr_scene_details::bbox() { return m_bbox; }
density()109 inline float& xr_scene_details::density() { return m_density; }
texture()110 inline std::string& xr_scene_details::texture() { return m_texture; }
snap_objects()111 inline std::vector<std::string>& xr_scene_details::snap_objects() { return m_snap_objects; }
112 
113 } // end of namespace xray_re
114 
115 #endif
116