blob: d9c200dbdbe8cdb2ff3fe89edfb28556592fe774 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
/*
model/fragment.h
This file is part of the Osirion project and is distributed under
the terms of the GNU General Public License version 2
*/
#ifndef __INCLUDED_MODEL_FRAGMENT_H__
#define __INCLUDED_MODEL_FRAGMENT_H__
#include <list>
#include "math/axis.h"
#include "math/color.h"
#include "math/vector3f.h"
#include "model/material.h"
namespace model
{
/// a fragment of a model, a pointer into a continuous part of the VertexArray containing tris or quads
class Fragment
{
public:
/// fragment primitive type: triangles or quads
enum Type {Triangles, Quads};
/// create a new fragment
Fragment(Type type, const Material *material);
/// add a vertex to the fragment
size_t add_vertex(math::Vector3f const & vertex, math::Vector3f const &normal, math::Color const & color, bool detail);
/// the type of primitives this fragment consists of
inline Type type() const
{
return fragment_type;
}
/// VertexArray index of the start of the fragment
inline size_t index() const
{
return fragment_index;
}
/// number of structural vertices in the fragment
inline size_t structural_size() const
{
return fragment_structural_size;
}
/// number of detail vertices in the fragment
inline size_t detail_size() const
{
return fragment_detail_size;
}
/// material flags
inline const Material * material() const
{
return fragment_material;
}
private:
Type fragment_type;
size_t fragment_index;
size_t fragment_structural_size;
size_t fragment_detail_size;
const Material * fragment_material;
};
/// a collection of fragments
/**
* a FragmentGroup contains the model fragments for one class in the .map file.
* worldspawn is a FragmentGroup
*/
class FragmentGroup
{
public:
enum Type {None = 0, Rotate = 1, Door = 2 };
typedef std::list<Fragment *>::iterator iterator;
FragmentGroup();
~FragmentGroup();
inline const Type type() const { return group_type; }
inline const math::Vector3f &location() const { return group_location; }
inline const math::Axis & axis() const { return group_axis; }
inline const float speed() const { return group_speed; }
inline void set_type(const Type type) { group_type = type; }
inline void set_location(const math::Vector3f &location) { group_location.assign(location); }
inline void set_axis(const math::Axis &axis) { group_axis.assign(axis); }
inline void set_speed(const float speed) { group_speed = speed; }
inline iterator begin() { return group_fragments.begin(); }
inline iterator end() { return group_fragments.end(); }
inline const size_t size() const { return group_fragments.size(); }
inline void push_back(Fragment *fragment) { group_fragments.push_back(fragment); }
void clear();
private:
/// type definition for a list of model fragments
typedef std::list<Fragment *> Fragments;
Fragments group_fragments;
math::Vector3f group_location;
math::Vector3f group_forward;
math::Axis group_axis;
Type group_type;
float group_speed;
};
}
#endif // __INCLUDED_MODEL_FRAGMENT_H__
|