/**
* Copyright (C) 2013 Gundog Studios LLC.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.godsandtowers.messaging;
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import com.godsandtowers.graphics.GameSurface;
import com.godsandtowers.graphics.ModelFetcher;
import com.gundogstudios.gl.CombinedModel;
import com.gundogstudios.gl.Sprite;
import com.gundogstudios.modules.Modules;
public class GLHandler implements GLMessageProcessor {
private GameSurface surface;
private ExecutorService executor;
public GLHandler(GameSurface surface) {
this.surface = surface;
executor = Executors.newSingleThreadExecutor();
}
@SuppressWarnings("unchecked")
@Override
public void process(final int what, final Object[] object) {
final ModelFetcher modelFetcher = surface.getModelFetcher();
int player;
switch (what) {
case ADD_SPRITE:
executor.execute(new Runnable() {
@Override
public void run() {
try {
int player = (Integer) object[0];
Sprite addSprite = (Sprite) object[1];
CombinedModel model = modelFetcher.getModel(addSprite);
surface.addSprite(player, addSprite, model);
} catch (OutOfMemoryError e) {
Modules.MESSENGER.submit(ApplicationMessageProcessor.ID,
ApplicationMessageProcessor.LOWER_GRAPHICS);
}
}
});
break;
case REMOVE_SPRITE:
player = (Integer) object[0];
Sprite removeSprite = (Sprite) object[1];
surface.removeSprite(player, removeSprite);
break;
case ADD_TRANSPARENT_SPRITE:
executor.execute(new Runnable() {
@Override
public void run() {
try {
int player = (Integer) object[0];
Sprite addTransparentSprite = (Sprite) object[1];
CombinedModel model = modelFetcher.getModel(addTransparentSprite,
(object.length > 2) ? object[2] : 1f);
surface.addTransparentSprite(player, addTransparentSprite, model);
} catch (OutOfMemoryError e) {
Modules.MESSENGER.submit(ApplicationMessageProcessor.ID,
ApplicationMessageProcessor.LOWER_GRAPHICS);
}
}
});
break;
case REMOVE_TRANSPARENT_SPRITE:
player = (Integer) object[0];
Sprite removeTransparentSprite = (Sprite) object[1];
surface.removeTransparentSprite(player, removeTransparentSprite);
break;
case ADD_SPRITE_BATCH:
executor.execute(new Runnable() {
@Override
public void run() {
try {
int player = (Integer) object[0];
for (Sprite sprite : (ArrayList<Sprite>) object[1]) {
CombinedModel model = modelFetcher.getModel(sprite);
surface.addSprite(player, sprite, model);
}
} catch (OutOfMemoryError e) {
Modules.MESSENGER.submit(ApplicationMessageProcessor.ID,
ApplicationMessageProcessor.LOWER_GRAPHICS);
}
}
});
break;
case REMOVE_SPRITE_BATCH:
player = (Integer) object[0];
for (Sprite sprite : (ArrayList<Sprite>) object[1]) {
surface.removeSprite(player, sprite);
}
break;
case ADD_TRANSPARENT_SPRITE_BATCH:
executor.execute(new Runnable() {
@Override
public void run() {
try {
int player = (Integer) object[0];
for (Sprite sprite : (ArrayList<Sprite>) object[1]) {
CombinedModel model = modelFetcher.getModel(sprite);
surface.addTransparentSprite(player, sprite, model);
}
} catch (OutOfMemoryError e) {
Modules.MESSENGER.submit(ApplicationMessageProcessor.ID,
ApplicationMessageProcessor.LOWER_GRAPHICS);
}
}
});
break;
case REMOVE_TRANSPARENT_SPRITE_BATCH:
player = (Integer) object[0];
for (Sprite sprite : (ArrayList<Sprite>) object[1]) {
surface.removeTransparentSprite(player, sprite);
}
break;
case PREVIOUS_BOARD:
surface.previousBoard();
break;
case NEXT_BOARD:
surface.nextBoard();
break;
case ZOOM_IN:
surface.zoomIn();
break;
case ZOOM_OUT:
surface.zoomOut();
break;
case ROTATE_UP:
surface.rotateUp();
break;
case ROTATE_DOWN:
surface.rotateDown();
break;
case RESET_VIEW:
surface.resetView();
break;
case UPDATE_TRANSLATION:
surface.updateTrans((Float) object[0], (Float) object[1], (Float) object[2]);
break;
case SHUTDOWN:
executor.shutdownNow();
break;
default:
Modules.LOG.error("GLHandler", "Unknown message " + what);
}
}
}