1 
2 #include "tux.h"
3 
update()4 void Orca::update ()
5 {
6   frame++ ;
7   last_pos = orca_pos ;
8   orca -> setTransform ( & orca_pos ) ;
9 
10   int step = frame % 38 ;
11 
12   if ( step > 19 )
13     orcaSeq -> selectStep ( 38 - step ) ;
14   else
15     orcaSeq -> selectStep ( step ) ;
16 }
17 
18 
Orca()19 Orca::Orca ()
20 {
21   orca = new ssgTransform ;
22   orca -> ref () ;
23 
24   orcaSeq = new ssgTimedSelector ;
25 
26   sgCoord c ;
27 
28   /* Flipper coordinates */
29 
30   ssgBranch *lfgeode    = new ssgBranch () ; lfgeode -> setName ( "Orca_lf" ) ;
31   ssgBranch *rfgeode    = new ssgBranch () ; rfgeode -> setName ( "Orca_rf" ) ;
32   ssgBranch *flukegeode = new ssgBranch () ; flukegeode -> setName ( "Orca_fluke" ) ;
33   ssgBranch *fingeode   = new ssgBranch () ; fingeode -> setName ( "Orca_fin" ) ;
34 
35 float lmult = 1.3 ;
36   lfgeode   -> addKid ( MakeFlipper ( orcafin_gst,  1.0, lmult* 0.77, 1.0 ) ) ;
37   rfgeode   -> addKid ( MakeFlipper ( orcafin_gst, -1.0, lmult* 0.77, 1.0 ) ) ;
38   flukegeode-> addKid ( MakeFlukes  ( orcafin_gst,  1.3, lmult*-0.77, 1.0, TRUE )) ;
39   fingeode  -> addKid ( MakeFlukes  ( orcafin_gst,  1.0, lmult* 1.1, 1.1, FALSE)) ;
40 
41                     /* Tail.....................................Nose */
42   float orca_y [7] = { -5.13, -4.62, -2.97,  0.00,  1.65,  1.98,  2.20 } ;
43   float orca_z [7] = { -0.65, -0.65, -0.05,  0.15, -0.32, -0.48, -0.45 } ;
44   float orca_r [7] = {  0.00,  0.27,  1.02,  1.18,  0.68,  0.26,  0.00 } ;
45 
46 for ( int q = 0 ; q < 7 ; q++ )
47   orca_y[q]*=lmult;
48 
49   for ( int i = 0 ; i < 20 ; i++ )
50   {
51     ssgBranch *group = new ssgBranch () ; group->setName ( "Orca Grp #" ) ;
52     ssgBranch *geode = new ssgBranch () ; geode->setName ( "Orca Gd  #" ) ;
53     float orca_z2 [ 7 ] ;
54 
55     memcpy ( orca_z2, orca_z, 7 * sizeof(float) ) ;
56 
57     orca_z2 [ 0 ] += 1.60 * sin ( (float) (i-10) * M_PI / 20.0 ) ;
58     orca_z2 [ 1 ] += 1.80 * sin ( (float) (i-10) * M_PI / 20.0 ) ;
59     orca_z2 [ 2 ] += 0.60 * sin ( (float) (i-10) * M_PI / 20.0 ) ;
60     orca_z2 [ 3 ] += 0.10 * sin ( (float) (i-10) * M_PI / 20.0 ) ;
61     orca_z2 [ 4 ] -= 0.06 * sin ( (float) (i-10) * M_PI / 20.0 ) ;
62     orca_z2 [ 5 ] -= 0.10 * sin ( (float) (i-10) * M_PI / 20.0 ) ;
63     orca_z2 [ 6 ] -= 0.11 * sin ( (float) (i-10) * M_PI / 20.0 ) ;
64 
65     geode -> addKid ( MakeXSection ( orca_gst, 7, orca_y,
66                                            orca_z2, orca_z, orca_r, 11,
67                       25.0/256.0, -4.50, (217.0-25.0)/256.0, (4.95+2.09)*lmult,
68                        9.0/128.0, -1.08, ( 47.0- 9.0)/128.0, 1.26+1.08 ) ) ;
69 
70     sgSetVec3 ( c.xyz, 0.0, lmult*-4.2, orca_z2[1] ) ;
71     sgSetVec3 ( c.hpr, 0.0,  (float)(i-10)*0.8, 0.0 ) ;
72     ssgTransform *flukescs = new ssgTransform ( & c ) ;
73 
74     sgSetVec3 ( c.xyz, 0.0, 0.0, 1.10 ) ;
75     sgSetVec3 ( c.hpr, 0.0, -(float)(i-20), 0.0 ) ;
76     ssgTransform *finscs = new ssgTransform ( & c ) ;
77 
78     sgSetVec3 ( c.xyz,  1.0, 0.0, -0.2 ) ;
79     sgSetVec3 ( c.hpr, 10.0, 0.0, (float)(i-10)*2.0 ) ;
80     ssgTransform *lfscs = new ssgTransform ( & c ) ;
81 
82     sgSetVec3 ( c.xyz, -1.0, 0.0, -0.2 ) ;
83     sgSetVec3 ( c.hpr,-10.0, 0.0, -(float)(i-10)*2.0 ) ;
84     ssgTransform *rfscs = new ssgTransform ( & c ) ;
85 
86     lfscs   -> addKid ( lfgeode    ) ;
87     rfscs   -> addKid ( rfgeode    ) ;
88 
89     finscs  -> addKid ( fingeode   ) ;
90     flukescs-> addKid ( flukegeode ) ;
91     group   -> addKid ( finscs     ) ;
92     group   -> addKid ( flukescs   ) ;
93     group   -> addKid ( lfscs      ) ;
94     group   -> addKid ( rfscs      ) ;
95     group   -> addKid ( geode      ) ;
96     orcaSeq -> addKid ( group      ) ;
97   }
98 
99 /*
100   orcaSeq -> setDuration ( 0.03, -1 ) ;
101   orcaSeq -> setLimits   ( SSG_ANIM_SWING, 0, 19 ) ;
102 */
103   orca -> addKid ( orcaSeq ) ;
104 }
105 
106 
107