void shader_cube(float *x, float *y, uint32_t *color) { olPushMatrix3(); olLoadIdentity3(); // Shrink down the entire final image a bit, to avoid cutting off the cube's // left and right corners while it's rotating. On a bitmap display (PC) this // doesn't matter, but on the laser without shading it looks bad if the edge // suddenly scissors off. olScale3( 0.9, 0.9, 0.9); // This transform sets it up so that it's identity at the cube's front face // (z = -4) olFrustum(-1, 1, -1, 1, FACEDEPTH, 100); // Now figure out the z-position depending on the rotation of the cube, to // make the frontmost edge always be full-height. float theta = cubepos < 0 ? -cubepos : cubepos; float zdelta = -1 - FACEDEPTH + 1 * (sinf(M_PI/4) - sinf(M_PI/4 + theta)); olTranslate3(0, 0, zdelta); // Perform the rotation olRotate3Y(cubepos); // And finally transform the incoming vertex float z = 1; olTransformVertex3(x, y, &z); olPopMatrix3(); }
int rx_callback(hackrf_transfer* transfer) { int8_t* buf; uint8_t* ubuf; uint64_t frequency; /* in Hz */ uint64_t band_edge; uint32_t record_length; int i, j, ifft_bins; struct tm *fft_time; char time_str[50]; struct timeval usb_transfer_time; if(NULL == fd) { return -1; } gettimeofday(&usb_transfer_time, NULL); byte_count += transfer->valid_length; buf = (int8_t*) transfer->buffer; ifft_bins = fftSize * step_count; for(j=0; j<BLOCKS_PER_TRANSFER; j++) { ubuf = (uint8_t*) buf; if(ubuf[0] == 0x7F && ubuf[1] == 0x7F) { frequency = ((uint64_t)(ubuf[9]) << 56) | ((uint64_t)(ubuf[8]) << 48) | ((uint64_t)(ubuf[7]) << 40) | ((uint64_t)(ubuf[6]) << 32) | ((uint64_t)(ubuf[5]) << 24) | ((uint64_t)(ubuf[4]) << 16) | ((uint64_t)(ubuf[3]) << 8) | ubuf[2]; } else { buf += BYTES_PER_BLOCK; continue; } if (frequency == (uint64_t)(FREQ_ONE_MHZ*frequencies[0])) { if(sweep_started) { if(ifft_output) { fftwf_execute(ifftwPlan); for(i=0; i < ifft_bins; i++) { ifftwOut[i][0] *= 1.0f / ifft_bins; ifftwOut[i][1] *= 1.0f / ifft_bins; fwrite(&ifftwOut[i][0], sizeof(float), 1, fd); fwrite(&ifftwOut[i][1], sizeof(float), 1, fd); } } if (openlase_output) { olLoadIdentity3(); olLoadIdentity(); // olPerspective(60, 1, 1, 100); olTranslate3(0, 0, -3); olScale3(0.6f, 0.6f, 0.6f); int len = fftSize * step_count; olBegin(OL_LINESTRIP); float mul = 2.0f / len; for (int i = 0; i < len; i++) { float x = i * mul - 1.0f; float pwr = openlaseBuf[i] / 100.0f; olVertex3(x, pwr, 0.0f, (255 << 16) | 255); } olEnd(); olRenderFrame(60); } sweep_count++; if(one_shot) { do_exit = true; } } sweep_started = true; time_stamp = usb_transfer_time; time_stamp.tv_usec += (uint64_t)(num_samples + THROWAWAY_BLOCKS * SAMPLES_PER_BLOCK) * j * FREQ_ONE_MHZ / DEFAULT_SAMPLE_RATE_HZ; if(999999 < time_stamp.tv_usec) { time_stamp.tv_sec += time_stamp.tv_usec / 1000000; time_stamp.tv_usec = time_stamp.tv_usec % 1000000; } } if(do_exit) { return 0; } if(!sweep_started) { buf += BYTES_PER_BLOCK; continue; } if((FREQ_MAX_MHZ * FREQ_ONE_MHZ) < frequency) { buf += BYTES_PER_BLOCK; continue; } /* copy to fftwIn as floats */ buf += BYTES_PER_BLOCK - (fftSize * 2); for(i=0; i < fftSize; i++) { fftwIn[i][0] = buf[i*2] * window[i] * 1.0f / 128.0f; fftwIn[i][1] = buf[i*2+1] * window[i] * 1.0f / 128.0f; } buf += fftSize * 2; fftwf_execute(fftwPlan); for (i=0; i < fftSize; i++) { pwr[i] = logPower(fftwOut[i], 1.0f / fftSize); } if(binary_output) { record_length = 2 * sizeof(band_edge) + (fftSize/4) * sizeof(float); fwrite(&record_length, sizeof(record_length), 1, fd); band_edge = frequency; fwrite(&band_edge, sizeof(band_edge), 1, fd); band_edge = frequency + DEFAULT_SAMPLE_RATE_HZ / 4; fwrite(&band_edge, sizeof(band_edge), 1, fd); fwrite(&pwr[1+(fftSize*5)/8], sizeof(float), fftSize/4, fd); fwrite(&record_length, sizeof(record_length), 1, fd); band_edge = frequency + DEFAULT_SAMPLE_RATE_HZ / 2; fwrite(&band_edge, sizeof(band_edge), 1, fd); band_edge = frequency + (DEFAULT_SAMPLE_RATE_HZ * 3) / 4; fwrite(&band_edge, sizeof(band_edge), 1, fd); fwrite(&pwr[1+fftSize/8], sizeof(float), fftSize/4, fd); } else if(ifft_output) { ifft_idx = (uint32_t) round((frequency - (uint64_t)(FREQ_ONE_MHZ*frequencies[0])) / fft_bin_width); ifft_idx = (ifft_idx + ifft_bins/2) % ifft_bins; for(i = 0; (fftSize / 4) > i; i++) { ifftwIn[ifft_idx + i][0] = fftwOut[i + 1 + (fftSize*5)/8][0]; ifftwIn[ifft_idx + i][1] = fftwOut[i + 1 + (fftSize*5)/8][1]; } ifft_idx += fftSize / 2; ifft_idx %= ifft_bins; for(i = 0; (fftSize / 4) > i; i++) { ifftwIn[ifft_idx + i][0] = fftwOut[i + 1 + (fftSize/8)][0]; ifftwIn[ifft_idx + i][1] = fftwOut[i + 1 + (fftSize/8)][1]; } } else if (openlase_output) { ifft_idx = (uint32_t) round((frequency - (uint64_t)(FREQ_ONE_MHZ*frequencies[0])) / fft_bin_width); ifft_idx = (ifft_idx + ifft_bins/2) % ifft_bins; for(i = 0; (fftSize / 4) > i; i++) { openlaseBuf[ifft_idx + i] = pwr[i + 1 + (fftSize*5)/8]; } ifft_idx += fftSize / 2; ifft_idx %= ifft_bins; for(i = 0; (fftSize / 4) > i; i++) { openlaseBuf[ifft_idx + i] = pwr[i + 1 + (fftSize/8)]; } } else { time_t time_stamp_seconds = time_stamp.tv_sec; fft_time = localtime(&time_stamp_seconds); strftime(time_str, 50, "%Y-%m-%d, %H:%M:%S", fft_time); fprintf(fd, "%s.%06ld, %" PRIu64 ", %" PRIu64 ", %.2f, %u", time_str, (long int)time_stamp.tv_usec, (uint64_t)(frequency), (uint64_t)(frequency+DEFAULT_SAMPLE_RATE_HZ/4), fft_bin_width, fftSize); for(i = 0; (fftSize / 4) > i; i++) { fprintf(fd, ", %.2f", pwr[i + 1 + (fftSize*5)/8]); } fprintf(fd, "\n"); fprintf(fd, "%s.%06ld, %" PRIu64 ", %" PRIu64 ", %.2f, %u", time_str, (long int)time_stamp.tv_usec, (uint64_t)(frequency+(DEFAULT_SAMPLE_RATE_HZ/2)), (uint64_t)(frequency+((DEFAULT_SAMPLE_RATE_HZ*3)/4)), fft_bin_width, fftSize); for(i = 0; (fftSize / 4) > i; i++) { fprintf(fd, ", %.2f", pwr[i + 1 + (fftSize/8)]); } fprintf(fd, "\n"); } } return 0; }
int main (int argc, char *argv[]) { OLRenderParams params; memset(¶ms, 0, sizeof params); params.rate = 48000; params.on_speed = 2.0/100.0; params.off_speed = 2.0/20.0; params.start_wait = 8; params.start_dwell = 3; params.curve_dwell = 0; params.corner_dwell = 8; params.curve_angle = cosf(30.0*(M_PI/180.0)); // 30 deg params.end_dwell = 3; params.end_wait = 7; params.snap = 1/100000.0; params.render_flags = RENDER_GRAYSCALE; if(olInit(3, 30000) < 0) return 1; olSetRenderParams(¶ms); float time = 0; float ftime; int i,j; int frames = 0; while(1) { olLoadIdentity3(); olLoadIdentity(); olPerspective(60, 1, 1, 100); olTranslate3(0, 0, -3); for(i=0; i<2; i++) { if (i == 1) olColor3(0.0,1.0,0.0); else olColor3(0.0,1.0,0.0); olScale3(0.6, 0.6, 0.6); olRotate3Z(time * M_PI * 0.1); olRotate3Y(time * M_PI * 0.8); olRotate3X(time * M_PI * 0.73); olBegin(OL_LINESTRIP); olVertex3(-1, -1, -1); olVertex3( 1, -1, -1); olVertex3( 1, 1, -1); olVertex3(-1, 1, -1); olVertex3(-1, -1, -1); olVertex3(-1, -1, 1); olEnd(); olBegin(OL_LINESTRIP); olVertex3( 1, 1, 1); olVertex3(-1, 1, 1); olVertex3(-1, -1, 1); olVertex3( 1, -1, 1); olVertex3( 1, 1, 1); olVertex3( 1, 1, -1); olEnd(); olBegin(OL_LINESTRIP); olVertex3( 1, -1, -1); olVertex3( 1, -1, 1); olEnd(); olBegin(OL_LINESTRIP); olVertex3(-1, 1, 1); olVertex3(-1, 1, -1); olEnd(); } ftime = olRenderFrame(60); frames++; time += ftime; printf("Frame time: %f, FPS:%f\n", ftime, frames/time); } olShutdown(); exit (0); }
static VALUE ol_scale3(VALUE self, VALUE sx, VALUE sy, VALUE sz) { olScale3(NUM2DBL(sx), NUM2DBL(sy), NUM2DBL(sz)); return Qnil; }
void DoTunnel(float limit) { params.on_speed = 2.0/100.0; params.start_dwell = 2; params.curve_dwell = 0; params.corner_dwell = 2; params.curve_angle = cosf(30.0*(M_PI/180.0)); // 30 deg params.end_dwell = 2; params.snap = 1/100000.0; params.flatness = 0.000005; params.start_wait = 6; params.off_speed = 2.0/30.0; params.end_wait = 3; params.render_flags &= ~RENDER_NOREORDER; olSetRenderParams(¶ms); float ctime = 0; int i,j; olLoadIdentity(); float z = 0.0f; float rz = 0.0f; float dz=1.2; int id=0; while (audiotime < limit) { float left = (limit-audiotime)/AB; olResetColor(); if (ctime < 2.0) olMultColor(C_GREY((int)(255*ctime/2))); else if (left < 2.0) olMultColor(C_GREY((int)(255*left/2))); olLoadIdentity3(); olPerspective(45, 1, 1, 100); while(z > dz) { z -= dz; id++; } olScale3(0.6, 0.6, 1.0); olTranslate3(0, 0, 1.5); olTranslate3(0, 0, -z); tunnel_revxform(rz); for(i=0;i<10;i++) { if ((id+i) > 5) { olPushMatrix3(); olTranslate3(0,0,dz*i); tunnel_xform(rz+dz*(i+id)); olBegin(OL_LINESTRIP); for(j=0;j<11;j++) { float theta = j/5.0*M_PI; uint32_t c = C_RED; if(i==9) { c = C_RED_I((int)(255 * z/dz)); } olVertex3(sinf(theta), cosf(theta), 0, c); //olVertex3(j/11.0,0,0,C_WHITE); } olEnd(); olPopMatrix3(); } } for(j=0;j<10;j++) { float theta = j/5.0*M_PI; olBegin(OL_LINESTRIP); for(i=0;i<9;i++) { if ((id+i) > 5) { olPushMatrix3(); olTranslate3(0,0,dz*i); tunnel_xform(rz+dz*(i+id)); olVertex3(sinf(theta), cosf(theta), 0, C_GREEN_I((int)(255 * i/8.0)) | C_BLUE_I((int)(255 * (1-(i/8.0))))); olPopMatrix3(); } } olEnd(); } ctime += render(); z += ftime*3.2; rz += ftime*3.2; } }
void render_cubes(float time) { int i; OLRenderParams mpar; memcpy(&mpar, ¶ms, sizeof(OLRenderParams)); if (time > 32) { time += 1.0; mpar.on_speed = 0.022 + (1-usin(time, 2.0)) * 0.02; mpar.corner_dwell = 8*usin(time, 2.0); mpar.start_dwell = 2+3*usin(time, 2.0); mpar.start_wait = 3+5*usin(time, 2.0); mpar.end_dwell = 2+3*usin(time, 2.0); mpar.end_wait = 2*usin(time, 2.0); olSetRenderParams(&mpar); time -= 1.0; } printf("%f %d %d %d %d %d\n", mpar.on_speed, mpar.corner_dwell, mpar.start_dwell, mpar.start_wait, mpar.end_dwell, mpar.end_wait); olLoadIdentity3(); olPerspective(60, 1, 1, 100); olTranslate3(0, 0, -2.1); for(i=0; i<3; i++) { if (i>0) olPushMatrix3(); olScale3(0.6, 0.6, 0.6); if (i>0) { float tx = sinf(time + (i-1)*M_PI); float ty = cosf(time + (i-1)*M_PI); float tz = sinf(time + (i-1)*M_PI); float s = sinf(0.6*time); olTranslate3(tx*s,ty*s,tz*s); //olScale3(s,s,s); olScale3(0.3,0.3,0.3); } float mult; if (i==0) mult = 1; else if (i==1) mult = 1.5; else if (i==2) mult = -1.5; if (i==0) olMultColor(C_GREY(120)); else olResetColor(); olRotate3Z(mult*time * M_PI * 0.1 / 3.0); olRotate3Y(mult*time * M_PI * 0.8 / 3.0); olRotate3X(mult*time * M_PI * 0.73 / 3.0); olBegin(OL_LINESTRIP); olVertex3(-1, -1, -1, C_RED); olVertex3( 1, -1, -1, C_RED); olVertex3( 1, 1, -1, C_RED); olVertex3(-1, 1, -1, C_RED); olVertex3(-1, -1, -1, C_RED); olVertex3(-1, -1, 1, C_RED); olEnd(); olBegin(OL_LINESTRIP); olVertex3( 1, 1, 1, C_GREEN); olVertex3(-1, 1, 1, C_GREEN); olVertex3(-1, -1, 1, C_GREEN); olVertex3( 1, -1, 1, C_GREEN); olVertex3( 1, 1, 1, C_GREEN); olVertex3( 1, 1, -1, C_GREEN); olEnd(); olBegin(OL_LINESTRIP); olVertex3( 1, -1, -1, C_RED); olVertex3( 1, -1, 1, C_RED); olEnd(); olBegin(OL_LINESTRIP); olVertex3(-1, 1, 1, C_GREEN); olVertex3(-1, 1, -1, C_GREEN); olEnd(); /*olBegin(OL_BEZIERSTRIP); olVertex3(-1, 1, 0, C_WHITE); olVertex3(0, -1, 0, C_WHITE); olVertex3(0, -1, 0, C_WHITE); olVertex3(1, 1, 0, C_WHITE); olVertex3(-1, 0, 0, C_WHITE); olVertex3(-1, 0, 0, C_WHITE); olVertex3(1, -1, 0, C_WHITE); olVertex3(0, 1, 0, C_WHITE); olVertex3(0, 1, 0, C_WHITE); olVertex3(-1, -1, 0, C_WHITE); olVertex3(1, 0, 0, C_WHITE); olVertex3(1, 0, 0, C_WHITE); olVertex3(-1, 1, 0, C_WHITE); olEnd();*/ if (i>0) olPopMatrix3(); } olLoadIdentity3(); olLoadIdentity(); olSetRenderParams(¶ms); olResetColor(); }