001        package com.croftsoft.apps.jogl.imp;
002        
003        import java.util.*;
004         
005        import com.croftsoft.core.lang.NullArgumentException;
006        import com.croftsoft.core.lang.lifecycle.Updatable;
007        import com.croftsoft.core.media.jogl.camera.JoglCamera;
008        import com.croftsoft.core.media.jogl.camera.JoglCameraImp;
009        import com.croftsoft.core.media.jogl.camera.JoglCameraMut;
010        import com.croftsoft.core.media.jogl.render.JoglSpinCube;
011        import com.croftsoft.core.util.mail.Mail;
012    
013        import com.croftsoft.apps.jogl.JoglConfig;
014        import com.croftsoft.apps.jogl.JoglMessage;
015        import com.croftsoft.apps.jogl.JoglModel;
016        import com.croftsoft.apps.jogl.JoglMoveRequest;
017        import com.croftsoft.apps.jogl.JoglMoveState;
018        import com.croftsoft.apps.jogl.JoglMoveState.EnumDirection;
019    
020        /***********************************************************************
021        * Model.
022        * 
023        * Maintains program state.
024        * 
025        * @version
026        *   $Id: JoglModelImp.java,v 1.19 2008/05/17 01:32:31 croft Exp $
027        * @since
028        *   2008-02-10
029        * @author
030        *   <a href="http://www.CroftSoft.com/">David Wallace Croft</a>
031        ***********************************************************************/
032    
033        public final class  JoglModelImp
034          implements JoglModel, Updatable
035        ////////////////////////////////////////////////////////////////////////
036        ////////////////////////////////////////////////////////////////////////
037        {
038          
039        private static final double [ ]
040          PERTURBATION_FACTORS = { 0.01, 0.10, 1.00, 0 };
041        
042        private static final double
043          ROTATE_DELTA    = 1,
044          TRANSLATE_DELTA = 0.1;
045           
046        // private final instance variables
047        
048        private final Mail<JoglMessage>      mail;
049        
050        private final JoglMoveState          joglMoveState;
051        
052        private final JoglCameraMut          joglCameraMut;
053        
054        private final JoglSpinCube.ModelImp  joglSpinCubeModelImp;
055           
056        // model state instance variables
057         
058        private int  perturbationFactorIndex;
059        
060        private final Map<EnumDouble, Double>  doubleMap;
061        
062        ////////////////////////////////////////////////////////////////////////
063        ////////////////////////////////////////////////////////////////////////
064         
065        public  JoglModelImp (
066          final JoglConfig         joglConfig,
067          final Mail<JoglMessage>  mail )
068        ////////////////////////////////////////////////////////////////////////
069        {
070          NullArgumentException.checkArgs (
071            joglConfig,
072            this.mail = mail );
073          
074          doubleMap = new HashMap<EnumDouble, Double> ( );
075          
076          joglMoveState = new JoglMoveState ( );
077          
078          joglCameraMut = new JoglCameraImp ( );
079          
080          joglSpinCubeModelImp = new JoglSpinCube.ModelImp ( );
081                
082          joglSpinCubeModelImp.setXYZ ( 0, 0, -10 );
083          
084          joglSpinCubeModelImp.setPerturbationFactor (
085            PERTURBATION_FACTORS [ perturbationFactorIndex ] );
086        }
087         
088        ////////////////////////////////////////////////////////////////////////
089        // interface Accessor methods
090        ////////////////////////////////////////////////////////////////////////
091         
092        public double  get ( final EnumDouble  enumDouble )
093        ////////////////////////////////////////////////////////////////////////
094        {
095          final Double  d = doubleMap.get ( enumDouble );
096          
097          return d == null ? 0 : d.doubleValue ( );
098        }
099        
100        public JoglCamera  getJoglCamera ( )
101        ////////////////////////////////////////////////////////////////////////
102        {
103          return joglCameraMut;
104        }
105        
106        public JoglSpinCube.Model  getJoglSpinCubeModel ( )
107        ////////////////////////////////////////////////////////////////////////
108        {
109          return joglSpinCubeModelImp;
110        }
111        
112        ////////////////////////////////////////////////////////////////////////
113        // lifecycle methods
114        ////////////////////////////////////////////////////////////////////////
115         
116        public void  update ( )
117        ////////////////////////////////////////////////////////////////////////
118        {
119          final int  size = mail.size ( );
120          
121          for ( int  i = 0; i < size; i++ )
122          {
123            final JoglMessage  joglMessage = mail.get ( i );
124            
125            final JoglMessage.Type  type = joglMessage.getType ( );
126             
127            switch ( type )
128            {
129              case CHANGE_PERTURBATION_FACTOR_REQUEST:
130                 
131                perturbationFactorIndex = ( perturbationFactorIndex + 1 )
132                  % PERTURBATION_FACTORS.length;
133                
134                joglSpinCubeModelImp.setPerturbationFactor (
135                  PERTURBATION_FACTORS [ perturbationFactorIndex ] );
136                
137                mail.offer (
138                  JoglMessage.CHANGE_PERTURBATION_FACTOR_EVENT_INSTANCE );
139                 
140                break;
141                
142              case MOVE_REQUEST:
143                
144                processMoveRequest ( ( JoglMoveRequest ) joglMessage );
145                
146                break;
147                 
148              default:
149                
150                // ignore
151            }
152          }
153          
154          joglSpinCubeModelImp.update ( );
155          
156          updateMove ( );
157        }
158        
159        ////////////////////////////////////////////////////////////////////////
160        // private methods
161        ////////////////////////////////////////////////////////////////////////
162        
163        private void  processMoveRequest (
164          final JoglMoveRequest  joglMoveRequest )
165        ////////////////////////////////////////////////////////////////////////
166        {
167          final EnumDirection [ ]  enumDirections = EnumDirection.values ( );
168          
169          for ( final EnumDirection  enumDirection : enumDirections )
170          {
171            joglMoveState.set (
172              enumDirection,
173              joglMoveRequest.get ( enumDirection ) );
174          }
175        }
176    /*    
177        private void  set (
178          final EnumDouble  enumDouble,
179          final double      value )
180        ////////////////////////////////////////////////////////////////////////
181        {
182          doubleMap.put ( enumDouble, new Double ( value ) );
183        }
184    */    
185        private void  updateMove ( )
186        ////////////////////////////////////////////////////////////////////////
187        {
188          int
189            stepX    = 0,
190            stepY    = 0,
191            stepZ    = 0,
192            stepRotX = 0,
193            stepRotY = 0,
194            stepRotZ = 0;
195          
196          final EnumDirection [ ]  enumDirections = EnumDirection.values ( );
197          
198          for ( final EnumDirection  enumDirection : enumDirections )
199          {
200            if ( joglMoveState.get ( enumDirection ) )
201            {
202              switch ( enumDirection )
203              {
204                case BACKWARD:
205                  
206                  stepZ++;
207              
208                  break;
209                  
210                case DOWN:
211                  
212                  stepY--;
213              
214                  break;
215                  
216                case FORWARD:
217              
218                  stepZ--;
219              
220                  break;
221              
222                case LEFT:
223                  
224                  stepX--;
225                  
226                  break;
227                  
228                case PITCH_DOWN:
229                  
230                  stepRotX--;
231                  
232                  break;             
233              
234                case PITCH_UP:
235                  
236                  stepRotX++;
237                  
238                  break;             
239              
240                case RIGHT:
241                  
242                  stepX++;
243                  
244                  break;
245              
246                case ROLL_LEFT:
247                  
248                  stepRotZ++;
249                  
250                  break;             
251              
252                case ROLL_RIGHT:
253                  
254                  stepRotZ--;
255                  
256                  break;             
257              
258                case UP:
259                  
260                  stepY++;
261              
262                  break;
263                  
264                case YAW_LEFT:
265                  
266                  stepRotY++;
267                  
268                  break;             
269              
270                case YAW_RIGHT:
271                  
272                  stepRotY--;
273                  
274                  break;             
275              
276                default:
277               
278                  throw new RuntimeException ( );
279              }
280            }
281          }
282          
283          if ( ( stepX != 0 )
284            || ( stepY != 0 )
285            || ( stepZ != 0 ) )
286          {
287            if ( stepX != 0 )
288            {
289              joglCameraMut.translate (
290                JoglCamera.Axis.X,
291                TRANSLATE_DELTA * stepX );
292            }      
293    
294            if ( stepY != 0 )
295            {
296              joglCameraMut.translate (
297                JoglCamera.Axis.Y,
298                TRANSLATE_DELTA * stepY );
299            }      
300    
301            if ( stepZ != 0 )
302            {
303              joglCameraMut.translate (
304                JoglCamera.Axis.Z,
305                TRANSLATE_DELTA * stepZ );
306            }      
307          }
308          
309          if ( ( stepRotX != 0 )
310            || ( stepRotY != 0 )
311            || ( stepRotZ != 0 ) )
312          {
313            if ( stepRotX != 0 )
314            {
315              joglCameraMut.rotate (
316                JoglCamera.Axis.X,
317                ROTATE_DELTA * stepRotX );
318            }
319    
320            if ( stepRotY != 0 )
321            {
322              joglCameraMut.rotate (
323                JoglCamera.Axis.Y,
324                ROTATE_DELTA * stepRotY );
325            }
326    
327            if ( stepRotZ != 0 )
328            {
329              joglCameraMut.rotate (
330                JoglCamera.Axis.Z,
331                ROTATE_DELTA * stepRotZ );
332            }
333          }
334        }
335         
336        ////////////////////////////////////////////////////////////////////////
337        ////////////////////////////////////////////////////////////////////////
338        }