/src/aerys/minko/render/geometry/stream/iterator/TriangleIterator.as
ActionScript | 97 lines | 70 code | 21 blank | 6 comment | 3 complexity | c1ccef716cc48b27fa68451ed9e25644 MD5 | raw file
1package aerys.minko.render.geometry.stream.iterator
2{
3 import aerys.minko.ns.minko_stream;
4 import aerys.minko.render.geometry.stream.IVertexStream;
5 import aerys.minko.render.geometry.stream.IndexStream;
6
7 import flash.utils.Proxy;
8 import flash.utils.flash_proxy;
9
10 /**
11 * TriangleIterator allow per-triangle access on VertexStream objects.
12 *
13 * @author Jean-Marc Le Roux
14 *
15 */
16 public final class TriangleIterator extends Proxy
17 {
18 use namespace minko_stream;
19
20 private var _singleReference : Boolean = true;
21
22 private var _offset : int = 0;
23 private var _index : int = 0;
24
25 private var _vb : IVertexStream = null;
26 private var _ib : IndexStream = null;
27
28 private var _triangle : TriangleReference = null;
29
30 public function get length() : int
31 {
32 return _ib ? _ib.length / 3 : _vb.numVertices / 3;
33 }
34
35 public function TriangleIterator(vertexStream : IVertexStream,
36 indexStream : IndexStream,
37 singleReference : Boolean = true)
38 {
39 super();
40
41 _vb = vertexStream;
42 _ib = indexStream;
43 _singleReference = singleReference;
44 }
45
46 override flash_proxy function hasProperty(name : *) : Boolean
47 {
48 return int(name) < _ib.length / 3;
49 }
50
51 override flash_proxy function nextNameIndex(index : int) : int
52 {
53 index -= _offset;
54 _offset = 0;
55
56 return index < _ib.length / 3 ? index + 1 : 0;
57 }
58
59 override flash_proxy function nextName(index : int) : String
60 {
61 return String(index - 1);
62 }
63
64 override flash_proxy function nextValue(index : int) : *
65 {
66 _index = index - 1;
67
68 if (!_singleReference || !_triangle)
69 _triangle = new TriangleReference(_vb, _ib, _index);
70
71 if (_singleReference)
72 {
73 _triangle._index = _index;
74 _triangle.v0._index = _ib._data[int(_index * 3)];
75 _triangle.v1._index = _ib._data[int(_index * 3 + 1)];
76 _triangle.v2._index = _ib._data[int(_index * 3 + 2)];
77 _triangle._update = TriangleReference.UPDATE_ALL;
78 }
79
80 return _triangle;
81 }
82
83 override flash_proxy function getProperty(name : *) : *
84 {
85 return new TriangleReference(_vb, _ib, int(name));
86 }
87
88 override flash_proxy function deleteProperty(name : *) : Boolean
89 {
90 var index : uint = uint(name);
91
92 _ib.deleteTriangle(index);
93
94 return true;
95 }
96 }
97}