void parseplanet(char *line, Planetrec *p) { char *fld[6]; int i, nfld; char *s; if(line[0] == '\0') return; line[10] = '\0'; /* terminate name */ s = strrchr(line, ' '); if(s == nil) s = line; else s++; strcpy(p->name, s); for(i=0; s[i]!='\0'; i++) p->name[i] = tolower(s[i]); p->name[i] = '\0'; nfld = getfields(line+11, fld, nelem(fld), 1, " "); p->ra = dangle(getra(fld[0])); p->dec = dangle(getra(fld[1])); p->az = atof(fld[2])*MILLIARCSEC; p->alt = atof(fld[3])*MILLIARCSEC; p->semidiam = atof(fld[4])*1000; if(nfld > 5) p->phase = atof(fld[5]); else p->phase = 0; }
void DrawOceanTask::generateWaves() { long seed = 1234567; float min = log(lambdaMin) / log(2.0f); float max = log(lambdaMax) / log(2.0f); vec4f *waves = new vec4f[nbWaves]; sigmaXsq = 0.0; sigmaYsq = 0.0; meanHeight = 0.0; heightVariance = 0.0; amplitudeMax = 0.0; #define nbAngles 5 // impair #define angle(i) (1.5*(((i)%nbAngles)/(float)(nbAngles/2)-1)) #define dangle() (1.5/(float)(nbAngles/2)) float Wa[nbAngles]; // normalised gaussian samples int index[nbAngles]; // to hash angle order float s=0; for (int i=0; i<nbAngles; i++) { index[i]=i; float a = angle(i); // (i/(float)(nbAngle/2)-1)*1.5; s += Wa[i] = exp(-.5*a*a); } for (int i=0; i<nbAngles; i++) { Wa[i] /= s; } const float waveDispersion = 0.9f;//6; const float U0 = 10.0f; const int spectrumType = 2; for (int i = 0; i < nbWaves; ++i) { float x = i / (nbWaves - 1.0f); float lambda = pow(2.0f, (1.0f - x) * min + x * max); float ktheta = grandom(0.0f, 1.0f, &seed) * waveDispersion; float knorm = 2.0f * M_PI_F / lambda; float omega = sqrt(9.81f * knorm); float amplitude; if (spectrumType == 1) { amplitude = heightMax * grandom(0.5f, 0.15f, &seed) / (knorm * lambdaMax / (2.0f * M_PI)); } else if (spectrumType == 2) { float step = (max-min)/(nbWaves-1); // dlambda/di float omega0 = 9.81f / U0; // 100.0; if ((i%(nbAngles))==0) { // scramble angle ordre for (int k=0; k<nbAngles; k++) { // do N swap in indices int n1=lrandom(&seed)%nbAngles, n2=lrandom(&seed)%nbAngles,n; n=index[n1]; index[n1]=index[n2]; index[n2]=n; } } ktheta = waveDispersion*(angle(index[(i)%nbAngles])+.4*srnd()*dangle()); ktheta *= 1/(1+40*pow(omega0/omega,4)); amplitude = (8.1e-3*9.81*9.81) / pow(omega,5) * exp(-0.74*pow(omega0/omega,4)); amplitude *= .5*sqrt(2*3.14*9.81/lambda)*nbAngles*step; // (2/step-step/2); amplitude = 3*heightMax*sqrt(amplitude); } // cull breaking trochoids ( d(x+Acos(kx))=1-Akcos(); must be >0 ) if (amplitude > 1.0f / knorm) { amplitude = 1.0f / knorm; } else if (amplitude < -1.0f / knorm) { amplitude = -1.0f / knorm; } waves[i].x = amplitude; waves[i].y = omega; waves[i].z = knorm * cos(ktheta); waves[i].w = knorm * sin(ktheta); sigmaXsq += pow(cos(ktheta), 2.0f) * (1.0f - sqrt(1.0f - knorm * knorm * amplitude * amplitude)); sigmaYsq += pow(sin(ktheta), 2.0f) * (1.0f - sqrt(1.0f - knorm * knorm * amplitude * amplitude)); meanHeight -= knorm * amplitude * amplitude * 0.5f; heightVariance += amplitude * amplitude * (2.0f - knorm * knorm * amplitude * amplitude) * 0.25f; amplitudeMax += fabs(amplitude); } float var = 4.0f; float h0 = meanHeight - var * sqrt(heightVariance); float h1 = meanHeight + var * sqrt(heightVariance); amplitudeMax = h1 - h0; ptr<Texture1D> wavesTexture = new Texture1D(nbWaves, RGBA32F, RGBA, FLOAT, Texture::Parameters().wrapS(CLAMP_TO_BORDER).min(NEAREST).mag(NEAREST), Buffer::Parameters(), CPUBuffer(waves)); delete[] waves; nbWavesU->set(nbWaves); wavesU->set(wavesTexture); if (brdfShader != NULL) { assert(!brdfShader->getUsers().empty()); Program *prog = *(brdfShader->getUsers().begin()); prog->getUniform1f("seaRoughness")->set(sigmaXsq); prog->getUniform3f("seaColor")->set(seaColor); } }