/src/away3d/materials/methods/ColorMatrixMethod.as

http://github.com/away3d/away3d-core-fp11 · ActionScript · 103 lines · 66 code · 15 blank · 22 comment · 2 complexity · a82ff0ed89b3bc492d2b959a3ccc4b5d MD5 · raw file

  1. package away3d.materials.methods
  2. {
  3. import away3d.arcane;
  4. import away3d.core.managers.Stage3DProxy;
  5. import away3d.materials.compilation.ShaderRegisterCache;
  6. import away3d.materials.compilation.ShaderRegisterElement;
  7. use namespace arcane;
  8. /**
  9. * ColorMatrixMethod provides a shading method that changes the colour of a material analogous to a ColorMatrixFilter.
  10. */
  11. public class ColorMatrixMethod extends EffectMethodBase
  12. {
  13. private var _matrix:Array;
  14. /**
  15. * Creates a new ColorTransformMethod.
  16. *
  17. * @param matrix An array of 20 items for 4 x 5 color transform.
  18. */
  19. public function ColorMatrixMethod(matrix:Array)
  20. {
  21. super();
  22. if (matrix.length != 20)
  23. throw new Error("Matrix length must be 20!");
  24. _matrix = matrix;
  25. }
  26. /**
  27. * The 4 x 5 matrix to transform the color of the material.
  28. */
  29. public function get colorMatrix():Array
  30. {
  31. return _matrix;
  32. }
  33. public function set colorMatrix(value:Array):void
  34. {
  35. _matrix = value;
  36. }
  37. /**
  38. * @inheritDoc
  39. */
  40. override arcane function getFragmentCode(vo:MethodVO, regCache:ShaderRegisterCache, targetReg:ShaderRegisterElement):String
  41. {
  42. var code:String = "";
  43. var colorMultReg:ShaderRegisterElement = regCache.getFreeFragmentConstant();
  44. regCache.getFreeFragmentConstant();
  45. regCache.getFreeFragmentConstant();
  46. regCache.getFreeFragmentConstant();
  47. var colorOffsetReg:ShaderRegisterElement = regCache.getFreeFragmentConstant();
  48. vo.fragmentConstantsIndex = colorMultReg.index*4;
  49. code += "m44 " + targetReg + ", " + targetReg + ", " + colorMultReg + "\n" +
  50. "add " + targetReg + ", " + targetReg + ", " + colorOffsetReg + "\n";
  51. return code;
  52. }
  53. /**
  54. * @inheritDoc
  55. */
  56. override arcane function activate(vo:MethodVO, stage3DProxy:Stage3DProxy):void
  57. {
  58. var matrix:Array = _matrix;
  59. var index:int = vo.fragmentConstantsIndex;
  60. var data:Vector.<Number> = vo.fragmentData;
  61. // r
  62. data[index] = matrix[0];
  63. data[index + 1] = matrix[1];
  64. data[index + 2] = matrix[2];
  65. data[index + 3] = matrix[3];
  66. // g
  67. data[index + 4] = matrix[5];
  68. data[index + 5] = matrix[6];
  69. data[index + 6] = matrix[7];
  70. data[index + 7] = matrix[8];
  71. // b
  72. data[index + 8] = matrix[10];
  73. data[index + 9] = matrix[11];
  74. data[index + 10] = matrix[12];
  75. data[index + 11] = matrix[13];
  76. // a
  77. data[index + 12] = matrix[15];
  78. data[index + 13] = matrix[16];
  79. data[index + 14] = matrix[17];
  80. data[index + 15] = matrix[18];
  81. // rgba offset
  82. data[index + 16] = matrix[4];
  83. data[index + 17] = matrix[9];
  84. data[index + 18] = matrix[14];
  85. data[index + 19] = matrix[19];
  86. }
  87. }
  88. }