As part of the second pass on AS recoloring, setup recoloring scenes appropriately.

git-svn-id: svn+ssh://src.earth.threerings.net/vilya/trunk@935 c613c5cb-e716-0410-b11b-feb51c14d237
This commit is contained in:
Mike Thomas
2010-07-07 18:05:54 +00:00
parent 338f292e6f
commit 7272ec222a
5 changed files with 276 additions and 2 deletions
@@ -0,0 +1,170 @@
//
// Vilya library - tools for developing networked games
// Copyright (C) 2002-2010 Three Rings Design, Inc., All Rights Reserved
// http://www.threerings.net/code/vilya/
//
// This library is free software; you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License as published
// by the Free Software Foundation; either version 2.1 of the License, or
// (at your option) any later version.
//
// This library 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
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
package com.threerings.stage.client {
import com.threerings.media.image.ClassRecord;
import com.threerings.media.image.ColorPository;
import com.threerings.media.image.ColorRecord;
import com.threerings.media.image.Colorization;
import com.threerings.stage.data.StageScene;
import com.threerings.miso.data.ObjectInfo;
import com.threerings.media.tile.Colorizer;
import com.threerings.util.Log;
import com.threerings.util.Maps;
import com.threerings.util.Map;
/**
* Handles colorization of object tiles in a scene.
*/
public class SceneColorizer implements Colorizer
{
private var log :Log = Log.getLog(SceneColorizer);
/**
* Creates a scene colorizer for the supplied scene.
*/
public function SceneColorizer (cpos :ColorPository, scene :StageScene)
{
_cpos = cpos;
_scene = scene;
// enumerate the color ids for all possible colorization classes
for each (var colClass :ClassRecord in _cpos.getClasses()) {
_cids.put(colClass.name, _cpos.getColorIds(colClass.name));
}
}
/**
* Set an auxiliary colorizer that overrides our colorizations.
*/
public function setAuxiliary (aux :Colorizer) :void
{
_aux = aux;
}
/**
* Obtains a colorizer for the supplied scene object.
*/
public function getColorizer (oinfo :ObjectInfo) :Colorizer
{
// if the object has no custom colorizations, return the default
// colorizer
if (oinfo.zations == 0) {
return this;
}
// otherwise create a custom colorizer that returns this object's
// custom colorization assignments
return new BaseColorizer(oinfo, this, _cpos);
}
// documentation inherited from interface Colorizer
public function getColorization (index :int, zation :String) :Colorization
{
// This method is called when an object in the scene has no colorization
// of its own defined for a particular color class.
if (_aux != null) {
var c :Colorization = _aux.getColorization(index, zation);
if (c != null) {
return c;
}
}
return _cpos.getColorizationByNameAndId(zation, getColorId(zation));
}
/**
* Get the colorId to use for the specified colorization.
*/
public function getColorId (zation :String) :int
{
// 1. We see if the scene contains a default color we should use.
var rec :ClassRecord = _cpos.getClassRecordByName(zation);
var colorId :int = _scene.getDefaultColor(rec.classId);
if (colorId == -1) {
// 2. If the scene does not contain a color, see if a default
// is defined for that color class.
var def :ColorRecord = rec.getDefault();
if (def != null) {
return def.colorId;
}
// 3. If there are no defaults whatsoever, just hash on the zoneId.
var cids :Array= _cids.get(zation);
if (cids == null) {
log.warning("Zoiks, have no colorizations for '" + zation + "'.");
return -1;
} else {
colorId = cids[_scene.getZoneId() % cids.length];
}
}
return colorId;
}
/** An auxiliary colorizer which may temporarily return
* non-standard colorizations. */
protected var _aux :Colorizer;
/** The entity from which we obtain colorization info. */
protected var _cpos :ColorPository;
/** The scene for which we're providing zations. */
protected var _scene :StageScene;
/** Contains our colorization class information. */
protected var _cids :Map = Maps.newMapOf(String);
}
}
import com.threerings.media.image.Colorization;
import com.threerings.media.image.ColorPository;
import com.threerings.media.tile.Colorizer;
import com.threerings.miso.data.ObjectInfo;
import com.threerings.stage.client.SceneColorizer;
class BaseColorizer implements Colorizer {
public function BaseColorizer (oInfo :ObjectInfo, defColorizer :SceneColorizer,
cpos :ColorPository)
{
_oInfo = oInfo;
_defColorizer = defColorizer;
_cpos = cpos;
}
public function getColorization (index :int, zation :String) :Colorization {
var colorId :int = 0;
switch (index) {
case 0: colorId = _oInfo.getPrimaryZation(); break;
case 1: colorId = _oInfo.getSecondaryZation(); break;
case 2: colorId = _oInfo.getTertiaryZation(); break;
case 3: colorId = _oInfo.getQuaternaryZation(); break;
}
if (colorId == 0) {
return _defColorizer.getColorization(index, zation);
} else {
return _cpos.getColorizationByNameAndId(zation, colorId);
}
}
protected var _oInfo :ObjectInfo;
protected var _defColorizer :SceneColorizer;
protected var _cpos :ColorPository;
}
@@ -21,9 +21,14 @@
package com.threerings.stage.client { package com.threerings.stage.client {
import com.threerings.util.Controller; import com.threerings.util.Controller;
import com.threerings.util.Log;
import com.threerings.whirled.data.SceneUpdate; import com.threerings.whirled.data.SceneUpdate;
import com.threerings.media.tile.Colorizer;
import com.threerings.miso.client.MisoScenePanel; import com.threerings.miso.client.MisoScenePanel;
import com.threerings.miso.data.ObjectInfo;
import com.threerings.miso.util.MisoSceneMetrics; import com.threerings.miso.util.MisoSceneMetrics;
import com.threerings.stage.data.StageMisoSceneModel;
import com.threerings.stage.data.StageScene;
import com.threerings.stage.util.StageContext; import com.threerings.stage.util.StageContext;
/** /**
@@ -31,14 +36,50 @@ import com.threerings.stage.util.StageContext;
*/ */
public class StageScenePanel extends MisoScenePanel public class StageScenePanel extends MisoScenePanel
{ {
private var log :Log = Log.getLog(StageScenePanel);
public function StageScenePanel (ctx :StageContext, ctrl :Controller, metrics :MisoSceneMetrics) public function StageScenePanel (ctx :StageContext, ctrl :Controller, metrics :MisoSceneMetrics)
{ {
super(ctx, metrics); super(ctx, metrics);
_sCtx = ctx;
}
public function setScene (scene :StageScene) :void
{
_scene = scene;
if (_scene != null) {
_rizer = new SceneColorizer(_sCtx.getColorPository(), _scene);
recomputePortals();
setSceneModel(StageMisoSceneModel.getSceneModel(scene.getSceneModel()));
} else {
log.warning("Zoiks! We can't display a null scene!");
// TODO: display something to the user letting them know that
// we're so hosed that we don't even know what time it is
}
}
public function recomputePortals () :void
{
// TODO
} }
public function sceneUpdated (update :SceneUpdate) :void public function sceneUpdated (update :SceneUpdate) :void
{ {
// TODO // TODO
} }
protected override function getColorizer (oinfo :ObjectInfo) :Colorizer
{
return _rizer.getColorizer(oinfo);
}
/** The scene we're presenting in our panel. */
protected var _scene :StageScene;
/** Used to recolor any tiles in our scene. */
protected var _rizer :SceneColorizer;
/** Our appropriately-cast stage client context. */
protected var _sCtx :StageContext;
} }
} }
@@ -0,0 +1,58 @@
//
// Vilya library - tools for developing networked games
// Copyright (C) 2002-2010 Three Rings Design, Inc., All Rights Reserved
// http://www.threerings.net/code/vilya/
//
// This library is free software; you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License as published
// by the Free Software Foundation; either version 2.1 of the License, or
// (at your option) any later version.
//
// This library 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
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
package com.threerings.stage.data {
import com.threerings.crowd.data.PlaceConfig;
import com.threerings.whirled.data.SceneImpl;
public class StageScene extends SceneImpl
{
public function StageScene (model :StageSceneModel, config :PlaceConfig)
{
super(model, config);
_ssModel = model;
}
/**
* Get the default color id to use for the specified colorization class,
* or -1 if no default is set.
*/
public function getDefaultColor (classId :int) :int
{
return _ssModel.getDefaultColor(classId);
}
/**
* Set the default color to use for the specified colorization class id.
* Setting the colorId to -1 disables the default.
*/
public function setDefaultColor (classId :int, colorId :int) :void
{
_ssModel.setDefaultColor(classId, colorId);
}
public function getZoneId () :int
{
return _ssModel.zoneId;
}
protected var _ssModel :StageSceneModel;
}
}
@@ -25,6 +25,7 @@ import com.threerings.io.ObjectInputStream;
import com.threerings.io.ObjectOutputStream; import com.threerings.io.ObjectOutputStream;
import com.threerings.stage.data.StageSceneModel; import com.threerings.stage.data.StageSceneModel;
import com.threerings.util.Integer;
import com.threerings.util.StreamableHashMap; import com.threerings.util.StreamableHashMap;
import com.threerings.whirled.spot.data.SpotSceneModel; import com.threerings.whirled.spot.data.SpotSceneModel;
import com.threerings.whirled.data.SceneModel; import com.threerings.whirled.data.SceneModel;
@@ -88,7 +89,7 @@ public class StageSceneModel extends SceneModel
public function getDefaultColor (classId :int) :int public function getDefaultColor (classId :int) :int
{ {
if (defaultColors != null) { if (defaultColors != null) {
return defaultColors.get(classId); return defaultColors.get(new Integer(classId));
} }
return -1; return -1;
} }
@@ -1,5 +1,6 @@
package com.threerings.stage.util { package com.threerings.stage.util {
import com.threerings.media.image.ColorPository;
import com.threerings.miso.util.MisoContext; import com.threerings.miso.util.MisoContext;
/** /**
@@ -8,6 +9,9 @@ import com.threerings.miso.util.MisoContext;
*/ */
public interface StageContext extends MisoContext public interface StageContext extends MisoContext
{ {
/**
* Returns a reference to the colorization repository.
*/
function getColorPository () :ColorPository;
} }
} }