void MyShape::setAngMomentum(sgVec4 newAngMomentum) { sgCopyVec4(prevAngVelocity, angVelocity); float I = getMomentOfInertia(); sgCopyVec4(angMomentum, newAngMomentum); sgCopyVec4(angVelocity, angMomentum); sgScaleVec4(angVelocity, 1.0/I); }
bool cGrCelestialBody::repaint( double angle ) { static double prev_angle = 9999.0; if (prev_angle != angle) { prev_angle = angle; double factor = 4*cos(angle); if (factor > 1) factor = 1.0; if (factor < -1) factor = -1.0; factor = factor/2 + 0.5f; sgVec4 color; color[0] = (float)pow(factor, 0.25); color[1] = (float)pow(factor, 0.50); color[2] = (float)pow(factor, 4.0); color[3] = 1.0; grGammaCorrectRGB( color ); float *ptr; ptr = cl->get( 0 ); sgCopyVec4( ptr, color ); } return true; }
void MyShape::setMomentum(float inX, float inY, float inZ) { sgCopyVec4(prevMomentum, momentum); momentum[0] = inX; momentum[1] = inY; momentum[2] = inZ; momentum[3] = 0; }
bool cGrMoon::repaint( double angle ) { if (prev_moon_angle != angle) { prev_moon_angle = angle; double moon_factor = 4 * cos(angle); if (moon_factor > 1) moon_factor = 1.0; if (moon_factor < -1) moon_factor = -1.0; moon_factor = (moon_factor / 2) + 0.5f; sgVec4 color; color[1] = sqrt(moon_factor); color[0] = sqrt(color[1]); color[2] = moon_factor * moon_factor; color[2] *= color[2]; color[3] = 1.0; //color[0] = (float)pow(moon_factor, 0.25); //color[1] = (float)pow(moon_factor, 0.50); //color[2] = (float)pow(moon_factor, 4.0); //color[3] = 1.0; grGammaCorrectRGB( color ); float *ptr; ptr = moon_cl->get( 0 ); sgCopyVec4( ptr, color ); } return true; }
void MyShape::adjustAngMomentum(const sgVec4 dAngMomentum) { //TODO generalize for other shapes float I = getMomentOfInertia(); sgAddVec4(angMomentum, dAngMomentum); sgCopyVec4(angVelocity, angMomentum); sgScaleVec4(angVelocity, 1.0/I); }
float HD_TilingTerrain::getHeightAndPlane(float x_north, float y_east, float tplane[4]) { float h,hot ; /* H.O.T == Height Of Terrain */ float *p1,*p2,*p3; int numero=-1; int ix = (int)(y_east/SIZE_CELL_GRID_PLANES) + SIZE_GRID_PLANES/2; int jy = (int)(-x_north/SIZE_CELL_GRID_PLANES) + SIZE_GRID_PLANES/2; if (ix<0) ix=0; if (ix>SIZE_GRID_PLANES)ix = SIZE_GRID_PLANES; if (jy<0) jy=0; if (jy>SIZE_GRID_PLANES)jy = SIZE_GRID_PLANES; ssgVertexArray* tile = tile_table[ix][jy]; //std::cout << "utilise cellule " << ix<<", "<<jy<< std::endl; int n = tile->getNum(); hot = DEEPEST_HELL ; //std::cout << "cellule nb triangle/cellule*3 i,j "<<tile <<" " << n <<" "<< ix <<" "<< jy << std::endl; //std::cout << "nord, east" <<x_north<<" "<< y_east <<" " << std::endl; for ( int i = 0 ; i < n ; i+=3 ) { p1= tile->get(i); p2= tile->get(i+1); p3= tile->get(i+2); /* std::cout << "-------------- " << p1[0]<<" "<< p1[1]<<" "<< p1[2]<<" "<< std::endl; std::cout << "-------------- " << p2[0]<<" "<< p2[1]<<" "<< p2[2]<<" "<< std::endl; std::cout << "-------------- " << p3[0]<<" "<< p3[1]<<" "<< p3[2]<<" "<< std::endl; */ if ( on_triangle(-x_north, y_east, p1, p2, p3)) { sgVec4 plane; sgMakePlane ( plane, p1, p2, p3); h = -(-plane[2]*x_north + plane[0]*y_east + plane[3] )/ plane[1]; if (h>hot) { numero = i; hot=h; if (tplane) sgCopyVec4(tplane, plane); } //std::cout << "----plane***" << plane[0] <<" "<< plane[1] <<" "<< plane[2]<<" "<< plane[3] << "hot" << hot <<std::endl; } } if ( tplane ) { if ( numero >= 0) { if (tplane[1]<0) /* ??? revoir : preferable d'orienter correctement les facettes */ sgNegateVec4 ( tplane , tplane ); } else { tplane[0] = .0; tplane[1] = 1.0; tplane[2] = 0.0; tplane[3] = -hot; } } return hot; }
void MyShape::getMomentum(sgVec4 retVec) const { sgCopyVec4(retVec, momentum); }
void MyShape::setMomentum(const sgVec4 newMomentum) { sgCopyVec4(prevMomentum, momentum); sgCopyVec4(momentum, newMomentum); }
void MyShape::getAngMomentum(sgVec4 retVec) { sgCopyVec4(retVec, angMomentum); }
bool cGrSkyDome::repaint( sgVec4 sky_color, sgVec4 fog_color, double sol_angle, double vis ) { double diff, prev_sun_angle = 999.0; sgVec3 outer_param, outer_amt, outer_diff; sgVec3 middle_param, middle_amt, middle_diff; int i, j; if (prev_sun_angle == sol_angle) return true; prev_sun_angle = sol_angle; //sol_angle *= SGD_RADIANS_TO_DEGREES; // Check for sunrise/sunset condition if ((sol_angle > 80.0)) { sgSetVec3( outer_param, (float)((10.0 - fabs(90.0 - sol_angle)) / 20.0), (float)((10.0 - fabs(90.0 - sol_angle)) / 40.0), (float)(-(10.0 - fabs(90.0 - sol_angle)) / 30.0)); sgSetVec3( middle_param, (float)((10.0 - fabs(90.0 - sol_angle)) / 40.0), (float)((10.0 - fabs(90.0 - sol_angle)) / 80.0), 0.0 ); sgScaleVec3( outer_diff, outer_param, 1.0f / 6.0f ); sgScaleVec3( middle_diff, middle_param, 1.0f / 6.0f ); } else { sgSetVec3( outer_param, 0.0, 0.0, 0.0 ); sgSetVec3( middle_param, 0.0, 0.0, 0.0 ); sgSetVec3( outer_diff, 0.0, 0.0, 0.0 ); sgSetVec3( middle_diff, 0.0, 0.0, 0.0 ); } // calculate transition colors between sky and fog sgCopyVec3( outer_amt, outer_param ); sgCopyVec3( middle_amt, middle_param ); // // First, recalulate the basic colors // sgVec4 center_color; sgVec4 upper_color[12]; sgVec4 middle_color[12]; sgVec4 lower_color[12]; sgVec4 bottom_color[12]; double vis_factor, cvf = vis; if (cvf > 45000) cvf = 45000; vis_factor = (vis - 1000.0) / 2000.0; if ( vis_factor < 0.0 ) { vis_factor = 0.0; } else if ( vis_factor > 1.0) { vis_factor = 1.0; } for ( j = 0; j < 3; j++ ) { diff = sky_color[j] - fog_color[j]; center_color[j] = sky_color[j]; // - (float)(diff * ( 1.0 - vis_factor )); } for ( i = 0; i < 6; i++ ) { for ( j = 0; j < 3; j++ ) { double saif = sol_angle/SG_PI; diff = sky_color[j] - fog_color[j] * (0.8 + j * 0.2) * (0.8 + saif - ((6-i)/10)); upper_color[i][j] = sky_color[j] - (float)(diff * ( 1.0 - vis_factor * (0.7 + 0.3 * cvf/45000))); middle_color[i][j] = sky_color[j] - (float)(diff * ( 1.0 - vis_factor * (0.1 + 0.85 * cvf/45000))) + middle_amt[j]; lower_color[i][j] = fog_color[j] + outer_amt[j]; if ( upper_color[i][j] > 1.0 ) { upper_color[i][j] = 1.0; } if ( upper_color[i][j] < 0.0 ) { upper_color[i][j] = 0.0; } if ( middle_color[i][j] > 1.0 ) { middle_color[i][j] = 1.0; } if ( middle_color[i][j] < 0.0 ) { middle_color[i][j] = 0.0; } if ( lower_color[i][j] > 1.0 ) { lower_color[i][j] = 1.0; } if ( lower_color[i][j] < 0.0 ) { lower_color[i][j] = 0.0; } } upper_color[i][3] = middle_color[i][3] = lower_color[i][3] = 1.0; for ( j = 0; j < 3; j++ ) { outer_amt[j] -= outer_diff[j]; middle_amt[j] -= middle_diff[j]; } } sgSetVec3( outer_amt, 0.0, 0.0, 0.0 ); sgSetVec3( middle_amt, 0.0, 0.0, 0.0 ); for ( i = 6; i < 12; i++ ) { for ( j = 0; j < 3; j++ ) { double saif = sol_angle/SG_PI; diff = (sky_color[j] - fog_color[j]) * (0.8 + j * 0.2) * (0.8 + saif - ((-i+12)/10)); upper_color[i][j] = sky_color[j] - (float)(diff * ( 1.0 - vis_factor * (0.7 + 0.3 * cvf/45000))); middle_color[i][j] = sky_color[j] - (float)(diff * ( 1.0 - vis_factor * (0.1 + 0.85 * cvf/45000))) + middle_amt[j]; lower_color[i][j] = fog_color[j] + outer_amt[j]; if ( upper_color[i][j] > 1.0 ) { upper_color[i][j] = 1.0; } if ( upper_color[i][j] < 0.0 ) { upper_color[i][j] = 0.0; } if ( middle_color[i][j] > 1.0 ) { middle_color[i][j] = 1.0; } if ( middle_color[i][j] < 0.0 ) { middle_color[i][j] = 0.0; } if ( lower_color[i][j] > 1.0 ) { lower_color[i][j] = 1.0; } if ( lower_color[i][j] < 0.0 ) { lower_color[i][j] = 0.0; } } upper_color[i][3] = middle_color[i][3] = lower_color[i][3] = 1.0; for ( j = 0; j < 3; j++ ) { outer_amt[j] += outer_diff[j]; middle_amt[j] += middle_diff[j]; } } fade_to_black( (sgVec4 *) center_color, asl * center_elev, 1); fade_to_black( upper_color, (asl+0.05f) * upper_elev, 12); fade_to_black( middle_color, (asl+0.05f) * middle_elev, 12); fade_to_black( lower_color, (asl+0.05f) * lower_elev, 12); for ( i = 0; i < 12; i++ ) { sgCopyVec4( bottom_color[i], fog_color ); } // // Second, assign the basic colors to the object color arrays // float *slot; int counter; // update the center disk color arrays counter = 0; slot = center_disk_cl->get( counter++ ); // sgVec4 red; // sgSetVec4( red, 1.0, 0.0, 0.0, 1.0 ); sgCopyVec4( slot, center_color ); for ( i = 11; i >= 0; i-- ) { slot = center_disk_cl->get( counter++ ); sgCopyVec4( slot, upper_color[i] ); } slot = center_disk_cl->get( counter++ ); sgCopyVec4( slot, upper_color[11] ); // generate the upper ring counter = 0; for ( i = 0; i < 12; i++ ) { slot = upper_ring_cl->get( counter++ ); sgCopyVec4( slot, middle_color[i] ); slot = upper_ring_cl->get( counter++ ); sgCopyVec4( slot, upper_color[i] ); } slot = upper_ring_cl->get( counter++ ); sgCopyVec4( slot, middle_color[0] ); slot = upper_ring_cl->get( counter++ ); sgCopyVec4( slot, upper_color[0] ); // generate middle ring counter = 0; for ( i = 0; i < 12; i++ ) { slot = middle_ring_cl->get( counter++ ); sgCopyVec4( slot, lower_color[i] ); slot = middle_ring_cl->get( counter++ ); sgCopyVec4( slot, middle_color[i] ); } slot = middle_ring_cl->get( counter++ ); sgCopyVec4( slot, lower_color[0] ); slot = middle_ring_cl->get( counter++ ); sgCopyVec4( slot, middle_color[0] ); // generate lower ring counter = 0; for ( i = 0; i < 12; i++ ) { slot = lower_ring_cl->get( counter++ ); sgCopyVec4( slot, bottom_color[i] ); slot = lower_ring_cl->get( counter++ ); sgCopyVec4( slot, lower_color[i] ); } slot = lower_ring_cl->get( counter++ ); sgCopyVec4( slot, bottom_color[0] ); slot = lower_ring_cl->get( counter++ ); sgCopyVec4( slot, lower_color[0] ); return true; }