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="https://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 }