RegisterMap.fxh 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. //////////////////////////////////////////////////////////////////////////////
  2. // ©2008 Electronic Arts Inc
  3. //
  4. // Register Mapping header
  5. //////////////////////////////////////////////////////////////////////////////
  6. #ifndef _REGISTERMAP_FXH_
  7. #define _REGISTERMAP_FXH_
  8. //////////////////////////////////////////////////////////////////////////////
  9. // Define to indicate whether to use indirect constant or not
  10. //////////////////////////////////////////////////////////////////////////////
  11. #if !defined(EA_PLATFORM_PS3) && !defined(_3DSMAX_)
  12. #define USE_INDIRECT_CONSTANT
  13. #endif // !defined(_3DSMAX_)
  14. //////////////////////////////////////////////////////////////////////////////
  15. // Float constant registers
  16. //////////////////////////////////////////////////////////////////////////////
  17. // Why are these register numbers all over the place? Why not just declare them starting with 0 upwards?
  18. // There is a problem with PS2.0 shaders: They can only support 32 constant registers.
  19. // In total we have much more than that, but our PS2.0 shaders themselves use less than 32 registers.
  20. // By moving all the registers we need in PS2.0 into the range of 0-31 these shaders compile.
  21. // All registers that are not used there then can be put into the range above 32 without problems.
  22. // To leave the largest possible "unmapped" area in the middle, let's assign those registers backwards from 255.
  23. // Skinning
  24. #define MaxSkinningBones 64 // Every bone uses 2 registers each, ie 128 registers total
  25. #define REGISTER_SKINNING_BONE_TRANSFORMS 128 // up to 255
  26. #define REGISTER_NON_SKINNING_WORLD_MATRIX_FIRST 124
  27. #define REGISTER_NON_SKINNING_WORLD_MATRIX_LAST 127
  28. // Camera related
  29. #define REGISTER_CAMERA_POSITION 123
  30. #define REGISTER_VIEWPROJECTION_MATRIX_FIRST 119
  31. #define REGISTER_VIEWPROJECTION_MATRIX_LAST 122
  32. // Color
  33. #define REGISTER_RECOLOR_COLOR 0
  34. #define REGISTER_OPACITY_OVERRIDE 1
  35. #define REGISTER_TINT_COLOR 2
  36. // Cloud related
  37. #define REGISTER_CLOUD_SETUP 117 // 2 registers used
  38. #define REGISTER_NO_CLOUD_MULTIPLIER 3
  39. // Shadowmap
  40. #define REGISTER_MAT_WORLD_TO_SHADOW 113 // 4 registers
  41. // Lighting
  42. #define REGISTER_AMBIENT_LIGHT_COLOR 4
  43. #define REGISTER_DIRECTIONAL_LIGHTS_FIRST 5 // 6 registers
  44. #define REGISTER_DIRECTIONAL_LIGHTS_LAST 10
  45. #define REGISTER_POINT_LIGHTS_FIRST 89 // 24 registers
  46. #define REGISTER_POINT_LIGHTS_LAST 112
  47. //////////////////////////////////////////////////////////////////////////////
  48. // Integer constant registers
  49. //////////////////////////////////////////////////////////////////////////////
  50. #define IREGISTER_NUM_POINT_LIGHTS 0
  51. #define IREGISTER_NUM_SHADOWS 1
  52. //////////////////////////////////////////////////////////////////////////////
  53. // Boolean constant registers
  54. //////////////////////////////////////////////////////////////////////////////
  55. #define BREGISTER_HAS_RECOLOR_COLORS 0
  56. #define BREGISTER_HAS_SHADOW 1
  57. //////////////////////////////////////////////////////////////////////////////
  58. // Macros
  59. //////////////////////////////////////////////////////////////////////////////
  60. #define REGISTER_EVAL(x) register(c##x)
  61. #define REGISTER_EVAL_PS(x) register(ps, c##x)
  62. #define REGISTER_EVAL_VS(x) register(vs, c##x)
  63. // This file can be included in both shader and C++ code
  64. #if defined(__cplusplus)
  65. #if defined(USE_INDIRECT_CONSTANT)
  66. #define REGISTER_BIND(registerIndex, variableType, variableName, annotations, initializer) REGISTER_INDIRECT_CONSTANT(variableName)
  67. #define REGISTER_BIND_ARRAY(registerIndex, variableType, variableName, numArrayElements, annotations, initializer) REGISTER_INDIRECT_CONSTANT(variableName)
  68. #define REGISTER_BIND_ARRAY_VS(registerIndex, variableType, variableName, numArrayElements, annotations, initializer) REGISTER_INDIRECT_CONSTANT(variableName)
  69. #define REGISTER_BIND_INT(registerIndex, variableType, variableName, annotations, initializer) REGISTER_INDIRECT_CONSTANT(variableName)
  70. #define REGISTER_BIND_BOOL(registerIndex, variableType, variableName, annotations, initializer) REGISTER_INDIRECT_CONSTANT(variableName)
  71. #else // #if defined(USE_INDIRECT_CONSTANT)
  72. #define REGISTER_BIND(registerIndex, variableType, variableName, annotations, initializer)
  73. #define REGISTER_BIND_ARRAY(registerIndex, variableType, variableName, numArrayElements, annotations, initializer)
  74. #define REGISTER_BIND_ARRAY_VS(registerIndex, variableType, variableName, numArrayElements, annotations, initializer)
  75. #define REGISTER_BIND_INT(registerIndex, variableType, variableName, annotations, initializer)
  76. #define REGISTER_BIND_BOOL(registerIndex, variableType, variableName, annotations, initializer)
  77. #endif // #if defined(USE_INDIRECT_CONSTANT)
  78. #else
  79. #if defined(USE_INDIRECT_CONSTANT)
  80. #define REGISTER_BIND(registerIndex, variableType, variableName, annotations, initializer) shared variableType variableName : register(c##registerIndex) < bool unmanaged = true; > initializer
  81. #define REGISTER_BIND_ARRAY(registerIndex, variableType, variableName, numArrayElements, annotations, initializer) shared variableType variableName [numArrayElements] : register(c##registerIndex) < bool unmanaged = true; > initializer
  82. #define REGISTER_BIND_ARRAY_VS(registerIndex, variableType, variableName, numArrayElements, annotations, initializer) shared variableType variableName [numArrayElements] : register(vs, c##registerIndex) < bool unmanaged = true; > initializer
  83. #define REGISTER_BIND_INT(registerIndex, variableType, variableName, annotations, initializer) shared variableType variableName : register(i##registerIndex) < bool unmanaged = true; > initializer
  84. #define REGISTER_BIND_BOOL(registerIndex, variableType, variableName, annotations, initializer) shared variableType variableName : register(b##registerIndex) < bool unmanaged = true; > initializer
  85. #define USE_INITIALIZERS
  86. #else // #if defined(USE_INDIRECT_CONSTANT)
  87. #define REGISTER_BIND(registerIndex, variableType, variableName, annotations, initializer) variableType variableName < annotations > initializer
  88. #define REGISTER_BIND_ARRAY(registerIndex, variableType, variableName, numArrayElements, annotations, initializer) variableType variableName [numArrayElements] < annotations > initializer
  89. #define REGISTER_BIND_ARRAY_VS(registerIndex, variableType, variableName, numArrayElements, annotations, initializer) variableType variableName [numArrayElements] < annotations > initializer
  90. #define REGISTER_BIND_INT(registerIndex, variableType, variableName, annotations, initializer) variableType variableName < annotations > initializer
  91. #define REGISTER_BIND_BOOL(registerIndex, variableType, variableName, annotations, initializer) variableType variableName < annotations > initializer
  92. #define USE_INITIALIZERS
  93. #endif // #if defined(USE_INDIRECT_CONSTANT)
  94. #endif // if !__cplusplus
  95. // Use this macro as parameter to the macros above, when no initializer is needed
  96. #define NO_INITIALIZER
  97. #endif // #define _REGISTERMAP_FXH_