Added support for colorization to the character manager. It is yet

untested.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@1102 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Michael Bayne
2002-03-08 07:50:32 +00:00
parent c2baccf5ba
commit 782bd9b7d9
5 changed files with 167 additions and 21 deletions
@@ -1,5 +1,5 @@
//
// $Id: CharacterDescriptor.java,v 1.4 2001/11/27 08:09:34 mdb Exp $
// $Id: CharacterDescriptor.java,v 1.5 2002/03/08 07:50:32 mdb Exp $
package com.threerings.cast;
@@ -13,11 +13,19 @@ import com.samskivert.util.StringUtil;
public class CharacterDescriptor
{
/**
* Constructs the character descriptor.
* Constructs a character descriptor.
*
* @param components the component ids of the individual components
* that make up this character.
* @param zations the colorizations to apply to each of the character
* component images when compositing actions (an array of
* colorizations for each component). This can be null if image
* recolorization is not desired.
*/
public CharacterDescriptor (int[] components)
public CharacterDescriptor (int[] components, Colorization[][] zations)
{
_components = components;
_zations = zations;
}
/**
@@ -29,6 +37,16 @@ public class CharacterDescriptor
return _components;
}
/**
* Returns an array of colorization arrays to be applied to the
* components when compositing action images (one array per
* component).
*/
public Colorization[][] getColorizations ()
{
return _zations;
}
/**
* Compute a sensible hashcode for this object.
*/
@@ -46,12 +64,34 @@ public class CharacterDescriptor
*/
public boolean equals (Object other)
{
if (other instanceof CharacterDescriptor) {
return Arrays.equals(_components,
((CharacterDescriptor)other)._components);
} else {
if (!(other instanceof CharacterDescriptor)) {
return false;
}
// both the component ids and the colorizations must be equal
CharacterDescriptor odesc = (CharacterDescriptor)other;
if (!Arrays.equals(_components, odesc._components)) {
return false;
}
// if neither has colorizations, we're clear
Colorization[][] zations = odesc._zations;
if (zations == null && _zations == null) {
return true;
}
// otherwise, all of the colorizations must be equal as well
int zlength = _zations.length;
if (zlength != zations.length) {
return false;
}
for (int i = 0; i < zlength; i++) {
if (!Arrays.equals(_zations[i], zations[i])) {
return false;
}
}
return true;
}
/**
@@ -59,9 +99,13 @@ public class CharacterDescriptor
*/
public String toString ()
{
return "[cids=" + StringUtil.toString(_components) + "]";
return "[cids=" + StringUtil.toString(_components) +
", colors=" + StringUtil.toString(_zations) + "]";
}
/** The component identifiers comprising the character. */
protected int[] _components;
/** The colorizations to apply when compositing this character. */
protected Colorization[][] _zations;
}
@@ -1,5 +1,5 @@
//
// $Id: CharacterManager.java,v 1.14 2002/02/10 00:05:36 shaper Exp $
// $Id: CharacterManager.java,v 1.15 2002/03/08 07:50:32 mdb Exp $
package com.threerings.cast;
@@ -178,25 +178,53 @@ public class CharacterManager
{
MultiFrameImage[] frames = new MultiFrameImage[Sprite.DIRECTION_COUNT];
// obtain the necessary components
int[] cids = descrip.getComponentIds();
int ccount = cids.length;
CharacterComponent[] components = new CharacterComponent[ccount];
Colorization[][] zations = descrip.getColorizations();
// obtain the necessary components
ColorizedComponent[] components = new ColorizedComponent[ccount];
for (int i = 0; i < ccount; i++) {
components[i] = _crepo.getComponent(cids[i]);
ColorizedComponent cc = new ColorizedComponent();
cc.component = _crepo.getComponent(cids[i]);
if (zations != null) {
cc.zations = zations[i];
}
components[i] = cc;
}
// sort them into the proper rendering order
Arrays.sort(components, ComponentClass.RENDER_COMP);
Arrays.sort(components);
// now composite the component frames, one atop the next
// now composite the component frames, one atop the next; using
// the colorizations if we have them
for (int i = 0; i < ccount; i++) {
TileUtil.compositeFrames(frames, components[i].getFrames(action));
ColorizedComponent cc = components[i];
TileUtil.compositeFrames(
frames, cc.component.getFrames(action), cc.zations);
}
return frames;
}
/** Used when compositing component frame images. */
protected static final class ColorizedComponent implements Comparable
{
/** The component to be colorized. */
public CharacterComponent component;
/** The colorizations to apply. */
public Colorization[] zations;
/** Sorts by render order. */
public int compareTo (Object o)
{
ColorizedComponent co = (ColorizedComponent)o;
return (component.componentClass.renderPriority -
co.component.componentClass.renderPriority);
}
}
/** The component repository. */
protected ComponentRepository _crepo;
@@ -1,5 +1,5 @@
//
// $Id: SpritePanel.java,v 1.10 2002/01/11 16:17:33 shaper Exp $
// $Id: SpritePanel.java,v 1.11 2002/03/08 07:50:32 mdb Exp $
package com.threerings.cast.builder;
@@ -89,7 +89,7 @@ public class SpritePanel
protected void generateSprite ()
{
int components[] = _model.getSelectedComponents();
CharacterDescriptor desc = new CharacterDescriptor(components);
CharacterDescriptor desc = new CharacterDescriptor(components, null);
CharacterSprite sprite = _charmgr.getCharacter(desc);
setSprite(sprite);
}
@@ -1,15 +1,17 @@
//
// $Id: TileUtil.java,v 1.8 2002/02/24 02:20:43 mdb Exp $
// $Id: TileUtil.java,v 1.9 2002/03/08 07:50:32 mdb Exp $
package com.threerings.cast.util;
import java.awt.Image;
import java.awt.image.BufferedImage;
import com.threerings.media.sprite.MultiFrameImage;
import com.threerings.media.sprite.Sprite;
import com.threerings.media.util.ImageUtil;
import com.threerings.cast.Log;
import com.threerings.cast.Colorization;
/**
* Miscellaneous tile-related utility functions.
@@ -19,13 +21,16 @@ public class TileUtil
/**
* Renders each of the given <code>src</code> component frames into
* the corresponding frames of <code>dest</code>, allocating blank
* image frames for <code>dest</code> if none yet exist.
* image frames for <code>dest</code> if none yet exist. If
* <code>zations</code> is not null, the provided list of
* colorizations will be applied as well.
*
* @throws IllegalArgumentException if the frame count of the source
* and destination images don't match.
*/
public static void compositeFrames (
MultiFrameImage[] dest, MultiFrameImage[] src)
MultiFrameImage[] dest, MultiFrameImage[] src,
Colorization[] zations)
{
for (int orient = 0; orient < Sprite.DIRECTION_COUNT; orient++) {
MultiFrameImage sframes = src[orient];
@@ -48,7 +53,18 @@ public class TileUtil
// slap the images together
for (int ii = 0; ii < dsize; ii++) {
Image dimg = dframes.getFrame(ii);
Image simg = sframes.getFrame(ii);
BufferedImage simg = (BufferedImage)sframes.getFrame(ii);
// recolor the source image
if (zations != null) {
for (int i = 0; i < zations.length; i++) {
Colorization cz = zations[i];
simg = ImageUtil.recolorImage(
simg, cz.rootColor, cz.range, cz.offsets);
}
}
// now splat the recolored image onto the target
dimg.getGraphics().drawImage(simg, 0, 0, null);
}
}
@@ -0,0 +1,58 @@
//
// $Id: Colorization.java,v 1.1 2002/03/08 07:50:32 mdb Exp $
package com.threerings.cast;
import java.awt.Color;
/**
* Used to support colorization of character component images.
*/
public class Colorization
{
/** Every colorization must have a unique name that can be used to
* compare a particular colorization record with another. */
public String name;
/** The root color for the colorization. */
public Color rootColor;
/** The range around the root color that will be colorized (in
* delta-hue, delta-saturation, delta-value. */
public float[] range;
/** The adjustments to make to hue, saturation and value. */
public float[] offsets;
/**
* Constructs a colorization record with the specified name.
*/
public Colorization (String name, Color rootColor,
float[] range, float[] offsets)
{
this.name = name;
this.rootColor = rootColor;
this.range = range;
this.offsets = offsets;
}
/**
* Compares this colorization to another based on name.
*/
public boolean equals (Object other)
{
if (other instanceof Colorization) {
return ((Colorization)other).name.equals(name);
} else {
return false;
}
}
/**
* Returns a string representation of this colorization.
*/
public String toString ()
{
return name;
}
}