GLuint Positions(std::vector<T>& dest) const { unsigned k = 0, n = _vertex_count(); dest.resize(n * 3); Vec3f pos(_point - _u - _v); Vec3f ustep(_u * (2.0 / _udiv)); Vec3f vstep(_v * (2.0 / _vdiv)); unsigned leap = _udiv+1; for(unsigned j=0; j!=(_vdiv+1); ++j) { Vec3f tmp = pos; for(unsigned i=0; i!=leap; ++i) { dest[k++] = T(tmp.x()); dest[k++] = T(tmp.y()); dest[k++] = T(tmp.z()); tmp += ustep; } pos += vstep; } assert(k == dest.size()); return 3; }
int main(){ //set up port pins DDRB |= 0b00101000; DDRD |= 0b01101000; DDRC = 0; PORTB = 0xFF; PORTC = 0xFF; PORTD = 0xFF; //PWM timer configs TCCR0A = 0b10100011; //fastPWM; p.103 in datasheet TCCR2A = 0b10100011; //fastPWM; p.153 TCCR0B = 2; //F_CPU/8; p.105 (7.84 kHz) TCCR2B = 2; //F_CPU/8; p.157 OCR0A = 128; //gently lock stepper rotation //startup blinkenled for (int i=0; i<8; i++){ PORTB |= (1<<5); delay(800); PORTB &= ~(1<<5); delay(800); } delay(8000); //read in DIPswitch; set up TIMER1 per external calculation switch (PINC & 0b00000111){ case 0: dly=3333; //8s revolution TCCR1B |= (1); //F_CPU/1; page 133; blink (0); break; case 1: dly=6666; //16s revolution TCCR1B |= (1); //F_CPU/1 blink (1); break; case 2: dly=1667; //32s revolution TCCR1B |= (2); //F_CPU/8 blink (2); break; case 3: dly=3333; //64s revolution TCCR1B |= (2); //F_CPU/8 blink (3); break; case 4: dly=3906; //10min revolution TCCR1B |= (3); //F_CPU/64 blink (4); break; case 5: dly=23437; //1hr revolution TCCR1B |= (3); //F_CPU/64 blink (5); break; case 6: dly=2929; //2hr revolution TCCR1B |= (5); //F_CPU/1024 blink (6); break; case 7: dly=5859; //4hr revolution TCCR1B |= (5); //F_CPU/1024 blink (7); break; default: die (1); } while(PIND & 1<<1){ //allow user to pre-position camera if(!(PIND & 1<<2)){ ustep(1); } else if(!(PIND & 1)){ ustep(2); } delay(mdelay); } //button has been pressed; initiate pictionation blink(10); TCNT1 = 0; while(1){ if (TCNT1 >= dly){die (2);} //catch possible timer underrun while(TCNT1 < dly){} //poll timer TCNT1 = 0; ustep(2); } }//main