component specific color modes

This commit is contained in:
SrtHero278
2024-10-27 10:19:06 -07:00
parent 6eb98e80ec
commit fb5540638e
2 changed files with 53 additions and 11 deletions
+6 -1
View File
@@ -1,11 +1,16 @@
<!DOCTYPE codename-engine-alphabet-font>
<alphabetFont fps="24" advance="30" lineGap="70" useColorOffsets="true">
<alphabetFont fps="24" advance="30" lineGap="70" colorMode="offsets">
<spritesheet>menus/alphabet</spritesheet>
<defaultAnim casing="upper">LETTER capital</defaultAnim>
<defaultAnim casing="lower">LETTER lowercase</defaultAnim>
<defaultAnim>LETTER</defaultAnim>
<anim char="g" y="-15">g lowercase</anim>
<anim char="j" y="-15">j lowercase</anim>
<anim char="p" y="-15">p lowercase</anim>
<anim char="q" y="-15">q lowercase</anim>
<anim char="y" y="-15">y lowercase</anim>
<anim char="$">dollarsign</anim>
<anim char="#">hashtag</anim>
<anim char="&amp;">amp</anim>
+47 -10
View File
@@ -26,6 +26,9 @@ final class AlphabetComponent {
public var cos:Float;
public var scaleX:Float;
public var scaleY:Float;
public var hasColorMode:Bool;
public var colorMode:ColorMode;
}
@:structInit
@@ -74,6 +77,27 @@ enum abstract CaseMode(ByteUInt) from ByteUInt to ByteUInt {
}
}
enum abstract ColorMode(ByteInt) from ByteInt to ByteInt {
var TINT = 0;
var OFFSET = 1;
var NONE = 2;
public function setColorTransform(color:openfl.geom.ColorTransform, red:Float, green:Float, blue:Float, alpha:Float) {
var moduloWorkaround:Int = this;
var tintMult = Math.max(-moduloWorkaround + 1, 0);
var tintOffset = Math.min(moduloWorkaround, 1);
var offsetMult = (moduloWorkaround % 2) * 255;
color.redMultiplier = red * tintMult + tintOffset;
color.greenMultiplier = green * tintMult + tintOffset;
color.blueMultiplier = blue * tintMult + tintOffset;
color.redOffset = red * offsetMult;
color.greenOffset = green * offsetMult;
color.blueOffset = blue * offsetMult;
color.alphaMultiplier = alpha;
}
}
class NewAlphabet extends FlxSprite {
public var effects:Array<RegionEffect> = [];
var __renderData:AlphabetRenderData;
@@ -95,7 +119,7 @@ class NewAlphabet extends FlxSprite {
public var originOffset:FlxPoint = FlxPoint.get();
public var font(default, set):String;
var transformMult:ByteUInt = 1; // 1 if multipliers (tint), 0 if offset.
var colorMode:ColorMode = TINT;
var defaultAdvance:Float = 40.0;
var lineGap:Float = 75.0;
var fps:Float = 24.0;
@@ -176,7 +200,6 @@ class NewAlphabet extends FlxSprite {
frameOffset.x -= (textWidth - __laneWidths[0]) * alignmentMultiplier;
var isGraphicsShader = shader != null && shader is flixel.graphics.tile.FlxGraphicsShader;
var offsetMult = (1 - transformMult) * 255;
var ogRed:Float = colorTransform.redMultiplier;
var ogGreen:Float = colorTransform.greenMultiplier;
var ogBlue:Float = colorTransform.blueMultiplier;
@@ -232,10 +255,11 @@ class NewAlphabet extends FlxSprite {
if (isGraphicsShader)
shader.setCamSize(_frame.frame.x, _frame.frame.y, _frame.frame.width, _frame.frame.height);
setColorTransform(
__renderData.red * transformMult, __renderData.green * transformMult, __renderData.blue * transformMult, __renderData.alpha,
Math.round(__renderData.red * offsetMult), Math.round(__renderData.green * offsetMult), Math.round(__renderData.blue * offsetMult), 0
);
if (__component.hasColorMode)
__component.colorMode.setColorTransform(colorTransform, __renderData.red, __renderData.green, __renderData.blue, __renderData.alpha);
else
colorMode.setColorTransform(colorTransform, __renderData.red, __renderData.green, __renderData.blue, __renderData.alpha);
drawLetter(camera);
frameOffset.y -= offsetY;
frameOffset.x -= offsetX;
@@ -429,7 +453,10 @@ class NewAlphabet extends FlxSprite {
shouldRotate: rad != 0,
cos: angleCos,
sin: angleSin
sin: angleSin,
hasColorMode: false,
colorMode: 0
}]
}
@@ -455,6 +482,8 @@ class NewAlphabet extends FlxSprite {
var xOff:Float = -Std.parseFloat(component.get("x")).getDefaultFloat(0.0);
var yOff:Float = Std.parseFloat(component.get("y")).getDefaultFloat(0.0);
var colorMode = ["tint", "offsets", "none"].indexOf(component.get("colorMode"));
components.push({
anim: component.get("anim"),
@@ -465,7 +494,10 @@ class NewAlphabet extends FlxSprite {
shouldRotate: rad != 0,
cos: angleCos,
sin: angleSin
sin: angleSin,
hasColorMode: colorMode >= 0,
colorMode: colorMode
});
}
letterData.set(char, {
@@ -489,6 +521,8 @@ class NewAlphabet extends FlxSprite {
var yOff:Float = Std.parseFloat(node.get("y")).getDefaultFloat(0.0);
var advance:Float = Std.parseFloat(node.get("advance"));
var colorMode = ["tint", "offsets", "none"].indexOf(node.get("colorMode"));
letterData.set(char, {
isDefault: false,
advance: advance,
@@ -503,7 +537,10 @@ class NewAlphabet extends FlxSprite {
shouldRotate: rad != 0,
cos: angleCos,
sin: angleSin
sin: angleSin,
hasColorMode: colorMode >= 0,
colorMode: colorMode
}]
});
case "languageSection": // used to only parse characters if a specific language is selected
@@ -547,7 +584,7 @@ class NewAlphabet extends FlxSprite {
lineGap = Std.parseFloat(xml.get("lineGap")).getDefaultFloat(75.0);
fps = Std.parseFloat(xml.get("fps")).getDefaultFloat(24.0);
forceCase = xml.get("forceCasing").getDefault("none").toLowerCase();
transformMult = (xml.get("useColorOffsets") == "true") ? 0 : 1;
colorMode = (["offsets", "none"].indexOf(xml.get("colorMode")) + 1);
frames = null;