Mercurial > hg > opencollidoscope
comparison CollidoscopeApp/src/Wave.cpp @ 0:02467299402e
First import
CollidoscopeApp for Raspberry Pi
JackDevice
Teensy code for Collidoscope
author | Fiore Martin <f.martin@qmul.ac.uk> |
---|---|
date | Thu, 30 Jun 2016 14:50:06 +0200 |
parents | |
children | 7fb593d53361 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:02467299402e |
---|---|
1 #include "Wave.h" | |
2 #include "DrawInfo.h" | |
3 | |
4 | |
5 using namespace ci; | |
6 | |
7 Wave::Wave( size_t numChunks, Color selectionColor ): | |
8 mNumChunks( numChunks ), | |
9 mSelection( this, selectionColor ), | |
10 mColor(Color(0.5f, 0.5f, 0.5f)), | |
11 mFilterCoeff( 1.0f ) | |
12 { | |
13 mChunks.reserve( numChunks ); | |
14 | |
15 for ( size_t i = 0; i < numChunks; i++ ){ | |
16 mChunks.emplace_back( i ); | |
17 } | |
18 | |
19 auto lambert = gl::ShaderDef().color(); | |
20 gl::GlslProgRef shader = gl::getStockShader( lambert ); | |
21 mChunkBatch = gl::Batch::create( geom::Rect( ci::Rectf( 0, 0, Chunk::kWidth, 1 ) ), shader ); | |
22 } | |
23 | |
24 void Wave::reset( bool onlyChunks ) | |
25 { | |
26 for (size_t i = 0; i < getSize(); i++){ | |
27 mChunks[i].reset(); | |
28 } | |
29 | |
30 if (onlyChunks) | |
31 return; | |
32 | |
33 mSelection.setToNull(); | |
34 } | |
35 | |
36 | |
37 void Wave::setChunk(size_t index, float bottom, float top) | |
38 { | |
39 Chunk &c = mChunks[index]; | |
40 c.setTop(top); | |
41 c.setBottom(bottom); | |
42 } | |
43 | |
44 inline const Chunk & Wave::getChunk(size_t index) | |
45 { | |
46 return mChunks[index]; | |
47 } | |
48 | |
49 void Wave::update( double secondsPerChunk, const DrawInfo& di ) { | |
50 typedef std::map<int, Cursor>::iterator MapItr; | |
51 | |
52 | |
53 // update the cursor positions | |
54 double now = ci::app::getElapsedSeconds(); | |
55 for (MapItr itr = mCursors.begin(); itr != mCursors.end(); ++itr){ | |
56 if (mSelection.isNull()){ | |
57 itr->second.pos = Cursor::kNoPosition; | |
58 } | |
59 | |
60 if ( itr->second.pos == Cursor::kNoPosition ) | |
61 continue; | |
62 | |
63 | |
64 double elapsed = now - itr->second.lastUpdate; | |
65 | |
66 itr->second.pos = mSelection.getStart() + int( elapsed / secondsPerChunk ); | |
67 | |
68 /* check we don't go too far off */ | |
69 if (itr->second.pos > mSelection.getEnd()){ | |
70 itr->second.pos = Cursor::kNoPosition; | |
71 } | |
72 } | |
73 | |
74 // update chunks for animation | |
75 for ( auto &chunk : mChunks ){ | |
76 chunk.update( di ); | |
77 } | |
78 | |
79 #ifdef USE_PARTICLES | |
80 mParticleController.updateParticles(); | |
81 #endif | |
82 | |
83 } | |
84 | |
85 void Wave::draw( const DrawInfo& di ){ | |
86 | |
87 | |
88 /* ########### draw the particles ########## */ | |
89 #ifdef USE_PARTICLES | |
90 mParticleController.draw(); | |
91 #endif | |
92 | |
93 /* ########### draw the wave ########## */ | |
94 /* scale the wave to fit the window */ | |
95 gl::pushModelView(); | |
96 | |
97 | |
98 const float wavePixelLen = ( mNumChunks * ( 2 + Chunk::kWidth ) ); | |
99 /* scale the x-axis for the wave to fit the window */ | |
100 gl::scale( ((float)di.getWindowWidth() ) / wavePixelLen , 1.0f); | |
101 /* draw the chunks */ | |
102 if (mSelection.isNull()){ | |
103 /* no selection: all chunks the same color */ | |
104 gl::color(mColor); | |
105 for (size_t i = 0; i < getSize(); i++){ | |
106 mChunks[i].draw( di, mChunkBatch ); | |
107 } | |
108 } | |
109 else{ | |
110 // Selection not null | |
111 gl::color(this->mColor); | |
112 | |
113 // update the array with cursor positions | |
114 mCursorsPos.clear(); | |
115 for ( auto cursor : mCursors ){ | |
116 mCursorsPos.push_back( cursor.second.pos ); | |
117 } | |
118 | |
119 gl::enableAlphaBlending(); | |
120 | |
121 const float selectionAlpha = 0.5f + mFilterCoeff * 0.5f; | |
122 | |
123 | |
124 for (size_t i = 0; i < getSize(); i++){ | |
125 /* when in selection use selection color */ | |
126 | |
127 if (i == mSelection.getStart()){ | |
128 /* draw the selection bar with a transparent selection color */ | |
129 gl::color(mSelection.getColor().r, mSelection.getColor().g, mSelection.getColor().b, 0.5f); | |
130 mChunks[i].drawBar( di, mChunkBatch ); | |
131 | |
132 /* set the color to the selection */ | |
133 gl::color(mSelection.getColor().r, mSelection.getColor().g, mSelection.getColor().b, selectionAlpha); | |
134 } | |
135 | |
136 // check if one of the cursors is positioned in this chunk | |
137 if (std::find(mCursorsPos.begin(), mCursorsPos.end(),i) != mCursorsPos.end() ){ | |
138 gl::color(CURSOR_CLR); | |
139 mChunks[i].draw( di, mChunkBatch ); | |
140 gl::color(mSelection.getColor().r, mSelection.getColor().g, mSelection.getColor().b, selectionAlpha); | |
141 } | |
142 else{ | |
143 /* just draw with current color */ | |
144 mChunks[i].draw( di, mChunkBatch ); | |
145 } | |
146 | |
147 /* exit selection: go back to wave color */ | |
148 if (i == mSelection.getEnd()){ | |
149 /* draw the selection bar with a transparent selection color */ | |
150 gl::color(mSelection.getColor().r, mSelection.getColor().g, mSelection.getColor().b, 0.5f); | |
151 mChunks[i].drawBar( di, mChunkBatch ); | |
152 /* set the colo to the wave */ | |
153 gl::color(this->mColor); | |
154 } | |
155 } | |
156 gl::disableAlphaBlending(); | |
157 } | |
158 | |
159 | |
160 gl::popModelView(); | |
161 | |
162 } | |
163 | |
164 | |
165 | |
166 //**************** Selection ***************// | |
167 | |
168 Wave::Selection::Selection(Wave * w, Color color) : | |
169 mWave( w ), | |
170 mSelectionStart( 0 ), | |
171 mSelectionEnd( 0 ), | |
172 mColor( color ), | |
173 mParticleSpread( 1 ) | |
174 {} | |
175 | |
176 | |
177 void Wave::Selection::setStart(size_t start) { | |
178 | |
179 /* deselect the previous */ | |
180 mWave->mChunks[mSelectionStart].setAsSelectionStart( false ); | |
181 /* select the next */ | |
182 mWave->mChunks[start].setAsSelectionStart( true ); | |
183 | |
184 mNull = false; | |
185 | |
186 size_t size = getSize(); | |
187 | |
188 mSelectionStart = start; | |
189 mSelectionEnd = start + size - 1; | |
190 if ( mSelectionEnd > mWave->getSize() - 1 ) | |
191 mSelectionEnd = mWave->getSize() - 1; | |
192 | |
193 } | |
194 | |
195 void Wave::Selection::setSize(size_t size) { | |
196 | |
197 if ( size <= 0 ){ | |
198 mNull = true; | |
199 return; | |
200 } | |
201 | |
202 size -= 1; | |
203 | |
204 // check boundaries: size cannot bring the selection end beyond the end of the wave | |
205 if ( mSelectionStart+size >= mWave->mNumChunks ){ | |
206 size = mWave->mNumChunks - mSelectionStart - 1; | |
207 } | |
208 | |
209 /* deselect the previous */ | |
210 mWave->mChunks[mSelectionEnd].setAsSelectionEnd( false ); | |
211 | |
212 mSelectionEnd = mSelectionStart + size; | |
213 /* select the next */ | |
214 mWave->mChunks[mSelectionEnd].setAsSelectionEnd( true ); | |
215 | |
216 mNull = false; | |
217 } | |
218 | |
219 | |
220 const cinder::Color Wave::CURSOR_CLR = Color(1.f, 1.f, 1.f); | |
221 | |
222 |