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