www.pudn.com > RCApp-src.zip > ocean.cxx


//#include "tux.h" 
#include  
#include "ocean.h" 
 
ssgSimpleState* water_gst; 
 
static float wtmaster [ 6 ][ 2 ] = 
{ 
  { -50000.0f/64.0f, -50000.0f/64.0f }, 
  {  50000.0f/64.0f, -50000.0f/64.0f }, 
  { -50000.0f/64.0f,  50000.0f/64.0f }, 
  {  50000.0f/64.0f,  50000.0f/64.0f }, 
  { -50000.0f/64.0f, -50000.0f/64.0f }, 
  {  50000.0f/64.0f, -50000.0f/64.0f }, 
} ; 
 
void Ocean::update () 
{ 
  /* Moving texture for the water. */ 
 
  if ( type == OCEAN_WATER || type == OCEAN_LAVA ) 
  { 
    e_offset += e_delta ; 
    u_offset += 0.0008f ; 
    v_offset += 0.0005f ; 
 
    if ( e_offset >= 0.2f || 
	 e_offset < -0.1f ) e_delta = -e_delta ; 
 
    if ( u_offset >= 1.0f ) u_offset -= 1.0f ; 
    if ( v_offset >= 1.0f ) v_offset -= 1.0f ; 
 
    for ( int i = 0 ; i < 6 ; i++ ) 
    { 
      wtlist [ i ] [ 0 ] = wtmaster [ i ] [ 0 ] + u_offset ; 
      wtlist [ i ] [ 1 ] = wtmaster [ i ] [ 1 ] + u_offset ; 
      wvlist [ i ] [ 2 ] = e_offset ; 
    } 
  } 
} 
 
 
Ocean::~Ocean () 
{ 
  ssgDeRefDelete ( ocean ) ; 
} 
 
Ocean::Ocean ( OceanType t ) 
{ 
  e_offset = 0.0f ; 
  e_delta  = 0.01f; 
  u_offset = 0.0f ; 
  v_offset = 0.0f ; 
 
  /*    gst          texture_map            clamp, trans,aref,light,frctn,flags */ 
  //{ &  water_gst, "images/water2.rgba",       FALSE, TRUE ,0.2, FALSE, 0.3, TUXMAT_BORING }, 
  water_gst = new ssgSimpleState; 
	water_gst->setTexture ("textures/water2.rgba", TRUE, TRUE) ; 
	water_gst->enable(GL_TEXTURE_2D); 
    water_gst->disable(GL_LIGHTING); 
  water_gst->setShadeModel ( GL_SMOOTH ) ; 
  water_gst->enable ( GL_COLOR_MATERIAL ) ; 
  water_gst->enable ( GL_CULL_FACE      ) ; 
  water_gst->setColourMaterial ( GL_AMBIENT_AND_DIFFUSE ) ; 
  water_gst->setMaterial ( GL_EMISSION, 0, 0, 0, 1 ) ; 
  water_gst->setMaterial ( GL_SPECULAR, 1, 1, 1, 1 ) ; 
  water_gst->setShininess ( 0 ) ; 
 
  water_gst->setTranslucent () ; 
    water_gst->enable ( GL_ALPHA_TEST ) ; 
    water_gst->setAlphaClamp ( 0.2f ) ; 
    water_gst->enable ( GL_BLEND ) ; 
 
 
 
  type = t ; 
  ocean = new ssgBranch () ; 
  ocean -> setName ( "Ocean" ) ; 
 
  wvlist = new sgVec3 [ 6 ] ; 
  wtlist = new sgVec2 [ 6 ] ; 
  wnlist = new sgVec3 [ 1 ] ; 
  wclist = new sgVec4 [ 1 ] ; 
 
  float elevation ; 
 
  switch ( type ) 
  { 
    case OCEAN_WATER : elevation = 0.0f ; break ; 
    case OCEAN_LAVA  : elevation = 0.1f ; break ; 
    case OCEAN_ICE   : elevation = 0.1f ; break ; 
    case OCEAN_BLACKHOLE : elevation = -22.0f ; break ; 
    default          : elevation = -1000000.0f ; break ; 
  } 
 
  sgSetVec3 ( wvlist [ 0 ], -50000.0f, -50000.0f, elevation ) ; 
  sgSetVec3 ( wvlist [ 1 ],  50000.0f, -50000.0f, elevation ) ; 
  sgSetVec3 ( wvlist [ 2 ], -50000.0f,  50000.0f, elevation ) ; 
  sgSetVec3 ( wvlist [ 3 ],  50000.0f,  50000.0f, elevation ) ; 
  sgSetVec3 ( wvlist [ 4 ], -50000.0f, -50000.0f, elevation ) ; 
  sgSetVec3 ( wvlist [ 5 ],  50000.0f, -50000.0f, elevation ) ; 
 
  sgSetVec3 ( wnlist [ 0 ],  0.0f, 0.0f, 1.0f ) ; 
 
  update () ;  /* Computes initial texture position conveniently */ 
 
  ssgVTable *wgs = new ssgVTable ( GL_TRIANGLE_STRIP, 
                          6, wvlist, 1, wnlist, 6, wtlist, 1, wclist ) ; 
 
  switch ( type ) 
  { 
    case OCEAN_WATER : wgs -> setState (water_gst ) ; 
                       sgSetVec4 ( wclist [ 0 ],  1.0f, 1.0f, 1.0f, 0.7f ) ; 
                       wgs -> clrTraversalMaskBits ( SSGTRAV_ISECT|SSGTRAV_HOT ) ; 
                       break ; 
    /*case OCEAN_LAVA  : wgs -> setState ( lava_gst ) ; 
                       sgSetVec4 ( wclist [ 0 ],  1.0f, 1.0f, 1.0f, 1.0f ) ; 
                       break ; 
    case OCEAN_ICE   : wgs -> setState ( clearice_gst ) ; 
                       sgSetVec4 ( wclist [ 0 ],  0.5f, 0.5f, 1.0f, 0.7f ) ; 
                       break ; 
    case OCEAN_BLACKHOLE : wgs -> setState ( solidblack_gst ) ; 
                       sgSetVec4 ( wclist [ 0 ],  0.0f, 0.0f, 0.0f, 1.0f ) ; 
                       break ;*/ 
  } 
 
  ocean -> addKid ( wgs ) ; 
  ocean -> recalcBSphere () ; 
  ocean -> ref () ; 
}