Fixed: A3DUtils.dissassemble outputs correct swizzle string for dp3, dp4, tex operator sources

This commit is contained in:
unknown
2012-06-30 17:16:52 +06:00
parent 2145cd2887
commit b785261ee4

View File

@@ -243,14 +243,23 @@ package alternativa.engine3d.materials {
var destNumber:uint = byteCode.readUnsignedShort(); var destNumber:uint = byteCode.readUnsignedShort();
var swizzle:uint = byteCode.readByte(); var swizzle:uint = byteCode.readByte();
var s:String = ""; var s:String = "";
var destSwizzle:uint = 0; var destSwizzle:uint = 4;
if (swizzle < 15) { if (swizzle < 15) {
s += "."; s += ".";
s += ((swizzle & 0x1) > 0) ? "x" : ""; s += ((swizzle & 0x1) > 0) ? "x" : "";
s += ((swizzle & 0x2) > 0) ? "y" : ""; s += ((swizzle & 0x2) > 0) ? "y" : "";
s += ((swizzle & 0x4) > 0) ? "z" : ""; s += ((swizzle & 0x4) > 0) ? "z" : "";
s += ((swizzle & 0x8) > 0) ? "w" : ""; s += ((swizzle & 0x8) > 0) ? "w" : "";
destSwizzle = s.length; destSwizzle = s.length - 1;
}
var sourceSwizzleLimit:int = destSwizzle;
if (cmd == CommandType.TEX) {
sourceSwizzleLimit = 2;
} else if (cmd == CommandType.DP3) {
sourceSwizzleLimit = 3;
} else if (cmd == CommandType.DP4) {
sourceSwizzleLimit = 4;
} }
var destType:String = VariableType.TYPE_NAMES[byteCode.readUnsignedByte()].charAt(0); var destType:String = VariableType.TYPE_NAMES[byteCode.readUnsignedByte()].charAt(0);
@@ -260,18 +269,15 @@ package alternativa.engine3d.materials {
result = command + " " + attachProgramPrefix(destType, programType) + destNumber.toString() + s + ", "; result = command + " " + attachProgramPrefix(destType, programType) + destNumber.toString() + s + ", ";
} }
result += attachProgramPrefix(getSourceVariable(byteCode, destSwizzle), programType); result += attachProgramPrefix(getSourceVariable(byteCode, sourceSwizzleLimit), programType);
if (twoOperandsCommands[cmd]) { if (twoOperandsCommands[cmd]) {
if (cmd == 0x28) { if (cmd == CommandType.TEX) {
result += ", " + attachProgramPrefix(getSamplerVariable(byteCode), programType); result += ", " + attachProgramPrefix(getSamplerVariable(byteCode), programType);
} else {
result += ", " + attachProgramPrefix(getSourceVariable(byteCode, sourceSwizzleLimit), programType);
} }
else { } else {
result += ", " + attachProgramPrefix(getSourceVariable(byteCode, destSwizzle), programType);
}
}
else {
byteCode.readDouble(); byteCode.readDouble();
} }
return result; return result;
@@ -296,10 +302,10 @@ package alternativa.engine3d.materials {
+ ", " + samplerFilter[(n >> 4) & 0xf] + ", " + samplerMipmap[n & 0xf] + ">"; + ", " + samplerFilter[(n >> 4) & 0xf] + ", " + samplerMipmap[n & 0xf] + ">";
} }
private static function getSourceVariable(byteCode:ByteArray, destSwizzle:uint):String { private static function getSourceVariable(byteCode:ByteArray, swizzleLimit:uint):String {
var s1Number:uint = byteCode.readUnsignedShort(); var s1Number:uint = byteCode.readUnsignedShort();
var offset:uint = byteCode.readUnsignedByte(); var offset:uint = byteCode.readUnsignedByte();
var s:String = getSourceSwizzle(byteCode.readUnsignedByte(), destSwizzle); var s:String = getSourceSwizzle(byteCode.readUnsignedByte(), swizzleLimit);
var s1Type:String = VariableType.TYPE_NAMES[byteCode.readUnsignedByte()].charAt(0); var s1Type:String = VariableType.TYPE_NAMES[byteCode.readUnsignedByte()].charAt(0);
var indexType:String = VariableType.TYPE_NAMES[byteCode.readUnsignedByte()].charAt(0); var indexType:String = VariableType.TYPE_NAMES[byteCode.readUnsignedByte()].charAt(0);
@@ -311,7 +317,7 @@ package alternativa.engine3d.materials {
return s1Type + s1Number.toString() + s; return s1Type + s1Number.toString() + s;
} }
private static function getSourceSwizzle(swizzle:uint, destSwizzle:uint):String { private static function getSourceSwizzle(swizzle:uint, swizzleLimit:uint = 4):String {
var s:String = ""; var s:String = "";
if (swizzle != 0xe4) { if (swizzle != 0xe4) {
s += "."; s += ".";
@@ -319,7 +325,7 @@ package alternativa.engine3d.materials {
s += swizzleType[(swizzle >> 2) & 0x3]; s += swizzleType[(swizzle >> 2) & 0x3];
s += swizzleType[(swizzle >> 4) & 0x3]; s += swizzleType[(swizzle >> 4) & 0x3];
s += swizzleType[(swizzle >> 6) & 0x3]; s += swizzleType[(swizzle >> 6) & 0x3];
s = s.substring(0, destSwizzle > 0 ? destSwizzle : s.length); s = swizzleLimit < 4 ? s.substring(0, swizzleLimit + 1) : s;
} }
return s; return s;
} }