1 /*---------------------------------------------------------------------------* 2 Project: NintendoWare 3 File: gfx_ResFragmentShader.h 4 5 Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. All rights reserved. 6 7 These coded instructions, statements, and computer programs contain 8 proprietary information of Nintendo of America Inc. and/or Nintendo 9 Company Ltd., and are protected by Federal copyright law. They may 10 not be disclosed to third parties or copied or duplicated in any form, 11 in whole or in part, without the prior written consent of Nintendo. 12 13 $Revision: 18106 $ 14 *---------------------------------------------------------------------------*/ 15 16 #ifndef NW_GFX_RESFRAGMENTSHADER_H_ 17 #define NW_GFX_RESFRAGMENTSHADER_H_ 18 19 #include <GLES2/gl2.h> 20 #include <GLES2/gl2ext.h> 21 22 #include <nw/ut/ut_ResUtil.h> 23 #include <nw/ut/ut_ResDictionary.h> 24 #include <nw/gfx/res/gfx_ResLookupTable.h> 25 #include <nw/gfx/res/gfx_ResTypeInfo.h> 26 #include <nw/gfx/gfx_CommandUtil.h> 27 28 namespace nw { 29 namespace gfx { 30 namespace res { 31 32 //! @details :private 33 struct ResFragmentLightingData 34 { 35 enum Flag 36 { 37 FLAG_CLAMP_HIGH_LIGHT_SHIFT, 38 FLAG_DISTRIBUTION0_ENABLED_SHIFT, 39 FLAG_DISTRIBUTION1_ENABLED_SHIFT, 40 FLAG_GEOMETRIC_FACTOR0_ENABLED_SHIFT, 41 FLAG_GEOMETRIC_FACTOR1_ENABLED_SHIFT, 42 FLAG_REFLECTION_ENABLED_SHIFT, 43 44 FLAG_CLAMP_HIGH_LIGHT = 0x1 << FLAG_CLAMP_HIGH_LIGHT_SHIFT, 45 FLAG_DISTRIBUTION0_ENABLED = 0x1 << FLAG_DISTRIBUTION0_ENABLED_SHIFT, 46 FLAG_DISTRIBUTION1_ENABLED = 0x1 << FLAG_DISTRIBUTION1_ENABLED_SHIFT, 47 FLAG_GEOMETRIC_FACTOR0_ENABLED = 0x1 << FLAG_GEOMETRIC_FACTOR0_ENABLED_SHIFT, 48 FLAG_GEOMETRIC_FACTOR1_ENABLED = 0x1 << FLAG_GEOMETRIC_FACTOR1_ENABLED_SHIFT, 49 FLAG_REFLECTION_ENABLED = 0x1 << FLAG_REFLECTION_ENABLED_SHIFT 50 }; 51 52 nw::ut::ResU32 m_Flags; 53 nw::ut::ResU32 m_LayerConfig; 54 nw::ut::ResS32 m_FresnelConfig; 55 nw::ut::ResU32 m_BumpTextureIndex; 56 nw::ut::ResU32 m_BumpMode; 57 nw::ut::ResBool m_IsBumpRenormalize; 58 u8 _padding_0[3]; 59 }; 60 61 //! @details :private 62 struct ResLightingLookupTableData 63 { 64 nw::ut::ResU32 m_Input; 65 nw::ut::ResU32 m_Scale; 66 nw::ut::Offset toSampler; 67 }; 68 69 //! @details :private 70 struct ResFragmentLightingTableData 71 { 72 nw::ut::Offset toReflectanceRSampler; 73 nw::ut::Offset toReflectanceGSampler; 74 nw::ut::Offset toReflectanceBSampler; 75 nw::ut::Offset toDistribution0Sampler; 76 nw::ut::Offset toDistribution1Sampler; 77 nw::ut::Offset toFresnelSampler; 78 }; 79 80 //! @details :private 81 struct ResAlphaTestData 82 { 83 nw::ut::ResU32 m_CommandBuffer[2]; 84 }; 85 86 //! @details :private 87 struct ResTextureCombinerSourceData 88 { 89 nw::ut::ResU32 m_Sources[3]; 90 }; 91 92 //! @details :private 93 struct ResTextureCombinerOperandData 94 { 95 nw::ut::ResU32 m_Operands[3]; 96 }; 97 98 //! @details :private 99 struct ResTextureCombinerData 100 { 101 nw::ut::ResU32 m_Constant; 102 103 union 104 { 105 struct 106 { 107 nw::ut::ResU32 m_CmdSource; 108 nw::ut::ResU32 m_CmdHeader; 109 nw::ut::ResU32 m_CmdOperand; 110 nw::ut::ResU32 m_CmdCombine; 111 nw::ut::ResU32 m_CmdConstant; 112 nw::ut::ResU32 m_CmdScale; 113 }; 114 nw::ut::ResU32 m_CommandBuffer[6]; 115 }; 116 }; 117 118 //! @details :private 119 struct ResFragmentShaderData 120 { 121 nw::ut::ResFloatColor m_BufferColor; 122 ResFragmentLightingData m_FragmentLighting; 123 nw::ut::Offset toFragmentLightingTable; 124 ResTextureCombinerData m_TextureCombiners[COMBINER_COUNT]; 125 ResAlphaTestData m_AlphaTest; 126 127 // [0] BufferColor 128 // [1] BufferColorヘッダ (0x0fd) 129 // [2] BufferInput 130 // [3] BufferInputヘッダ(0x0e0 [15:8]) 131 // [4] TextureRemap 132 // [5] TextureRemapヘッダ(0x1c3 [15:8]) 133 nw::ut::ResU32 m_BufferCommand[6]; 134 }; 135 136 //-------------------------------------------------------------------------- 137 //! @brief フラグメントライティングを表すバイナリリソースクラスです。 138 //--------------------------------------------------------------------------- 139 class ResFragmentLighting : public nw::ut::ResCommon< ResFragmentLightingData > 140 { 141 public: 142 enum LutType 143 { 144 LUT_RR_SHIFT, 145 LUT_RG_SHIFT, 146 LUT_RB_SHIFT, 147 LUT_D0_SHIFT, 148 LUT_D1_SHIFT, 149 LUT_FR_SHIFT, 150 LUT_SP_SHIFT, 151 LUT_DA_SHIFT, 152 153 LUT_RR = 0x1 << LUT_RR_SHIFT, 154 LUT_RG = 0x1 << LUT_RG_SHIFT, 155 LUT_RB = 0x1 << LUT_RB_SHIFT, 156 LUT_D0 = 0x1 << LUT_D0_SHIFT, 157 LUT_D1 = 0x1 << LUT_D1_SHIFT, 158 LUT_FR = 0x1 << LUT_FR_SHIFT, 159 LUT_SP = 0x1 << LUT_SP_SHIFT, 160 LUT_DA = 0x1 << LUT_DA_SHIFT 161 }; 162 163 enum ConfigDetail 164 { 165 CONFIG_DETAIL0 = LUT_RR | LUT_D0 | LUT_SP | LUT_DA, 166 CONFIG_DETAIL1 = LUT_RR | LUT_FR | LUT_SP | LUT_DA, 167 CONFIG_DETAIL2 = LUT_RR | LUT_D0 | LUT_D1 | LUT_DA, 168 CONFIG_DETAIL3 = LUT_D0 | LUT_D1 | LUT_SP | LUT_DA, 169 CONFIG_DETAIL4 = LUT_RR | LUT_RG | LUT_RB | LUT_D0 | LUT_D1 | LUT_SP | LUT_DA, 170 CONFIG_DETAIL5 = LUT_RR | LUT_RG | LUT_RB | LUT_D0 | LUT_FR | LUT_SP | LUT_DA, 171 CONFIG_DETAIL6 = LUT_RR | LUT_D0 | LUT_D1 | LUT_FR | LUT_SP | LUT_DA, 172 CONFIG_DETAIL7 = LUT_RR | LUT_RG | LUT_RB | LUT_D0 | LUT_D1 | LUT_FR | LUT_SP | LUT_DA, 173 #ifdef NW_TARGET_CTR_GL_FINAL 174 CONFIG_DETAIL8 = LUT_RR | LUT_D1 | LUT_SP | LUT_DA, 175 CONFIG_DETAIL9 = LUT_D0 | LUT_D1 | LUT_SP | LUT_DA, 176 CONFIG_DETAIL10 = LUT_RR | LUT_RG | LUT_RB | LUT_DA 177 #else 178 CONFIG_DETAIL8 = LUT_RR | LUT_RG | LUT_RB | LUT_D0 | LUT_D1 | LUT_FR | LUT_SP | LUT_DA, 179 CONFIG_DETAIL9 = LUT_RR | LUT_RG | LUT_RB | LUT_D0 | LUT_D1 | LUT_FR | LUT_SP | LUT_DA, 180 CONFIG_DETAIL10 = LUT_RR | LUT_RG | LUT_RB | LUT_D0 | LUT_D1 | LUT_FR | LUT_SP | LUT_DA 181 #endif 182 }; 183 184 //TODO: 使用しませんをチェック。 185 //! @brief レイヤーコンフィグです。 186 enum Config 187 { 188 CONFIG_TYPE0 = 0, //!< レイヤーコンフィグ 0 です。 189 CONFIG_TYPE1 = 1, //!< レイヤーコンフィグ 1 です。 190 CONFIG_TYPE2 = 2, //!< レイヤーコンフィグ 2 です。 191 CONFIG_TYPE3 = 3, //!< レイヤーコンフィグ 3 です。 192 CONFIG_TYPE4 = 4, //!< レイヤーコンフィグ 4 です。 193 CONFIG_TYPE5 = 5, //!< レイヤーコンフィグ 5 です。 194 CONFIG_TYPE6 = 6, //!< レイヤーコンフィグ 6 です。 195 CONFIG_TYPE7 = 8, //!< レイヤーコンフィグ 7 です。 196 #if defined(NW_TARGET_CTR_GL_FINAL) 197 CONFIG_TYPE8 = 12, //!< 使用しません。 198 CONFIG_TYPE9 = 13, //!< 使用しません。 199 CONFIG_TYPE10 = 14 //!< 使用しません。 200 #else 201 CONFIG_TYPE8 = 8, //!< 使用しません。 202 CONFIG_TYPE9 = 8, //!< 使用しません。 203 CONFIG_TYPE10 = 8 //!< 使用しません。 204 #endif 205 }; 206 207 //! @brief フレネルの適用先です。 208 enum FresnelConfig 209 { 210 CONFIG_NO_FRESNEL = 0, //!< フレネルは使用しません。 211 CONFIG_PRI_ALPHA_FRESNEL = 1, //!< フレネルをプライマリに適用します。 212 CONFIG_SEC_ALPHA_FRESNEL = 2, //!< フレネルをセカンダリに適用します。 213 CONFIG_PRI_SEC_ALPHA_FRESNEL = 3 //!< フレネルをプライマリとセカンダリの両方に適用します。 214 }; 215 216 //! @brief バンプマッピングの使用方法です。 217 enum BumpMode 218 { 219 BUMPMODE_NOT_USED = 0, //!< バンプテクスチャを使用しません。 220 BUMPMODE_AS_BUMP = 1, //!< バンプマップとして使用します。 221 BUMPMODE_AS_TANG = 2 //!< タンジェントマップとして使用します。 222 }; 223 224 //! @brief バンプ使用テクスチャです。 225 enum BumpTexture 226 { 227 BUMP_TEXTURE0 = 0, //!< テクスチャ 0 です。 228 BUMP_TEXTURE1 = 1, //!< テクスチャ 1 です。 229 BUMP_TEXTURE2 = 2, //!< テクスチャ 2 です。 230 BUMP_TEXTURE3 = 3 //!< テクスチャ 3 です。 231 }; 232 233 NW_RES_CTOR( ResFragmentLighting ) 234 235 236 //--------------------------------------------------------------------------- 237 //! @fn void SetLayerConfig(Config value) 238 //! @brief レイヤーコンフィグを設定します。 239 //--------------------------------------------------------------------------- 240 //--------------------------------------------------------------------------- 241 //! @fn void SetFresnelConfig(FresnelConfig value) 242 //! @brief フレネルファクタを設定します。 243 //--------------------------------------------------------------------------- 244 //--------------------------------------------------------------------------- 245 //! @fn void SetFlags(u32 value) 246 //! @brief フラグの値を設定します。 247 //--------------------------------------------------------------------------- 248 //--------------------------------------------------------------------------- 249 //! @fn void SetBumpTextureIndex(BumpTexture value) 250 //! @brief バンプマッピングを施すテクスチャユニットの番号を設定します。 251 //--------------------------------------------------------------------------- 252 //--------------------------------------------------------------------------- 253 //! @fn void SetBumpRenormalize(bool value) 254 //! @brief バンプベクトルのz成分の再計算の有効化フラグを設定します。 255 //--------------------------------------------------------------------------- 256 //--------------------------------------------------------------------------- 257 //! @fn void SetBumpMode(BumpMode value) 258 //! @brief バンプマッピングのモードを設定します。 259 //--------------------------------------------------------------------------- 260 //--------------------------------------------------------------------------- 261 //! @fn bool IsBumpRenormalize() const 262 //! @brief バンプベクトルのz成分の再計算の有効化フラグを取得します。 263 //--------------------------------------------------------------------------- 264 //--------------------------------------------------------------------------- 265 //! @fn Config GetLayerConfig() const 266 //! @brief レイヤーコンフィグを取得します。 267 //--------------------------------------------------------------------------- 268 //--------------------------------------------------------------------------- 269 //! @fn FresnelConfig GetFresnelConfig() const 270 //! @brief フレネルファクタを取得します。 271 //--------------------------------------------------------------------------- 272 //--------------------------------------------------------------------------- 273 //! @fn u32 GetFlags() const 274 //! @brief フラグの値を取得します。 275 //--------------------------------------------------------------------------- 276 //--------------------------------------------------------------------------- 277 //! @fn BumpTexture GetBumpTextureIndex() const 278 //! @brief バンプマッピングを施すテクスチャユニットの番号を取得します。 279 //--------------------------------------------------------------------------- 280 //--------------------------------------------------------------------------- 281 //! @fn BumpMode GetBumpMode() const 282 //! @brief バンプマッピングのモードを取得します。 283 //--------------------------------------------------------------------------- NW_RES_FIELD_PRIMITIVE_DECL(u32,Flags)284 NW_RES_FIELD_PRIMITIVE_DECL( u32, Flags ) // GetFlags(), SetFlags() 285 NW_RES_FIELD_PRIMITIVE_DECL( Config, LayerConfig ) // GetLayerConfig(), SetLayerConfig() 286 NW_RES_FIELD_PRIMITIVE_DECL( FresnelConfig, FresnelConfig ) // GetFresnelConfig(), SetFresnelConfig() 287 NW_RES_FIELD_PRIMITIVE_DECL( BumpTexture, BumpTextureIndex ) // GetBumpTextureIndex(), SetBumpTextureIndex() 288 NW_RES_FIELD_PRIMITIVE_DECL( BumpMode, BumpMode ) // GetBumpMode(), SetBumpMode() 289 NW_RES_FIELD_BOOL_PRIMITIVE_DECL( BumpRenormalize ) // IsBumpRenomalize(), SetBumpRenomalize() 290 291 //--------------------------------------------------------------------------- 292 //! @brief リフレクションファクタが有効化どうかを返します。 293 //! 294 //! @return リフレクションファクタが有効な場合には true を返します。 295 //--------------------------------------------------------------------------- 296 bool IsReflectionEnabled() const { return ut::CheckFlag(GetFlags(), ResFragmentLightingData::FLAG_REFLECTION_ENABLED); } 297 298 //! @brief LayerConfig から参照テーブル割り当てのフラグを取得します。 299 //! 300 //! @param[in] config 301 //! 302 //! @return 参照テーブルの割り当てフラグです。 ToConfigDetail(Config config)303 static NW_INLINE ConfigDetail ToConfigDetail( Config config ) 304 { 305 s32 configNumber = static_cast<s32>(config) - static_cast<s32>(CONFIG_TYPE0); 306 static const ConfigDetail configDetailTable[] = 307 { 308 CONFIG_DETAIL0, 309 CONFIG_DETAIL1, 310 CONFIG_DETAIL2, 311 CONFIG_DETAIL3, 312 CONFIG_DETAIL4, 313 CONFIG_DETAIL5, 314 CONFIG_DETAIL6, 315 CONFIG_DETAIL7, 316 CONFIG_DETAIL8, 317 CONFIG_DETAIL9, 318 CONFIG_DETAIL10 319 }; 320 321 return configDetailTable[configNumber]; 322 } 323 }; 324 325 //-------------------------------------------------------------------------- 326 //! @brief ライティング用ルックアップテーブルを表すバイナリリソースクラスです。 327 //--------------------------------------------------------------------------- 328 class ResLightingLookupTable : public nw::ut::ResCommon<ResLightingLookupTableData> 329 { 330 public: 331 enum { SIGNATURE = NW_RES_SIGNATURE32('LLUT') }; 332 333 //--------------------------------------------------------------------------- 334 //! @brief ルックアップテーブルの入力値の定義です。 335 //--------------------------------------------------------------------------- 336 enum Input 337 { 338 INPUT_NH, //!< 法線とハーフベクトルのなす角のコサイン値。 339 INPUT_VH, //!< 視線ベクトルとハーフベクトルのなす角のコサイン値。 340 INPUT_NV, //!< 法線と視線ベクトルのなす角のコサイン値。 341 INPUT_LN, //!< ライトベクトルの法線のなす角のコサイン値。 342 INPUT_SP, //!< ライトベクトルとスポット方向ベクトルのなす角のコサイン値。 343 INPUT_CP, //!< ハーフベクトルの接平面投影ベクトルと接線ベクトルのなす角のコサイン値。 344 INPUT_NUM //!< enum の最大値。 345 }; 346 347 NW_RES_CTOR( ResLightingLookupTable ) 348 349 //--------------------------------------------------------------------------- 350 //! @fn void SetInput(Input value) 351 //! @brief ルックアップテーブルの入力設定を設定します。 352 //--------------------------------------------------------------------------- 353 //--------------------------------------------------------------------------- 354 //! @fn Input GetInput() const 355 //! @brief ルックアップテーブルの入力設定を取得します。 356 //--------------------------------------------------------------------------- 357 NW_RES_FIELD_PRIMITIVE_DECL( Input, Input ) // GetInput(), SetInput() 358 359 //--------------------------------------------------------------------------- 360 //! @brief ルックアップテーブルのスケール値の定義です。 361 //--------------------------------------------------------------------------- 362 enum Scale 363 { 364 SCALE_1 = 0, //!< 1.0 倍。 365 SCALE_2 = 1, //!< 2.0 倍。 366 SCALE_4 = 2, //!< 4.0 倍。 367 SCALE_8 = 3, //!< 8.0 倍。 368 SCALE_0_25 = 6, //!< 0.25 倍。 369 SCALE_0_5 = 7, //!< 0.5 倍。 370 SCALE_MAX = 8 //!< enum の最大値。 371 }; 372 373 //--------------------------------------------------------------------------- 374 //! @fn void SetScale(Scale value) 375 //! @brief ルックアップテーブルのスケール設定を設定します。 376 //--------------------------------------------------------------------------- 377 //--------------------------------------------------------------------------- 378 //! @fn Scale GetScale() const 379 //! @brief ルックアップテーブルのスケール設定を取得します。 380 //--------------------------------------------------------------------------- NW_RES_FIELD_PRIMITIVE_DECL(Scale,Scale)381 NW_RES_FIELD_PRIMITIVE_DECL( Scale, Scale ) // GetScale(), SetScale() 382 383 //--------------------------------------------------------------------------- 384 //! @brief スケール値を float で取得します。 385 //! 386 //! @return スケール値です。 387 //--------------------------------------------------------------------------- 388 f32 GetScaleF32() const 389 { 390 const f32 TABLE[] = 391 { 392 1.0f, 2.0f, 4.0f, 8.0f, 0.0f, 0.0f, 0.25f, 0.5f 393 }; 394 395 return TABLE[ref().m_Scale]; 396 } 397 398 //--------------------------------------------------------------------------- 399 //! @brief スケール値を float で設定します。 400 //! 401 //! scale には 1.0f, 2.0f, 4.0f, 8.0f, 0.25f, 0.5f のいずれかを指定します。 402 //! 403 //! @param[in] scale スケール値です。 404 //--------------------------------------------------------------------------- SetScaleF32(f32 scale)405 void SetScaleF32(f32 scale) 406 { 407 if (scale == 1.0f) { ref().m_Scale = SCALE_1; } 408 else if (scale == 2.0f) { ref().m_Scale = SCALE_2; } 409 else if (scale == 4.0f) { ref().m_Scale = SCALE_4; } 410 else if (scale == 8.0f) { ref().m_Scale = SCALE_8; } 411 else if (scale == 0.25f) { ref().m_Scale = SCALE_0_25; } 412 else if (scale == 0.5f) { ref().m_Scale = SCALE_0_5; } 413 else { NW_FATAL_ERROR("Illegal scale value"); } 414 } 415 416 //--------------------------------------------------------------------------- 417 //! @fn ResLookupTable GetSampler() 418 //! @brief ルックアップテーブルを取得します。 419 //--------------------------------------------------------------------------- NW_RES_FIELD_CLASS_DECL(ResLookupTable,Sampler)420 NW_RES_FIELD_CLASS_DECL( ResLookupTable, Sampler ) // GetSampler() 421 422 //--------------------------------------------------------------------------- 423 //! @brief 参照テーブルへアクセスするための入力値の絶対値化がされているかを取得します。 424 //! 425 //! @return 入力値を絶対値として扱う場合には、true を返します。 426 //--------------------------------------------------------------------------- 427 bool IsAbs() const 428 { 429 return this->GetSampler().Dereference().IsAbs(); 430 } 431 432 //--------------------------------------------------------------------------- 433 //! @brief リソースの後始末をおこないます。 434 //--------------------------------------------------------------------------- Cleanup()435 void Cleanup() 436 { 437 NW_ASSERT( IsValid() ); 438 ut::SafeCleanup(this->GetSampler()); 439 } 440 441 //--------------------------------------------------------------------------- 442 //! @brief 参照テーブルを設定します。 443 //! 参照先に設定しますのでリソースの解放はされません。 444 //! 445 //! @param[in] 参照テーブルです。 446 //--------------------------------------------------------------------------- SetSampler(ResLookupTable lookupTable)447 void SetSampler(ResLookupTable lookupTable) 448 { 449 NW_ASSERT(lookupTable.IsValid()); 450 ResImageLookupTable resImageLookupTable = lookupTable.Dereference(); 451 ResReferenceLookupTable referenceLut = ResStaticCast<ResReferenceLookupTable>(GetSampler()); 452 referenceLut.ref().toTargetLut.set_ptr(resImageLookupTable.ptr()); 453 } 454 }; 455 456 //-------------------------------------------------------------------------- 457 //! @brief フラグメントライティングテーブルを表すバイナリリソースクラスです。 458 //--------------------------------------------------------------------------- 459 class ResFragmentLightingTable : public nw::ut::ResCommon< ResFragmentLightingTableData > 460 { 461 public: 462 NW_RES_CTOR( ResFragmentLightingTable ) 463 464 //--------------------------------------------------------------------------- 465 //! @fn ResLightingLookupTable GetReflectanceRSampler() 466 //! @brief リフレクションのR成分の参照テーブルを取得します。 467 //--------------------------------------------------------------------------- 468 //--------------------------------------------------------------------------- 469 //! @fn ResLightingLookupTable GetReflectanceGSampler() 470 //! @brief リフレクションのG成分の参照テーブルを取得します。 471 //--------------------------------------------------------------------------- 472 //--------------------------------------------------------------------------- 473 //! @fn ResLightingLookupTable GetReflectanceBSampler() 474 //! @brief リフレクションのB成分の参照テーブルを取得します。 475 //--------------------------------------------------------------------------- 476 //--------------------------------------------------------------------------- 477 //! @fn ResLightingLookupTable GetFresnelSampler() 478 //! @brief フレネルファクタの参照テーブルを取得します。 479 //--------------------------------------------------------------------------- 480 //--------------------------------------------------------------------------- 481 //! @fn ResLightingLookupTable GetDistribution1Sampler() 482 //! @brief ディストリビューション1の参照テーブルを取得します。 483 //--------------------------------------------------------------------------- 484 //--------------------------------------------------------------------------- 485 //! @fn ResLightingLookupTable GetDistribution0Sampler() 486 //! @brief ディストリビューション0の参照テーブルを取得します。 487 //--------------------------------------------------------------------------- 488 NW_RES_FIELD_CLASS_DECL( ResLightingLookupTable, ReflectanceRSampler ) // GetReflectanceRSampler() 489 NW_RES_FIELD_CLASS_DECL( ResLightingLookupTable, ReflectanceGSampler ) // GetReflectanceGSampler() 490 NW_RES_FIELD_CLASS_DECL( ResLightingLookupTable, ReflectanceBSampler ) // GetReflectanceBSampler() 491 NW_RES_FIELD_CLASS_DECL( ResLightingLookupTable, Distribution0Sampler ) // GetDistribution0Sampler() 492 NW_RES_FIELD_CLASS_DECL( ResLightingLookupTable, Distribution1Sampler ) // GetDistribution1Sampler() 493 NW_RES_FIELD_CLASS_DECL( ResLightingLookupTable, FresnelSampler ) // GetFresnelSampler() 494 495 //--------------------------------------------------------------------------- 496 //! @brief リソースの初期化処理をおこないます。 497 //! 498 //! @param[in] allocator アロケータです。 499 //! @param[in] graphicsFile グラフィックスリソースです。 500 //--------------------------------------------------------------------------- 501 Result Setup(os::IAllocator* allocator, ResGraphicsFile graphicsFile); 502 503 //--------------------------------------------------------------------------- 504 //! @brief リソースの後始末をおこないます。 505 //--------------------------------------------------------------------------- 506 void Cleanup(); 507 }; 508 509 //-------------------------------------------------------------------------- 510 //! @brief テクスチャコンバイナのソースを表すバイナリリソースクラスです。 511 //--------------------------------------------------------------------------- 512 class ResTextureCombinerSource : public nw::ut::ResCommon< ResTextureCombinerSourceData > 513 { 514 public: 515 516 // TODO: チェック GL_PRIMARY_COLOR 517 //! @brief ソースを表します。 518 enum Kind 519 { 520 KIND_TEXTURE0 = GL_TEXTURE0, //!< テクスチャ 0 です。 521 KIND_TEXTURE1 = GL_TEXTURE1, //!< テクスチャ 1 です。 522 KIND_TEXTURE2 = GL_TEXTURE2, //!< テクスチャ 2 です。 523 KIND_TEXTURE3 = GL_TEXTURE3, //!< テクスチャ 3 です。 524 KIND_CONSTANT = GL_CONSTANT, //!< コンスタントカラーです。 525 KIND_PRIMARY_COLOR = GL_PRIMARY_COLOR, //!< 頂点シェーダーの出力結果です。 526 KIND_PREVIOUS = GL_PREVIOUS, //!< 前段の出力結果です。 527 KIND_FRAGMENT_PRIMARY_COLOR_DMP = GL_FRAGMENT_PRIMARY_COLOR_DMP, //!< プライマリカラーです。 528 KIND_FRAGMENT_SECONDARY_COLOR_DMP = GL_FRAGMENT_SECONDARY_COLOR_DMP //!< セカンダリカラーです。 529 }; 530 531 NW_RES_CTOR( ResTextureCombinerSource ) 532 533 //--------------------------------------------------------------------------- 534 //! @fn void SetSources(int idx, u32 value) 535 //! @brief テクスチャコンバイナのソースセットのリストに要素を設定します。 536 //--------------------------------------------------------------------------- 537 //--------------------------------------------------------------------------- 538 //! @fn s32 GetSourcesCount() const 539 //! @brief テクスチャコンバイナのソースセットの要素数を取得します。 540 //--------------------------------------------------------------------------- 541 //--------------------------------------------------------------------------- 542 //! @fn u32 GetSources(int idx) const 543 //! @brief テクスチャコンバイナのソースセットを取得します。 544 //--------------------------------------------------------------------------- 545 NW_RES_FIELD_PRIMITIVE_FIXED_LIST_DECL( u32, Sources ) // GetSourcesCount(), GetSources(int), GetSources(), SetSources(int,u32) 546 }; 547 548 //-------------------------------------------------------------------------- 549 //! @brief テクスチャコンバイナのオペランドを表すバイナリリソースクラスです。 550 //--------------------------------------------------------------------------- 551 class ResTextureCombinerOperand : public nw::ut::ResCommon< ResTextureCombinerOperandData > 552 { 553 public: 554 555 //! @brief オペランドです。 556 enum Kind 557 { 558 KIND_SRC_COLOR = GL_SRC_COLOR, //!< RGB です。 559 KIND_ONE_MINUS_SRC_COLOR = GL_ONE_MINUS_SRC_COLOR, //!< 1 - RGB です。 560 KIND_SRC_ALPHA = GL_SRC_ALPHA, //!< アルファです。 561 KIND_ONE_MINUS_SRC_ALPHA = GL_ONE_MINUS_SRC_ALPHA, //!< 1 - アルファです。 562 563 #ifdef NW_TARGET_CTR_GL_FINAL 564 KIND_SRC_R = GL_SRC_R_DMP, //!< R 成分です。 565 KIND_SRC_G = GL_SRC_G_DMP, //!< G 成分です。 566 KIND_SRC_B = GL_SRC_B_DMP, //!< B 成分です。 567 KIND_ONE_MINUS_SRC_R = GL_ONE_MINUS_SRC_R_DMP, //!< 1 - R 成分です。 568 KIND_ONE_MINUS_SRC_G = GL_ONE_MINUS_SRC_G_DMP, //!< 1 - G 成分です。 569 KIND_ONE_MINUS_SRC_B = GL_ONE_MINUS_SRC_B_DMP //!< 1 - B 成分です。 570 #else 571 KIND_SRC_R = GL_SRC_COLOR, 572 KIND_SRC_G = GL_SRC_COLOR, 573 KIND_SRC_B = GL_SRC_COLOR, 574 KIND_ONE_MINUS_SRC_R = GL_ONE_MINUS_SRC_COLOR, 575 KIND_ONE_MINUS_SRC_G = GL_ONE_MINUS_SRC_COLOR, 576 KIND_ONE_MINUS_SRC_B = GL_ONE_MINUS_SRC_COLOR 577 #endif 578 }; 579 580 NW_RES_CTOR( ResTextureCombinerOperand ) 581 582 //--------------------------------------------------------------------------- 583 //! @fn void SetOperands(int idx, u32 value) 584 //! @brief テクスチャコンバイナのオペランドセットのリストに要素を設定します。 585 //--------------------------------------------------------------------------- 586 //--------------------------------------------------------------------------- 587 //! @fn s32 GetOperandsCount() const 588 //! @brief テクスチャコンバイナのオペランドセットの要素数を取得します。 589 //--------------------------------------------------------------------------- 590 //--------------------------------------------------------------------------- 591 //! @fn u32 GetOperands(int idx) const 592 //! @brief テクスチャコンバイナのオペランドセットを取得します。 593 //--------------------------------------------------------------------------- 594 NW_RES_FIELD_PRIMITIVE_FIXED_LIST_DECL( u32, Operands ) // GetOperandsCount(), GetOperands(int), GetOperands(), SetOperands(int,u32) 595 }; 596 597 598 //-------------------------------------------------------------------------- 599 //! @brief アルファテストを表すバイナリリソースクラスです。 600 //--------------------------------------------------------------------------- 601 class ResAlphaTest : public nw::ut::ResCommon< ResAlphaTestData > 602 { 603 public: 604 605 NW_RES_CTOR( ResAlphaTest ) 606 607 //! @brief アルファテストの比較関数です。 608 enum TestFunc 609 { 610 TESTFUNC_NEVER = 0, //!< すべて不通過です。 611 TESTFUNC_ALWAYS = 1, //!< すべて通過です。 612 TESTFUNC_EQUAL = 2, //!< 参照値と等しければ通過します。 613 TESTFUNC_NOTEQUAL = 3, //!< 参照値と等しくなければ通過します。 614 TESTFUNC_LESS = 4, //!< 参照値より小さければ通過します。 615 TESTFUNC_LEQUAL = 5, //!< 参照値以下であれば通過します。 616 TESTFUNC_GREATER = 6, //!< 参照値より大きければ通過します。 617 TESTFUNC_GEQUAL = 7 //!< 参照値以上であれば通過します。 618 }; 619 620 //--------------------------------------------------------------------------- 621 //! @brief アルファテストが有効化かどうかを取得します。 622 //! 623 //! @return アルファテストが有効な場合には、true を返します。 624 //--------------------------------------------------------------------------- IsTestEnabled()625 bool IsTestEnabled() const 626 { 627 enum { CMD_SHIFT = 0, CMD_MASK = 0x1 }; 628 629 return internal::GetCmdValue( ref().m_CommandBuffer[0], CMD_MASK, CMD_SHIFT ) ? true : false; 630 } 631 632 //--------------------------------------------------------------------------- 633 //! @brief アルファテストの有効フラグを設定します。 634 //! 635 //! @param[in] value アルファテストを有効にする場合は true、無効にする場合は false を設定します。 636 //--------------------------------------------------------------------------- SetTestEnabled(bool value)637 void SetTestEnabled(bool value) 638 { 639 enum { CMD_SHIFT = 0, CMD_MASK = 0x1 }; 640 641 internal::SetCmdValue( &ref().m_CommandBuffer[0], value, CMD_MASK, CMD_SHIFT ); 642 } 643 644 //--------------------------------------------------------------------------- 645 //! @brief アルファテストに用いる比較関数を取得します。 646 //! 647 //! @return アルファテストの比較関数の設定値です。 648 //--------------------------------------------------------------------------- GetTestFunc()649 TestFunc GetTestFunc() const 650 { 651 enum { CMD_SHIFT = 4, CMD_MASK = 0x7 }; 652 653 return (TestFunc)internal::GetCmdValue( ref().m_CommandBuffer[0], CMD_MASK, CMD_SHIFT ); 654 } 655 656 //--------------------------------------------------------------------------- 657 //! @brief アルファテストに用いる比較関数を設定します。 658 //! 659 //! @param[in] value アルファテストの比較関数です。 660 //--------------------------------------------------------------------------- SetTestFunc(TestFunc value)661 void SetTestFunc(TestFunc value) 662 { 663 enum { CMD_SHIFT = 4, CMD_MASK = 0x7 }; 664 665 internal::SetCmdValue( &ref().m_CommandBuffer[0], value, CMD_MASK, CMD_SHIFT ); 666 } 667 668 //--------------------------------------------------------------------------- 669 //! @brief アルファテストに用いる参照値を取得します。 670 //! 671 //! @return アルファテストに用いる参照値です。 672 //--------------------------------------------------------------------------- GetTestReference()673 f32 GetTestReference() const 674 { 675 enum { CMD_SHIFT = 8, CMD_MASK = 0xff }; 676 677 return static_cast<f32>(internal::GetCmdValue( ref().m_CommandBuffer[0], CMD_MASK, CMD_SHIFT )) / 255.0f; 678 } 679 680 //--------------------------------------------------------------------------- 681 //! @brief アルファテストに用いる参照値を設定します。 682 //! 683 //! @param[in] value アルファテストに用いる参照値です。 684 //--------------------------------------------------------------------------- SetTestReference(f32 value)685 void SetTestReference(f32 value) 686 { 687 enum { CMD_SHIFT = 8, CMD_MASK = 0xff }; 688 689 internal::SetCmdValue( &ref().m_CommandBuffer[0], (0.5f + (value * 255.0f)), CMD_MASK, CMD_SHIFT ); 690 } 691 692 //--------------------------------------------------------------------------- 693 //! @fn u32 * GetCommandBuffer() 694 //! @brief コマンドバッファへのポインタを取得します。 695 //--------------------------------------------------------------------------- 696 NW_RES_FIELD_COMMAND_BUFFER() 697 }; 698 699 700 //-------------------------------------------------------------------------- 701 //! @brief テクスチャコンバイナのソースを表すバイナリリソースクラスです。 702 //--------------------------------------------------------------------------- 703 class ResTextureCombiner : public nw::ut::ResCommon< ResTextureCombinerData > 704 { 705 public: 706 //--------------------------------------------------------------------------- 707 //! @brief テクスチャコンバイナのコンスタント値の定義です。 708 //--------------------------------------------------------------------------- 709 enum Constant 710 { 711 CONSTANT0, //!< コンスタント0 の設定を使用します。 712 CONSTANT1, //!< コンスタント1 の設定を使用します。 713 CONSTANT2, //!< コンスタント2 の設定を使用します。 714 CONSTANT3, //!< コンスタント3 の設定を使用します。 715 CONSTANT4, //!< コンスタント4 の設定を使用します。 716 CONSTANT5, //!< コンスタント5 の設定を使用します。 717 EMISSION, //!< マテリアルのエミッションカラーの設定を使用します。 718 AMBIENT, //!< マテリアルのアンビエントカラーの設定を使用します。 719 DIFFUSE, //!< マテリアルのディフューズカラーの設定を使用します。 720 SPECULAR0, //!< マテリアルのスペキュラーカラー 0 の設定を使用します。 721 SPECULAR1 //!< マテリアルのスペキュラーカラー 1 の設定を使用します。 722 }; 723 724 NW_RES_CTOR( ResTextureCombiner ) 725 726 //--------------------------------------------------------------------------- 727 //! @fn void SetConstant(Constant value) 728 //! @brief テクスチャコンバイナの定数設定を設定します。 729 //--------------------------------------------------------------------------- 730 //--------------------------------------------------------------------------- 731 //! @fn Constant GetConstant() const 732 //! @brief テクスチャコンバイナの定数設定を取得します。 733 //--------------------------------------------------------------------------- 734 NW_RES_FIELD_PRIMITIVE_DECL( Constant, Constant ) // GetConstant(), SetConstant() 735 736 //--------------------------------------------------------------------------- 737 //! @fn u32 * GetCommandBuffer() 738 //! @brief コマンドバッファへのポインタを取得します。 739 //--------------------------------------------------------------------------- 740 NW_RES_FIELD_COMMAND_BUFFER(); 741 742 //--------------------------------------------------------------------------- 743 //! @brief コンスタントカラーの設定コマンドを u32 の rgba 値として設定します。 744 //! 745 //! @param[in] rgba コンスタントカラーの RGBA 32bit 表現です。 746 //--------------------------------------------------------------------------- SetConstantCmd(u32 rgba)747 void SetConstantCmd(u32 rgba) { ref().m_CmdConstant = rgba; } 748 749 //--------------------------------------------------------------------------- 750 //! @brief テクスチャコンバイナのソース設定の定義です。 751 //--------------------------------------------------------------------------- 752 typedef enum 753 { 754 SOURCE_PRIMARY_COLOR = 0, //!< 頂点シェーダーの出力結果です。 755 SOURCE_FRAGMENT_PRIMARY_COLOR, //!< プライマリカラーです。 756 SOURCE_FRAGMENT_SECONDARY_COLOR, //!< セカンダリカラーです。 757 SOURCE_TEXTURE0, //!< テクスチャ 0 です。 758 SOURCE_TEXTURE1, //!< テクスチャ 1 です。 759 SOURCE_TEXTURE2, //!< テクスチャ 2 です。 760 SOURCE_TEXTURE3, //!< テクスチャ 3 です。 761 SOURCE_CONSTANT = 0xE, //!< コンスタントカラーです。 762 SOURCE_PREVIOUS = 0xF, //!< 前段の出力結果です。 763 SOURCE_PREVIOUS_BUFFER = 0xD //!< 前段のバッファです。 764 } Source; 765 766 //--------------------------------------------------------------------------- 767 //! @brief テクスチャコンバイナの RGB オペランド設定の定義です。 768 //--------------------------------------------------------------------------- 769 typedef enum 770 { 771 OPERANDRGB_SRC_COLOR = 0, //!< RGB です。 772 OPERANDRGB_ONE_MINUS_SRC_COLOR = 0x1, //!< 1 - RGB です。 773 OPERANDRGB_SRC_ALPHA = 0x2, //!< アルファです。 774 OPERANDRGB_ONE_MINUS_SRC_ALPHA = 0x3, //!< 1 - アルファです。 775 776 OPERANDRGB_RED = 0x4, //!< R 成分です。 777 OPERANDRGB_ONE_MINUS_RED = 0x5, //!< 1 - R 成分です。 778 OPERANDRGB_GREEN = 0x8, //!< G 成分です。 779 OPERANDRGB_ONE_MINUS_GREEN = 0x9, //!< 1 - G 成分です。 780 OPERANDRGB_BLUE = 0xC, //!< B 成分です。 781 OPERANDRGB_ONE_MINUS_BLUE = 0xD //!< 1 - B 成分です。 782 } OperandRgb; 783 784 //--------------------------------------------------------------------------- 785 //! @brief テクスチャコンバイナの Alpha オペランド設定の定義です。 786 //--------------------------------------------------------------------------- 787 typedef enum 788 { 789 OPERANDALPHA_SRC_ALPHA = 0, //!< アルファです。 790 OPERANDALPHA_SRC_ONE_MINUS_ALPHA = 0x1, //!< 1 - アルファです。 791 792 OPERANDALPHA_RED = 0x2, //!< R 成分です。 793 OPERANDALPHA_ONE_MINUS_RED = 0x3, //!< 1 - R 成分です。 794 OPERANDALPHA_GREEN = 0x4, //!< G 成分です。 795 OPERANDALPHA_ONE_MINUS_GREEN = 0x5, //!< 1 - G 成分です。 796 OPERANDALPHA_BLUE = 0x6, //!< B 成分です。 797 OPERANDALPHA_ONE_MINUS_BLUE = 0x7 //!< 1 - B 成分です。 798 799 } OperandAlpha; 800 801 //--------------------------------------------------------------------------- 802 //! @brief テクスチャコンバイナの コンバイナ関数の定義です。 803 //! 804 //! A はソース 0 、B はソース 1 、C はソース 2 をそれぞれ表します。 805 //--------------------------------------------------------------------------- 806 typedef enum 807 { 808 COMBINE_REPLACE = 0, //!< A です 809 COMBINE_MODULATE, //!< A * B です。 810 COMBINE_ADD, //!< A + B です。 811 COMBINE_ADDSIGNED, //!< A + B - 0.5 です。 812 COMBINE_INTERPOLATE, //!< A * C + B * ( 1 - C ) です。 813 COMBINE_SUBTRACT, //!< A - B です。 814 COMBINE_DOT3_RGB, //!< RGB ← Dot ( A , B ) です。 815 COMBINE_DOT3_RGBA, //!< RGBA ← Dot ( A , B ) です。 816 COMBINE_MULT_ADD, //!< ( A * B ) + C です。 817 COMBINE_ADD_MULT //!< ( A + B ) * C です。 818 } Combine; 819 820 //--------------------------------------------------------------------------- 821 //! @brief テクスチャコンバイナの スケール設定の定義です。 822 //--------------------------------------------------------------------------- 823 typedef enum 824 { 825 SCALE_ONE = 0, //!< 1.0 倍。 826 SCALE_TWO, //!< 2.0 倍。 827 SCALE_FOUR //!< 4.0 倍。 828 } Scale; 829 830 //--------------------------------------------------------------------------- 831 //! @brief RGB 値のソースを取得します。 832 //! 833 //! @param[in] index 取得するソースのインデクスです。 834 //! 835 //! @return ソースの設定です。 836 //--------------------------------------------------------------------------- 837 //! @brief カラーのソースを取得します。 838 //! 839 //! @param[in] index 840 //! 841 //! @return ソースを返します。 GetSourceRgb(s32 index)842 Source GetSourceRgb(s32 index) const 843 { 844 NW_MINMAX_ASSERT( index, 0, 2 ); 845 enum { CMD_WIDTH = 4, CMD_MASK = 0xF }; 846 847 return (Source)internal::GetCmdValue( ref().m_CmdSource, CMD_MASK, CMD_WIDTH * index ); 848 } 849 850 //--------------------------------------------------------------------------- 851 //! @brief RGB 値のソースを設定します。 852 //! 853 //! @param[in] index 設定するソースのインデクスです。 854 //! @param[in] value ソースの設定値です。 855 //--------------------------------------------------------------------------- SetSourceRgb(s32 index,Source value)856 void SetSourceRgb(s32 index, Source value) 857 { 858 NW_MINMAX_ASSERT( index, 0, 2 ); 859 860 enum { CMD_WIDTH = 4, CMD_MASK = 0xF }; 861 862 internal::SetCmdValue( &ref().m_CmdSource, value, CMD_MASK, CMD_WIDTH * index ); 863 } 864 865 //--------------------------------------------------------------------------- 866 //! @brief Alpha 値のソースを取得します。 867 //! 868 //! @param[in] index 取得するソースのインデクスです。 869 //! 870 //! @return ソースの設定です。 871 //--------------------------------------------------------------------------- GetSourceAlpha(s32 index)872 Source GetSourceAlpha(s32 index) const 873 { 874 NW_MINMAX_ASSERT( index, 0, 2 ); 875 876 enum { CMD_SHIFT = 16, CMD_WIDTH = 4, CMD_MASK = 0xF }; 877 878 return (Source)internal::GetCmdValue( ref().m_CmdSource, CMD_MASK, CMD_WIDTH * index + CMD_SHIFT ); 879 } 880 881 //--------------------------------------------------------------------------- 882 //! @brief Alpha 値のソースを設定します。 883 //! 884 //! @param[in] index 設定するソースのインデクスです。 885 //! @param[in] value ソースの設定値です。 886 //--------------------------------------------------------------------------- SetSourceAlpha(s32 index,Source value)887 void SetSourceAlpha(s32 index, Source value) 888 { 889 NW_MINMAX_ASSERT( index, 0, 2 ); 890 891 enum { CMD_SHIFT = 16, CMD_WIDTH = 4, CMD_MASK = 0xF }; 892 893 internal::SetCmdValue( &ref().m_CmdSource, value, CMD_MASK, CMD_WIDTH * index + CMD_SHIFT ); 894 } 895 896 //--------------------------------------------------------------------------- 897 //! @brief RGB 値のオペランドを取得します。 898 //! 899 //! @param[in] index 取得するオペランドのインデクスです。 900 //! 901 //! @return オペランドの設定です。 902 //--------------------------------------------------------------------------- 903 //! @brief カラーのオペランドを取得します。 904 //! 905 //! @param[in] index 906 //! 907 //! @return オペランドを返します。 GetOperandRgb(s32 index)908 OperandRgb GetOperandRgb(s32 index) const 909 { 910 NW_MINMAX_ASSERT( index, 0, 2 ); 911 enum { CMD_WIDTH = 4, CMD_MASK = 0xF }; 912 913 return (OperandRgb)internal::GetCmdValue( ref().m_CmdOperand, CMD_MASK, CMD_WIDTH * index ); 914 } 915 916 //--------------------------------------------------------------------------- 917 //! @brief RGB 値のオペランドを設定します。 918 //! 919 //! @param[in] index 設定するオペランドのインデクスです。 920 //! @param[in] value オペランドの設定値です。 921 //--------------------------------------------------------------------------- SetOperandRgb(s32 index,OperandRgb value)922 void SetOperandRgb(s32 index, OperandRgb value) 923 { 924 NW_MINMAX_ASSERT( index, 0, 2 ); 925 926 enum { CMD_WIDTH = 4, CMD_MASK = 0xF }; 927 928 internal::SetCmdValue( &ref().m_CmdOperand, value, CMD_MASK, CMD_WIDTH * index ); 929 } 930 931 //--------------------------------------------------------------------------- 932 //! @brief Alpha 値のオペランドを取得します。 933 //! 934 //! @param[in] index 取得するオペランドのインデクスです。 935 //! 936 //! @return オペランドの設定です。 937 //--------------------------------------------------------------------------- GetOperandAlpha(s32 index)938 OperandAlpha GetOperandAlpha(s32 index) const 939 { 940 NW_MINMAX_ASSERT( index, 0, 2 ); 941 942 enum { CMD_SHIFT = 12, CMD_WIDTH = 4, CMD_MASK = 0xF }; 943 944 return (OperandAlpha)internal::GetCmdValue( ref().m_CmdOperand, CMD_MASK, CMD_WIDTH * index + CMD_SHIFT ); 945 } 946 947 //--------------------------------------------------------------------------- 948 //! @brief Alpha 値のオペランドを設定します。 949 //! 950 //! @param[in] index 設定するオペランドのインデクスです。 951 //! @param[in] value オペランドの設定値です。 952 //--------------------------------------------------------------------------- SetOperandAlpha(s32 index,OperandAlpha value)953 void SetOperandAlpha(s32 index, OperandAlpha value) 954 { 955 NW_MINMAX_ASSERT( index, 0, 2 ); 956 enum { CMD_SHIFT = 12, CMD_WIDTH = 4, CMD_MASK = 0xF }; 957 internal::SetCmdValue( &ref().m_CmdOperand, value, CMD_MASK, CMD_WIDTH * index + CMD_SHIFT ); 958 } 959 960 //--------------------------------------------------------------------------- 961 //! @brief RGB 値のコンバイナ関数を取得します。 962 //! 963 //! @return コンバイナ関数を返します。 964 //--------------------------------------------------------------------------- 965 //! @brief カラーの計算式を取得します。 966 //! 967 //! @return 計算式を返します。 GetCombineRgb()968 Combine GetCombineRgb() const 969 { 970 enum { CMD_SHIFT = 0, CMD_MASK = 0xF }; 971 return (Combine)internal::GetCmdValue( ref().m_CmdCombine, CMD_MASK, CMD_SHIFT ); 972 } 973 974 //--------------------------------------------------------------------------- 975 //! @brief RGB 値のコンバイナ関数を設定します。 976 //! 977 //! @param[in] value 設定するコンバイナ関数の値です。 978 //--------------------------------------------------------------------------- SetCombineRgb(Combine value)979 void SetCombineRgb(Combine value) 980 { 981 enum { CMD_SHIFT = 0, CMD_MASK = 0xF }; 982 internal::SetCmdValue( &ref().m_CmdCombine, value, CMD_MASK, CMD_SHIFT ); 983 } 984 985 //--------------------------------------------------------------------------- 986 //! @brief Alpha 値のコンバイナ関数を取得します。 987 //! 988 //! @return コンバイナ関数です。 989 //--------------------------------------------------------------------------- GetCombineAlpha()990 Combine GetCombineAlpha() const 991 { 992 enum { CMD_SHIFT = 16, CMD_MASK = 0xF }; 993 return (Combine)internal::GetCmdValue( ref().m_CmdCombine, CMD_MASK, CMD_SHIFT ); 994 } 995 996 //--------------------------------------------------------------------------- 997 //! @brief Alpha 値のコンバイナ関数を設定します。 998 //! 999 //! @param[in] value 設定するコンバイナ関数の値です。 1000 //--------------------------------------------------------------------------- SetCombineAlpha(Combine value)1001 void SetCombineAlpha(Combine value) 1002 { 1003 enum { CMD_SHIFT = 16, CMD_MASK = 0xF }; 1004 internal::SetCmdValue( &ref().m_CmdCombine, value, CMD_MASK, CMD_SHIFT ); 1005 } 1006 1007 //--------------------------------------------------------------------------- 1008 //! @brief RGB 値のスケールを取得します。 1009 //! 1010 //! @return スケールの値です。 1011 //--------------------------------------------------------------------------- 1012 //! @brief カラーのスケールを取得します。 1013 //! 1014 //! @return スケールを返します。 GetScaleRgb()1015 Scale GetScaleRgb() const 1016 { 1017 enum { CMD_SHIFT = 0, CMD_MASK = 0x3 }; 1018 return (Scale)internal::GetCmdValue( ref().m_CmdScale, CMD_MASK, CMD_SHIFT ); 1019 } 1020 1021 //--------------------------------------------------------------------------- 1022 //! @brief RGB 値のスケールを設定します。 1023 //! 1024 //! @param[in] value 設定するスケールの値です。 1025 //--------------------------------------------------------------------------- SetScaleRgb(Scale value)1026 void SetScaleRgb(Scale value) 1027 { 1028 enum { CMD_SHIFT = 0, CMD_MASK = 0x3 }; 1029 internal::SetCmdValue( &ref().m_CmdScale, value, CMD_MASK, CMD_SHIFT ); 1030 } 1031 1032 //--------------------------------------------------------------------------- 1033 //! @brief Alpha 値のスケールを取得します。 1034 //! 1035 //! @return スケールの値です。 1036 //--------------------------------------------------------------------------- GetScaleAlpha()1037 Scale GetScaleAlpha() const 1038 { 1039 enum { CMD_SHIFT = 16, CMD_MASK = 0x3 }; 1040 return (Scale)internal::GetCmdValue( ref().m_CmdScale, CMD_MASK, CMD_SHIFT ); 1041 } 1042 1043 //--------------------------------------------------------------------------- 1044 //! @brief Alpha 値のスケールを設定します。 1045 //! 1046 //! @param[in] value 設定するスケールの値です。 1047 //--------------------------------------------------------------------------- SetScaleAlpha(Scale value)1048 void SetScaleAlpha(Scale value) 1049 { 1050 enum { CMD_SHIFT = 16, CMD_MASK = 0x3 }; 1051 internal::SetCmdValue( &ref().m_CmdScale, value, CMD_MASK, CMD_SHIFT ); 1052 } 1053 }; 1054 1055 //-------------------------------------------------------------------------- 1056 //! @brief フラグメントシェーダを表すバイナリリソースクラスです。 1057 //--------------------------------------------------------------------------- 1058 class ResFragmentShader : public nw::ut::ResCommon< ResFragmentShaderData > 1059 { 1060 public: 1061 //! @brief バッファのインプットを表します。 1062 enum BufferInput 1063 { 1064 BUFFERINPUT_PREVIOUS_BUFFER = 0, //!< 前段のバッファです。 1065 BUFFERINPUT_PREVIOUS = 1 //!< 前段の出力結果です。 1066 }; 1067 1068 NW_RES_CTOR( ResFragmentShader ) 1069 1070 //--------------------------------------------------------------------------- 1071 //! @fn ResTextureCombinerData & GetTextureCombinersData(int idx) 1072 //! @brief テクスチャコンバイナの設定の配列を取得します。 1073 //--------------------------------------------------------------------------- 1074 //--------------------------------------------------------------------------- 1075 //! @fn s32 GetTextureCombinersCount() const 1076 //! @brief テクスチャコンバイナの設定の要素数を取得します。 1077 //--------------------------------------------------------------------------- 1078 //--------------------------------------------------------------------------- 1079 //! @fn ResTextureCombiner GetTextureCombiners(int idx) 1080 //! @brief テクスチャコンバイナの設定を取得します。 1081 //--------------------------------------------------------------------------- 1082 //--------------------------------------------------------------------------- 1083 //! @fn ResFragmentLightingTable GetFragmentLightingTable() 1084 //! @brief フラグメントライティングテーブルを取得します。 1085 //--------------------------------------------------------------------------- 1086 //--------------------------------------------------------------------------- 1087 //! @fn ResFragmentLightingData & GetFragmentLightingData() 1088 //! @brief フラグメントライティング設定を取得します。 1089 //--------------------------------------------------------------------------- 1090 //--------------------------------------------------------------------------- 1091 //! @fn ResFragmentLighting GetFragmentLighting() 1092 //! @brief フラグメントライティング設定を取得します。 1093 //--------------------------------------------------------------------------- 1094 //--------------------------------------------------------------------------- 1095 //! @fn ResAlphaTestData & GetAlphaTestData() 1096 //! @brief アルファテストの設定を取得します。 1097 //--------------------------------------------------------------------------- 1098 //--------------------------------------------------------------------------- 1099 //! @fn ResAlphaTest GetAlphaTest() 1100 //! @brief アルファテストの設定を取得します。 1101 //--------------------------------------------------------------------------- 1102 NW_RES_FIELD_RESSTRUCT_DECL( ResFragmentLighting, FragmentLighting ) // GetFragmentLighting(), GetFragmentLightingData() 1103 NW_RES_FIELD_CLASS_DECL( ResFragmentLightingTable, FragmentLightingTable ) // GetFragmentLightingTable() 1104 NW_RES_FIELD_STRUCT_FIXED_LIST_DECL( ResTextureCombiner, TextureCombiners ) // GetTextureCombinersCount(), GetTextureCombiners(idx) 1105 NW_RES_FIELD_RESSTRUCT_DECL( ResAlphaTest, AlphaTest ) // GetAlphaTest(), GetAlphaTestData() 1106 1107 //--------------------------------------------------------------------------- 1108 //! @brief リソースの初期化処理をおこないます。 1109 //! 1110 //! @param[in] allocator アロケータです。 1111 //! @param[in] graphicsFile グラフィックスリソースです。 1112 //--------------------------------------------------------------------------- 1113 Result Setup(os::IAllocator* allocator, ResGraphicsFile graphicsFile); 1114 1115 //--------------------------------------------------------------------------- 1116 //! @brief リソースの後始末をおこないます。 1117 //--------------------------------------------------------------------------- 1118 void Cleanup(); 1119 1120 //! @brief フラグメントシェーダーが正しく設定されているか確認します。 1121 bool CheckFragmentShader(); 1122 1123 //! @brief バッファカラーを U32 で取得します。 1124 //! 1125 //! @return バッファカラーを U32 で返します。 GetBufferColorU32()1126 u32 GetBufferColorU32() const 1127 { 1128 return ref().m_BufferCommand[0]; 1129 } 1130 1131 //! @brief バッファカラーを設定します。 1132 //! 1133 //! @param[in] r 設定するバッファカラーの R 成分です。 1134 //! @param[in] g 設定するバッファカラーの G 成分です。 1135 //! @param[in] b 設定するバッファカラーの B 成分です。 SetBufferColor(f32 r,f32 g,f32 b)1136 void SetBufferColor( f32 r, f32 g, f32 b ) 1137 { 1138 ref().m_BufferColor.Set(r, g, b); 1139 ref().m_BufferCommand[0] = ref().m_BufferColor.ToPicaU32(); 1140 } 1141 1142 //! @brief バッファカラーを設定します。 1143 //! 1144 //! @param[in] r 設定するバッファカラーの R 成分です。 1145 //! @param[in] g 設定するバッファカラーの G 成分です。 1146 //! @param[in] b 設定するバッファカラーの B 成分です。 1147 //! @param[in] b 設定するバッファカラーのアルファ成分です。 SetBufferColor(f32 r,f32 g,f32 b,f32 a)1148 void SetBufferColor( f32 r, f32 g, f32 b, f32 a ) 1149 { 1150 ref().m_BufferColor.Set(r, g, b, a); 1151 ref().m_BufferCommand[0] = ref().m_BufferColor.ToPicaU32(); 1152 } 1153 1154 //! @brief バッファカラーを取得します。 1155 //! 1156 //! @return バッファカラーを返します。 GetBufferColor()1157 const ut::FloatColor& GetBufferColor() const 1158 { 1159 return ref().m_BufferColor; 1160 } 1161 1162 //! @brief バッファカラーを設定します。 1163 //! 1164 //! @param[in] value 設定するバッファカラーです。 SetBufferColor(const ut::FloatColor & value)1165 void SetBufferColor(const ut::FloatColor& value) 1166 { 1167 ref().m_BufferColor = value; 1168 ref().m_BufferCommand[0] = ref().m_BufferColor.ToPicaU32(); 1169 } 1170 1171 //! @brief RGB のバッファインプットを取得します。 1172 //! 1173 //! @param[in] index 取得するコンバイナのインデクスです。 GetBufferInputRgb(s32 index)1174 BufferInput GetBufferInputRgb(s32 index) const 1175 { 1176 NW_MINMAX_ASSERT(index, 1, 4); 1177 1178 enum { CMD_SHIFT = 7, CMD_MASK = 0x1 }; 1179 return static_cast<BufferInput>(internal::GetCmdValue( ref().m_BufferCommand[2], CMD_MASK, CMD_SHIFT+index )); 1180 } 1181 1182 //! @brief RGB のバッファインプットを設定します。 1183 //! 1184 //! @param[in] index 設定するコンバイナのインデクスです。 1185 //! @param[in] value 設定するバッファインプットです。 SetBufferInputRgb(s32 index,BufferInput value)1186 void SetBufferInputRgb(s32 index, BufferInput value) 1187 { 1188 NW_MINMAX_ASSERT(index, 1, 4); 1189 1190 enum { CMD_SHIFT = 7, CMD_MASK = 0x1 }; 1191 internal::SetCmdValue( &ref().m_BufferCommand[2], value, CMD_MASK, CMD_SHIFT+index ); 1192 } 1193 1194 //! @brief Alpha のバッファインプットを取得します。 1195 //! 1196 //! @param[in] index 取得するコンバイナのインデクスです。 GetBufferInputAlpha(s32 index)1197 BufferInput GetBufferInputAlpha(s32 index) const 1198 { 1199 NW_MINMAX_ASSERT(index, 1, 4); 1200 1201 enum { CMD_SHIFT = 11, CMD_MASK = 0x1 }; 1202 return static_cast<BufferInput>(internal::GetCmdValue( ref().m_BufferCommand[2], CMD_MASK, CMD_SHIFT+index )); 1203 } 1204 1205 //! @brief Alpha のバッファインプットを設定します。 1206 //! 1207 //! @param[in] index 設定するコンバイナのインデクスです。 1208 //! @param[in] value 設定するバッファインプットです。 SetBufferInputAlpha(s32 index,BufferInput value)1209 void SetBufferInputAlpha(s32 index, BufferInput value) 1210 { 1211 NW_MINMAX_ASSERT(index, 1, 4); 1212 1213 enum { CMD_SHIFT = 11, CMD_MASK = 0x1 }; 1214 internal::SetCmdValue( &ref().m_BufferCommand[2], value, CMD_MASK, CMD_SHIFT+index ); 1215 } 1216 }; 1217 1218 } // namespace res 1219 } // namespace gfx 1220 } // namespace nw 1221 1222 #endif // NW_GFX_RESFRAGMENTSHADER_H_ 1223