~baltix/+junk/irrlicht-test

« back to all changes in this revision

Viewing changes to source/Irrlicht/CMetaTriangleSelector.cpp

  • Committer: Mantas Kriaučiūnas
  • Date: 2011-07-18 13:06:25 UTC
  • Revision ID: mantas@akl.lt-20110718130625-c5pvifp61e7kj1ol
Included whole irrlicht SVN libraries to work around launchpad recipe issue with quilt, see https://answers.launchpad.net/launchpad/+question/165193

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// Copyright (C) 2002-2011 Nikolaus Gebhardt
 
2
// This file is part of the "Irrlicht Engine".
 
3
// For conditions of distribution and use, see copyright notice in irrlicht.h
 
4
 
 
5
#include "CMetaTriangleSelector.h"
 
6
 
 
7
namespace irr
 
8
{
 
9
namespace scene
 
10
{
 
11
 
 
12
//! constructor
 
13
CMetaTriangleSelector::CMetaTriangleSelector()
 
14
{
 
15
        #ifdef _DEBUG
 
16
        setDebugName("CMetaTriangleSelector");
 
17
        #endif
 
18
}
 
19
 
 
20
 
 
21
//! destructor
 
22
CMetaTriangleSelector::~CMetaTriangleSelector()
 
23
{
 
24
        removeAllTriangleSelectors();
 
25
}
 
26
 
 
27
 
 
28
//! Returns amount of all available triangles in this selector
 
29
s32 CMetaTriangleSelector::getTriangleCount() const
 
30
{
 
31
        s32 count = 0;
 
32
        for (u32 i=0; i<TriangleSelectors.size(); ++i)
 
33
                count += TriangleSelectors[i]->getTriangleCount();
 
34
 
 
35
        return count;
 
36
}
 
37
 
 
38
 
 
39
//! Gets all triangles.
 
40
void CMetaTriangleSelector::getTriangles(core::triangle3df* triangles, s32 arraySize,
 
41
                s32& outTriangleCount, const core::matrix4* transform) const
 
42
{
 
43
        s32 outWritten = 0;
 
44
        for (u32 i=0; i<TriangleSelectors.size(); ++i)
 
45
        {
 
46
                s32 t = 0;
 
47
                TriangleSelectors[i]->getTriangles(triangles + outWritten,
 
48
                                arraySize - outWritten, t, transform);
 
49
                outWritten += t;
 
50
                if (outWritten==arraySize)
 
51
                        break;
 
52
        }
 
53
 
 
54
        outTriangleCount = outWritten;
 
55
}
 
56
 
 
57
 
 
58
//! Gets all triangles which lie within a specific bounding box.
 
59
void CMetaTriangleSelector::getTriangles(core::triangle3df* triangles, s32 arraySize,
 
60
                s32& outTriangleCount, const core::aabbox3d<f32>& box,
 
61
                const core::matrix4* transform) const
 
62
{
 
63
        s32 outWritten = 0;
 
64
        for (u32 i=0; i<TriangleSelectors.size(); ++i)
 
65
        {
 
66
                s32 t = 0;
 
67
                TriangleSelectors[i]->getTriangles(triangles + outWritten,
 
68
                                arraySize - outWritten, t, box, transform);
 
69
                outWritten += t;
 
70
                if (outWritten==arraySize)
 
71
                        break;
 
72
        }
 
73
 
 
74
        outTriangleCount = outWritten;
 
75
}
 
76
 
 
77
 
 
78
//! Gets all triangles which have or may have contact with a 3d line.
 
79
void CMetaTriangleSelector::getTriangles(core::triangle3df* triangles, s32 arraySize,
 
80
                s32& outTriangleCount, const core::line3d<f32>& line,
 
81
                const core::matrix4* transform) const
 
82
{
 
83
        s32 outWritten = 0;
 
84
        for (u32 i=0; i<TriangleSelectors.size(); ++i)
 
85
        {
 
86
                s32 t = 0;
 
87
                TriangleSelectors[i]->getTriangles(triangles + outWritten,
 
88
                                arraySize - outWritten, t, line, transform);
 
89
                outWritten += t;
 
90
                if (outWritten==arraySize)
 
91
                        break;
 
92
        }
 
93
 
 
94
        outTriangleCount = outWritten;
 
95
}
 
96
 
 
97
 
 
98
//! Adds a triangle selector to the collection of triangle selectors
 
99
//! in this metaTriangleSelector.
 
100
void CMetaTriangleSelector::addTriangleSelector(ITriangleSelector* toAdd)
 
101
{
 
102
        if (!toAdd)
 
103
                return;
 
104
 
 
105
        TriangleSelectors.push_back(toAdd);
 
106
        toAdd->grab();
 
107
}
 
108
 
 
109
 
 
110
//! Removes a specific triangle selector which was added before from the collection.
 
111
bool CMetaTriangleSelector::removeTriangleSelector(ITriangleSelector* toRemove)
 
112
{
 
113
        for (u32 i=0; i<TriangleSelectors.size(); ++i)
 
114
        {
 
115
                if (toRemove == TriangleSelectors[i])
 
116
                {
 
117
                        TriangleSelectors[i]->drop();
 
118
                        TriangleSelectors.erase(i);
 
119
                        return true;
 
120
                }
 
121
        }
 
122
 
 
123
        return false;
 
124
}
 
125
 
 
126
 
 
127
//! Removes all triangle selectors from the collection.
 
128
void CMetaTriangleSelector::removeAllTriangleSelectors()
 
129
{
 
130
        for (u32 i=0; i<TriangleSelectors.size(); ++i)
 
131
                TriangleSelectors[i]->drop();
 
132
 
 
133
        TriangleSelectors.clear();
 
134
}
 
135
 
 
136
 
 
137
//! Return the scene node associated with a given triangle.
 
138
ISceneNode* CMetaTriangleSelector::getSceneNodeForTriangle(u32 triangleIndex) const
 
139
{
 
140
        u32 totalTriangles = 0;
 
141
 
 
142
        for (u32 i=0; i<TriangleSelectors.size(); ++i)
 
143
        {
 
144
                totalTriangles += TriangleSelectors[i]->getTriangleCount();
 
145
 
 
146
                if(totalTriangles > triangleIndex)
 
147
                        return TriangleSelectors[i]->getSceneNodeForTriangle(0);
 
148
        }
 
149
 
 
150
        // For lack of anything more sensible, return the first selector.
 
151
        return TriangleSelectors[0]->getSceneNodeForTriangle(0);
 
152
}
 
153
 
 
154
 
 
155
/* Return the number of TriangleSelectors that are inside this one, 
 
156
Only useful for MetaTriangleSelector others return 1
 
157
*/
 
158
u32 CMetaTriangleSelector::getSelectorCount() const
 
159
{
 
160
        return TriangleSelectors.size();
 
161
}
 
162
 
 
163
 
 
164
/* Returns the TriangleSelector based on index based on getSelectorCount
 
165
Only useful for MetaTriangleSelector others return 'this'
 
166
*/
 
167
ITriangleSelector* CMetaTriangleSelector::getSelector(u32 index)
 
168
{
 
169
        if (index >= TriangleSelectors.size())
 
170
                return 0;
 
171
        return TriangleSelectors[index];
 
172
}
 
173
 
 
174
 
 
175
/* Returns the TriangleSelector based on index based on getSelectorCount
 
176
Only useful for MetaTriangleSelector others return 'this'
 
177
*/
 
178
const ITriangleSelector* CMetaTriangleSelector::getSelector(u32 index) const
 
179
{
 
180
        if (index >= TriangleSelectors.size())
 
181
                return 0;
 
182
        return TriangleSelectors[index];
 
183
}
 
184
 
 
185
 
 
186
} // end namespace scene
 
187
} // end namespace irr
 
188