コード例 #1
0
ファイル: MyShape.cpp プロジェクト: swoogles/Physics
void MyShape::setAngMomentum(sgVec4 newAngMomentum) {
    sgCopyVec4(prevAngVelocity, angVelocity);
    float I = getMomentOfInertia();
    sgCopyVec4(angMomentum, newAngMomentum);
    sgCopyVec4(angVelocity, angMomentum);
    sgScaleVec4(angVelocity, 1.0/I);
}
コード例 #2
0
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;
}
コード例 #3
0
ファイル: MyShape.cpp プロジェクト: swoogles/Physics
void MyShape::setMomentum(float inX, float inY, float inZ) {
    sgCopyVec4(prevMomentum, momentum);
    momentum[0] = inX;
    momentum[1] = inY;
    momentum[2] = inZ;
    momentum[3] = 0;
}
コード例 #4
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;
}
コード例 #5
0
ファイル: MyShape.cpp プロジェクト: swoogles/Physics
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);
}
コード例 #6
0
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;
}
コード例 #7
0
ファイル: MyShape.cpp プロジェクト: swoogles/Physics
void MyShape::getMomentum(sgVec4 retVec) const {
    sgCopyVec4(retVec, momentum);
}
コード例 #8
0
ファイル: MyShape.cpp プロジェクト: swoogles/Physics
void MyShape::setMomentum(const sgVec4 newMomentum) {
    sgCopyVec4(prevMomentum, momentum);
    sgCopyVec4(momentum, newMomentum);
}
コード例 #9
0
ファイル: MyShape.cpp プロジェクト: swoogles/Physics
void MyShape::getAngMomentum(sgVec4 retVec) {
    sgCopyVec4(retVec, angMomentum);
}
コード例 #10
0
ファイル: grSkyDome.cpp プロジェクト: rongzhou/speed-dreams
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;
}