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 //--------------------------------------------------------------------------- 250 //! @fn void EnaleFlags(u32 value) 251 //! @brief 指定された Flag の値を有効にします。 252 //! 設定されなかったフラグは変更されません。 253 //--------------------------------------------------------------------------- 254 //--------------------------------------------------------------------------- 255 //! @fn void DisableFlags(u32 value) 256 //! @brief 指定された Flag の値を無効にします。 257 //! 設定されなかったフラグは変更されません。 258 //--------------------------------------------------------------------------- 259 //--------------------------------------------------------------------------- 260 //! @fn void SetBumpTextureIndex(BumpTexture value) 261 //! @brief バンプマッピングを施すテクスチャユニットの番号を設定します。 262 //--------------------------------------------------------------------------- 263 //--------------------------------------------------------------------------- 264 //! @fn void SetBumpRenormalize(bool value) 265 //! @brief バンプベクトルのz成分の再計算の有効化フラグを設定します。 266 //--------------------------------------------------------------------------- 267 //--------------------------------------------------------------------------- 268 //! @fn void SetBumpMode(BumpMode value) 269 //! @brief バンプマッピングのモードを設定します。 270 //--------------------------------------------------------------------------- 271 //--------------------------------------------------------------------------- 272 //! @fn bool IsBumpRenormalize() const 273 //! @brief バンプベクトルのz成分の再計算の有効化フラグを取得します。 274 //--------------------------------------------------------------------------- 275 //--------------------------------------------------------------------------- 276 //! @fn Config GetLayerConfig() const 277 //! @brief レイヤーコンフィグを取得します。 278 //--------------------------------------------------------------------------- 279 //--------------------------------------------------------------------------- 280 //! @fn FresnelConfig GetFresnelConfig() const 281 //! @brief フレネルファクタを取得します。 282 //--------------------------------------------------------------------------- 283 //--------------------------------------------------------------------------- 284 //! @fn u32 GetFlags() const 285 //! @brief フラグの値を取得します。 286 //--------------------------------------------------------------------------- 287 //--------------------------------------------------------------------------- 288 //! @fn BumpTexture GetBumpTextureIndex() const 289 //! @brief バンプマッピングを施すテクスチャユニットの番号を取得します。 290 //--------------------------------------------------------------------------- 291 //--------------------------------------------------------------------------- 292 //! @fn BumpMode GetBumpMode() const 293 //! @brief バンプマッピングのモードを取得します。 294 //--------------------------------------------------------------------------- NW_RES_FIELD_FLAGS_DECL(u32,Flags)295 NW_RES_FIELD_FLAGS_DECL( u32, Flags ) // GetFlags(), SetFlags(), EnableFlags(), DisableFlags() 296 NW_RES_FIELD_PRIMITIVE_DECL( Config, LayerConfig ) // GetLayerConfig(), SetLayerConfig() 297 NW_RES_FIELD_PRIMITIVE_DECL( FresnelConfig, FresnelConfig ) // GetFresnelConfig(), SetFresnelConfig() 298 NW_RES_FIELD_PRIMITIVE_DECL( BumpTexture, BumpTextureIndex ) // GetBumpTextureIndex(), SetBumpTextureIndex() 299 NW_RES_FIELD_PRIMITIVE_DECL( BumpMode, BumpMode ) // GetBumpMode(), SetBumpMode() 300 NW_RES_FIELD_BOOL_PRIMITIVE_DECL( BumpRenormalize ) // IsBumpRenomalize(), SetBumpRenomalize() 301 302 //--------------------------------------------------------------------------- 303 //! @brief リフレクションファクタが有効化どうかを返します。 304 //! 305 //! @return リフレクションファクタが有効な場合には true を返します。 306 //--------------------------------------------------------------------------- 307 bool IsReflectionEnabled() const { return ut::CheckFlag(GetFlags(), ResFragmentLightingData::FLAG_REFLECTION_ENABLED); } 308 309 //! @brief LayerConfig から参照テーブル割り当てのフラグを取得します。 310 //! 311 //! @param[in] config 312 //! 313 //! @return 参照テーブルの割り当てフラグです。 ToConfigDetail(Config config)314 static NW_INLINE ConfigDetail ToConfigDetail( Config config ) 315 { 316 s32 configNumber = static_cast<s32>(config) - static_cast<s32>(CONFIG_TYPE0); 317 static const ConfigDetail configDetailTable[] = 318 { 319 CONFIG_DETAIL0, 320 CONFIG_DETAIL1, 321 CONFIG_DETAIL2, 322 CONFIG_DETAIL3, 323 CONFIG_DETAIL4, 324 CONFIG_DETAIL5, 325 CONFIG_DETAIL6, 326 CONFIG_DETAIL7, 327 CONFIG_DETAIL8, 328 CONFIG_DETAIL9, 329 CONFIG_DETAIL10 330 }; 331 332 return configDetailTable[configNumber]; 333 } 334 }; 335 336 //-------------------------------------------------------------------------- 337 //! @brief ライティング用ルックアップテーブルを表すバイナリリソースクラスです。 338 //--------------------------------------------------------------------------- 339 class ResLightingLookupTable : public nw::ut::ResCommon<ResLightingLookupTableData> 340 { 341 public: 342 enum { SIGNATURE = NW_RES_SIGNATURE32('LLUT') }; 343 344 //--------------------------------------------------------------------------- 345 //! @brief ルックアップテーブルの入力値の定義です。 346 //--------------------------------------------------------------------------- 347 enum Input 348 { 349 INPUT_NH, //!< 法線とハーフベクトルのなす角のコサイン値。 350 INPUT_VH, //!< 視線ベクトルとハーフベクトルのなす角のコサイン値。 351 INPUT_NV, //!< 法線と視線ベクトルのなす角のコサイン値。 352 INPUT_LN, //!< ライトベクトルの法線のなす角のコサイン値。 353 INPUT_SP, //!< ライトベクトルとスポット方向ベクトルのなす角のコサイン値。 354 INPUT_CP, //!< ハーフベクトルの接平面投影ベクトルと接線ベクトルのなす角のコサイン値。 355 INPUT_NUM //!< enum の最大値。 356 }; 357 358 NW_RES_CTOR( ResLightingLookupTable ) 359 360 //--------------------------------------------------------------------------- 361 //! @fn void SetInput(Input value) 362 //! @brief ルックアップテーブルの入力設定を設定します。 363 //--------------------------------------------------------------------------- 364 //--------------------------------------------------------------------------- 365 //! @fn Input GetInput() const 366 //! @brief ルックアップテーブルの入力設定を取得します。 367 //--------------------------------------------------------------------------- 368 NW_RES_FIELD_PRIMITIVE_DECL( Input, Input ) // GetInput(), SetInput() 369 370 //--------------------------------------------------------------------------- 371 //! @brief ルックアップテーブルのスケール値の定義です。 372 //--------------------------------------------------------------------------- 373 enum Scale 374 { 375 SCALE_1 = 0, //!< 1.0 倍。 376 SCALE_2 = 1, //!< 2.0 倍。 377 SCALE_4 = 2, //!< 4.0 倍。 378 SCALE_8 = 3, //!< 8.0 倍。 379 SCALE_0_25 = 6, //!< 0.25 倍。 380 SCALE_0_5 = 7, //!< 0.5 倍。 381 SCALE_MAX = 8 //!< enum の最大値。 382 }; 383 384 //--------------------------------------------------------------------------- 385 //! @fn void SetScale(Scale value) 386 //! @brief ルックアップテーブルのスケール設定を設定します。 387 //--------------------------------------------------------------------------- 388 //--------------------------------------------------------------------------- 389 //! @fn Scale GetScale() const 390 //! @brief ルックアップテーブルのスケール設定を取得します。 391 //--------------------------------------------------------------------------- NW_RES_FIELD_PRIMITIVE_DECL(Scale,Scale)392 NW_RES_FIELD_PRIMITIVE_DECL( Scale, Scale ) // GetScale(), SetScale() 393 394 //--------------------------------------------------------------------------- 395 //! @brief スケール値を float で取得します。 396 //! 397 //! @return スケール値です。 398 //--------------------------------------------------------------------------- 399 f32 GetScaleF32() const 400 { 401 const f32 TABLE[] = 402 { 403 1.0f, 2.0f, 4.0f, 8.0f, 0.0f, 0.0f, 0.25f, 0.5f 404 }; 405 406 return TABLE[ref().m_Scale]; 407 } 408 409 //--------------------------------------------------------------------------- 410 //! @brief スケール値を float で設定します。 411 //! 412 //! scale には 1.0f, 2.0f, 4.0f, 8.0f, 0.25f, 0.5f のいずれかを指定します。 413 //! 414 //! @param[in] scale スケール値です。 415 //--------------------------------------------------------------------------- SetScaleF32(f32 scale)416 void SetScaleF32(f32 scale) 417 { 418 if (scale == 1.0f) { ref().m_Scale = SCALE_1; } 419 else if (scale == 2.0f) { ref().m_Scale = SCALE_2; } 420 else if (scale == 4.0f) { ref().m_Scale = SCALE_4; } 421 else if (scale == 8.0f) { ref().m_Scale = SCALE_8; } 422 else if (scale == 0.25f) { ref().m_Scale = SCALE_0_25; } 423 else if (scale == 0.5f) { ref().m_Scale = SCALE_0_5; } 424 else { NW_FATAL_ERROR("Illegal scale value"); } 425 } 426 427 //--------------------------------------------------------------------------- 428 //! @fn ResLookupTable GetSampler() 429 //! @brief ルックアップテーブルを取得します。 430 //--------------------------------------------------------------------------- NW_RES_FIELD_CLASS_DECL(ResLookupTable,Sampler)431 NW_RES_FIELD_CLASS_DECL( ResLookupTable, Sampler ) // GetSampler() 432 433 //--------------------------------------------------------------------------- 434 //! @brief 参照テーブルへアクセスするための入力値の絶対値化がされているかを取得します。 435 //! 436 //! @return 入力値を絶対値として扱う場合には、true を返します。 437 //--------------------------------------------------------------------------- 438 bool IsAbs() const 439 { 440 return this->GetSampler().Dereference().IsAbs(); 441 } 442 443 //--------------------------------------------------------------------------- 444 //! @brief リソースの後始末をおこないます。 445 //--------------------------------------------------------------------------- Cleanup()446 void Cleanup() 447 { 448 NW_ASSERT( IsValid() ); 449 ut::SafeCleanup(this->GetSampler()); 450 } 451 452 //--------------------------------------------------------------------------- 453 //! @brief 参照テーブルを設定します。 454 //! 参照先に設定しますのでリソースの解放はされません。 455 //! 456 //! @param[in] 参照テーブルです。 457 //--------------------------------------------------------------------------- SetSampler(ResLookupTable lookupTable)458 void SetSampler(ResLookupTable lookupTable) 459 { 460 NW_ASSERT(lookupTable.IsValid()); 461 ResImageLookupTable resImageLookupTable = lookupTable.Dereference(); 462 ResReferenceLookupTable referenceLut = ResStaticCast<ResReferenceLookupTable>(GetSampler()); 463 referenceLut.ref().toTargetLut.set_ptr(resImageLookupTable.ptr()); 464 } 465 }; 466 467 //-------------------------------------------------------------------------- 468 //! @brief フラグメントライティングテーブルを表すバイナリリソースクラスです。 469 //--------------------------------------------------------------------------- 470 class ResFragmentLightingTable : public nw::ut::ResCommon< ResFragmentLightingTableData > 471 { 472 public: 473 NW_RES_CTOR( ResFragmentLightingTable ) 474 475 //--------------------------------------------------------------------------- 476 //! @fn ResLightingLookupTable GetReflectanceRSampler() 477 //! @brief リフレクションのR成分の参照テーブルを取得します。 478 //--------------------------------------------------------------------------- 479 //--------------------------------------------------------------------------- 480 //! @fn ResLightingLookupTable GetReflectanceGSampler() 481 //! @brief リフレクションのG成分の参照テーブルを取得します。 482 //--------------------------------------------------------------------------- 483 //--------------------------------------------------------------------------- 484 //! @fn ResLightingLookupTable GetReflectanceBSampler() 485 //! @brief リフレクションのB成分の参照テーブルを取得します。 486 //--------------------------------------------------------------------------- 487 //--------------------------------------------------------------------------- 488 //! @fn ResLightingLookupTable GetFresnelSampler() 489 //! @brief フレネルファクタの参照テーブルを取得します。 490 //--------------------------------------------------------------------------- 491 //--------------------------------------------------------------------------- 492 //! @fn ResLightingLookupTable GetDistribution1Sampler() 493 //! @brief ディストリビューション1の参照テーブルを取得します。 494 //--------------------------------------------------------------------------- 495 //--------------------------------------------------------------------------- 496 //! @fn ResLightingLookupTable GetDistribution0Sampler() 497 //! @brief ディストリビューション0の参照テーブルを取得します。 498 //--------------------------------------------------------------------------- 499 NW_RES_FIELD_CLASS_DECL( ResLightingLookupTable, ReflectanceRSampler ) // GetReflectanceRSampler() 500 NW_RES_FIELD_CLASS_DECL( ResLightingLookupTable, ReflectanceGSampler ) // GetReflectanceGSampler() 501 NW_RES_FIELD_CLASS_DECL( ResLightingLookupTable, ReflectanceBSampler ) // GetReflectanceBSampler() 502 NW_RES_FIELD_CLASS_DECL( ResLightingLookupTable, Distribution0Sampler ) // GetDistribution0Sampler() 503 NW_RES_FIELD_CLASS_DECL( ResLightingLookupTable, Distribution1Sampler ) // GetDistribution1Sampler() 504 NW_RES_FIELD_CLASS_DECL( ResLightingLookupTable, FresnelSampler ) // GetFresnelSampler() 505 506 //--------------------------------------------------------------------------- 507 //! @brief リソースの初期化処理をおこないます。 508 //! 509 //! @param[in] allocator アロケータです。 510 //! @param[in] graphicsFile グラフィックスリソースです。 511 //--------------------------------------------------------------------------- 512 Result Setup(os::IAllocator* allocator, ResGraphicsFile graphicsFile); 513 514 //--------------------------------------------------------------------------- 515 //! @brief リソースの後始末をおこないます。 516 //--------------------------------------------------------------------------- 517 void Cleanup(); 518 }; 519 520 //-------------------------------------------------------------------------- 521 //! @brief テクスチャコンバイナのソースを表すバイナリリソースクラスです。 522 //--------------------------------------------------------------------------- 523 class ResTextureCombinerSource : public nw::ut::ResCommon< ResTextureCombinerSourceData > 524 { 525 public: 526 527 // TODO: チェック GL_PRIMARY_COLOR 528 //! @brief ソースを表します。 529 enum Kind 530 { 531 KIND_TEXTURE0 = GL_TEXTURE0, //!< テクスチャ 0 です。 532 KIND_TEXTURE1 = GL_TEXTURE1, //!< テクスチャ 1 です。 533 KIND_TEXTURE2 = GL_TEXTURE2, //!< テクスチャ 2 です。 534 KIND_TEXTURE3 = GL_TEXTURE3, //!< テクスチャ 3 です。 535 KIND_CONSTANT = GL_CONSTANT, //!< コンスタントカラーです。 536 KIND_PRIMARY_COLOR = GL_PRIMARY_COLOR, //!< 頂点シェーダーの出力結果です。 537 KIND_PREVIOUS = GL_PREVIOUS, //!< 前段の出力結果です。 538 KIND_FRAGMENT_PRIMARY_COLOR_DMP = GL_FRAGMENT_PRIMARY_COLOR_DMP, //!< プライマリカラーです。 539 KIND_FRAGMENT_SECONDARY_COLOR_DMP = GL_FRAGMENT_SECONDARY_COLOR_DMP //!< セカンダリカラーです。 540 }; 541 542 NW_RES_CTOR( ResTextureCombinerSource ) 543 544 //--------------------------------------------------------------------------- 545 //! @fn void SetSources(int idx, u32 value) 546 //! @brief テクスチャコンバイナのソースセットのリストに要素を設定します。 547 //--------------------------------------------------------------------------- 548 //--------------------------------------------------------------------------- 549 //! @fn s32 GetSourcesCount() const 550 //! @brief テクスチャコンバイナのソースセットの要素数を取得します。 551 //--------------------------------------------------------------------------- 552 //--------------------------------------------------------------------------- 553 //! @fn u32 GetSources(int idx) const 554 //! @brief テクスチャコンバイナのソースセットを取得します。 555 //--------------------------------------------------------------------------- 556 NW_RES_FIELD_PRIMITIVE_FIXED_LIST_DECL( u32, Sources ) // GetSourcesCount(), GetSources(int), GetSources(), SetSources(int,u32) 557 }; 558 559 //-------------------------------------------------------------------------- 560 //! @brief テクスチャコンバイナのオペランドを表すバイナリリソースクラスです。 561 //--------------------------------------------------------------------------- 562 class ResTextureCombinerOperand : public nw::ut::ResCommon< ResTextureCombinerOperandData > 563 { 564 public: 565 566 //! @brief オペランドです。 567 enum Kind 568 { 569 KIND_SRC_COLOR = GL_SRC_COLOR, //!< RGB です。 570 KIND_ONE_MINUS_SRC_COLOR = GL_ONE_MINUS_SRC_COLOR, //!< 1 - RGB です。 571 KIND_SRC_ALPHA = GL_SRC_ALPHA, //!< アルファです。 572 KIND_ONE_MINUS_SRC_ALPHA = GL_ONE_MINUS_SRC_ALPHA, //!< 1 - アルファです。 573 574 #ifdef NW_TARGET_CTR_GL_FINAL 575 KIND_SRC_R = GL_SRC_R_DMP, //!< R 成分です。 576 KIND_SRC_G = GL_SRC_G_DMP, //!< G 成分です。 577 KIND_SRC_B = GL_SRC_B_DMP, //!< B 成分です。 578 KIND_ONE_MINUS_SRC_R = GL_ONE_MINUS_SRC_R_DMP, //!< 1 - R 成分です。 579 KIND_ONE_MINUS_SRC_G = GL_ONE_MINUS_SRC_G_DMP, //!< 1 - G 成分です。 580 KIND_ONE_MINUS_SRC_B = GL_ONE_MINUS_SRC_B_DMP //!< 1 - B 成分です。 581 #else 582 KIND_SRC_R = GL_SRC_COLOR, 583 KIND_SRC_G = GL_SRC_COLOR, 584 KIND_SRC_B = GL_SRC_COLOR, 585 KIND_ONE_MINUS_SRC_R = GL_ONE_MINUS_SRC_COLOR, 586 KIND_ONE_MINUS_SRC_G = GL_ONE_MINUS_SRC_COLOR, 587 KIND_ONE_MINUS_SRC_B = GL_ONE_MINUS_SRC_COLOR 588 #endif 589 }; 590 591 NW_RES_CTOR( ResTextureCombinerOperand ) 592 593 //--------------------------------------------------------------------------- 594 //! @fn void SetOperands(int idx, u32 value) 595 //! @brief テクスチャコンバイナのオペランドセットのリストに要素を設定します。 596 //--------------------------------------------------------------------------- 597 //--------------------------------------------------------------------------- 598 //! @fn s32 GetOperandsCount() const 599 //! @brief テクスチャコンバイナのオペランドセットの要素数を取得します。 600 //--------------------------------------------------------------------------- 601 //--------------------------------------------------------------------------- 602 //! @fn u32 GetOperands(int idx) const 603 //! @brief テクスチャコンバイナのオペランドセットを取得します。 604 //--------------------------------------------------------------------------- 605 NW_RES_FIELD_PRIMITIVE_FIXED_LIST_DECL( u32, Operands ) // GetOperandsCount(), GetOperands(int), GetOperands(), SetOperands(int,u32) 606 }; 607 608 609 //-------------------------------------------------------------------------- 610 //! @brief アルファテストを表すバイナリリソースクラスです。 611 //--------------------------------------------------------------------------- 612 class ResAlphaTest : public nw::ut::ResCommon< ResAlphaTestData > 613 { 614 public: 615 616 NW_RES_CTOR( ResAlphaTest ) 617 618 //! @brief アルファテストの比較関数です。 619 enum TestFunc 620 { 621 TESTFUNC_NEVER = 0, //!< すべて不通過です。 622 TESTFUNC_ALWAYS = 1, //!< すべて通過です。 623 TESTFUNC_EQUAL = 2, //!< 参照値と等しければ通過します。 624 TESTFUNC_NOTEQUAL = 3, //!< 参照値と等しくなければ通過します。 625 TESTFUNC_LESS = 4, //!< 参照値より小さければ通過します。 626 TESTFUNC_LEQUAL = 5, //!< 参照値以下であれば通過します。 627 TESTFUNC_GREATER = 6, //!< 参照値より大きければ通過します。 628 TESTFUNC_GEQUAL = 7 //!< 参照値以上であれば通過します。 629 }; 630 631 //--------------------------------------------------------------------------- 632 //! @brief アルファテストが有効化かどうかを取得します。 633 //! 634 //! @return アルファテストが有効な場合には、true を返します。 635 //--------------------------------------------------------------------------- IsTestEnabled()636 bool IsTestEnabled() const 637 { 638 enum { CMD_SHIFT = 0, CMD_MASK = 0x1 }; 639 640 return internal::GetCmdValue( ref().m_CommandBuffer[0], CMD_MASK, CMD_SHIFT ) ? true : false; 641 } 642 643 //--------------------------------------------------------------------------- 644 //! @brief アルファテストの有効フラグを設定します。 645 //! 646 //! @param[in] value アルファテストを有効にする場合は true、無効にする場合は false を設定します。 647 //--------------------------------------------------------------------------- SetTestEnabled(bool value)648 void SetTestEnabled(bool value) 649 { 650 enum { CMD_SHIFT = 0, CMD_MASK = 0x1 }; 651 652 internal::SetCmdValue( &ref().m_CommandBuffer[0], value, CMD_MASK, CMD_SHIFT ); 653 } 654 655 //--------------------------------------------------------------------------- 656 //! @brief アルファテストに用いる比較関数を取得します。 657 //! 658 //! @return アルファテストの比較関数の設定値です。 659 //--------------------------------------------------------------------------- GetTestFunc()660 TestFunc GetTestFunc() const 661 { 662 enum { CMD_SHIFT = 4, CMD_MASK = 0x7 }; 663 664 return (TestFunc)internal::GetCmdValue( ref().m_CommandBuffer[0], CMD_MASK, CMD_SHIFT ); 665 } 666 667 //--------------------------------------------------------------------------- 668 //! @brief アルファテストに用いる比較関数を設定します。 669 //! 670 //! @param[in] value アルファテストの比較関数です。 671 //--------------------------------------------------------------------------- SetTestFunc(TestFunc value)672 void SetTestFunc(TestFunc value) 673 { 674 enum { CMD_SHIFT = 4, CMD_MASK = 0x7 }; 675 676 internal::SetCmdValue( &ref().m_CommandBuffer[0], value, CMD_MASK, CMD_SHIFT ); 677 } 678 679 //--------------------------------------------------------------------------- 680 //! @brief アルファテストに用いる参照値を取得します。 681 //! 682 //! @return アルファテストに用いる参照値です。 683 //--------------------------------------------------------------------------- GetTestReference()684 f32 GetTestReference() const 685 { 686 enum { CMD_SHIFT = 8, CMD_MASK = 0xff }; 687 688 return static_cast<f32>(internal::GetCmdValue( ref().m_CommandBuffer[0], CMD_MASK, CMD_SHIFT )) / 255.0f; 689 } 690 691 //--------------------------------------------------------------------------- 692 //! @brief アルファテストに用いる参照値を設定します。 693 //! 694 //! @param[in] value アルファテストに用いる参照値です。 695 //--------------------------------------------------------------------------- SetTestReference(f32 value)696 void SetTestReference(f32 value) 697 { 698 enum { CMD_SHIFT = 8, CMD_MASK = 0xff }; 699 700 internal::SetCmdValue( &ref().m_CommandBuffer[0], (0.5f + (value * 255.0f)), CMD_MASK, CMD_SHIFT ); 701 } 702 703 //--------------------------------------------------------------------------- 704 //! @fn u32 * GetCommandBuffer() 705 //! @brief コマンドバッファへのポインタを取得します。 706 //--------------------------------------------------------------------------- 707 NW_RES_FIELD_COMMAND_BUFFER() 708 }; 709 710 711 //-------------------------------------------------------------------------- 712 //! @brief テクスチャコンバイナのソースを表すバイナリリソースクラスです。 713 //--------------------------------------------------------------------------- 714 class ResTextureCombiner : public nw::ut::ResCommon< ResTextureCombinerData > 715 { 716 public: 717 //--------------------------------------------------------------------------- 718 //! @brief テクスチャコンバイナのコンスタント値の定義です。 719 //--------------------------------------------------------------------------- 720 enum Constant 721 { 722 CONSTANT0, //!< コンスタント0 の設定を使用します。 723 CONSTANT1, //!< コンスタント1 の設定を使用します。 724 CONSTANT2, //!< コンスタント2 の設定を使用します。 725 CONSTANT3, //!< コンスタント3 の設定を使用します。 726 CONSTANT4, //!< コンスタント4 の設定を使用します。 727 CONSTANT5, //!< コンスタント5 の設定を使用します。 728 EMISSION, //!< マテリアルのエミッションカラーの設定を使用します。 729 AMBIENT, //!< マテリアルのアンビエントカラーの設定を使用します。 730 DIFFUSE, //!< マテリアルのディフューズカラーの設定を使用します。 731 SPECULAR0, //!< マテリアルのスペキュラーカラー 0 の設定を使用します。 732 SPECULAR1 //!< マテリアルのスペキュラーカラー 1 の設定を使用します。 733 }; 734 735 NW_RES_CTOR( ResTextureCombiner ) 736 737 //--------------------------------------------------------------------------- 738 //! @fn void SetConstant(Constant value) 739 //! @brief テクスチャコンバイナの定数設定を設定します。 740 //--------------------------------------------------------------------------- 741 //--------------------------------------------------------------------------- 742 //! @fn Constant GetConstant() const 743 //! @brief テクスチャコンバイナの定数設定を取得します。 744 //--------------------------------------------------------------------------- 745 NW_RES_FIELD_PRIMITIVE_DECL( Constant, Constant ) // GetConstant(), SetConstant() 746 747 //--------------------------------------------------------------------------- 748 //! @fn u32 * GetCommandBuffer() 749 //! @brief コマンドバッファへのポインタを取得します。 750 //--------------------------------------------------------------------------- 751 NW_RES_FIELD_COMMAND_BUFFER(); 752 753 //--------------------------------------------------------------------------- 754 //! @brief コンスタントカラーの設定コマンドを u32 の rgba 値として設定します。 755 //! 756 //! @param[in] rgba コンスタントカラーの RGBA 32bit 表現です。 757 //--------------------------------------------------------------------------- SetConstantCmd(u32 rgba)758 void SetConstantCmd(u32 rgba) { ref().m_CmdConstant = rgba; } 759 760 //--------------------------------------------------------------------------- 761 //! @brief テクスチャコンバイナのソース設定の定義です。 762 //--------------------------------------------------------------------------- 763 typedef enum 764 { 765 SOURCE_PRIMARY_COLOR = 0, //!< 頂点シェーダーの出力結果です。 766 SOURCE_FRAGMENT_PRIMARY_COLOR, //!< プライマリカラーです。 767 SOURCE_FRAGMENT_SECONDARY_COLOR, //!< セカンダリカラーです。 768 SOURCE_TEXTURE0, //!< テクスチャ 0 です。 769 SOURCE_TEXTURE1, //!< テクスチャ 1 です。 770 SOURCE_TEXTURE2, //!< テクスチャ 2 です。 771 SOURCE_TEXTURE3, //!< テクスチャ 3 です。 772 SOURCE_CONSTANT = 0xE, //!< コンスタントカラーです。 773 SOURCE_PREVIOUS = 0xF, //!< 前段の出力結果です。 774 SOURCE_PREVIOUS_BUFFER = 0xD //!< 前段のバッファです。 775 } Source; 776 777 //--------------------------------------------------------------------------- 778 //! @brief テクスチャコンバイナの RGB オペランド設定の定義です。 779 //--------------------------------------------------------------------------- 780 typedef enum 781 { 782 OPERANDRGB_SRC_COLOR = 0, //!< RGB です。 783 OPERANDRGB_ONE_MINUS_SRC_COLOR = 0x1, //!< 1 - RGB です。 784 OPERANDRGB_SRC_ALPHA = 0x2, //!< アルファです。 785 OPERANDRGB_ONE_MINUS_SRC_ALPHA = 0x3, //!< 1 - アルファです。 786 787 OPERANDRGB_RED = 0x4, //!< R 成分です。 788 OPERANDRGB_ONE_MINUS_RED = 0x5, //!< 1 - R 成分です。 789 OPERANDRGB_GREEN = 0x8, //!< G 成分です。 790 OPERANDRGB_ONE_MINUS_GREEN = 0x9, //!< 1 - G 成分です。 791 OPERANDRGB_BLUE = 0xC, //!< B 成分です。 792 OPERANDRGB_ONE_MINUS_BLUE = 0xD //!< 1 - B 成分です。 793 } OperandRgb; 794 795 //--------------------------------------------------------------------------- 796 //! @brief テクスチャコンバイナの Alpha オペランド設定の定義です。 797 //--------------------------------------------------------------------------- 798 typedef enum 799 { 800 OPERANDALPHA_SRC_ALPHA = 0, //!< アルファです。 801 OPERANDALPHA_SRC_ONE_MINUS_ALPHA = 0x1, //!< 1 - アルファです。 802 803 OPERANDALPHA_RED = 0x2, //!< R 成分です。 804 OPERANDALPHA_ONE_MINUS_RED = 0x3, //!< 1 - R 成分です。 805 OPERANDALPHA_GREEN = 0x4, //!< G 成分です。 806 OPERANDALPHA_ONE_MINUS_GREEN = 0x5, //!< 1 - G 成分です。 807 OPERANDALPHA_BLUE = 0x6, //!< B 成分です。 808 OPERANDALPHA_ONE_MINUS_BLUE = 0x7 //!< 1 - B 成分です。 809 810 } OperandAlpha; 811 812 //--------------------------------------------------------------------------- 813 //! @brief テクスチャコンバイナの コンバイナ関数の定義です。 814 //! 815 //! A はソース 0 、B はソース 1 、C はソース 2 をそれぞれ表します。 816 //--------------------------------------------------------------------------- 817 typedef enum 818 { 819 COMBINE_REPLACE = 0, //!< A です 820 COMBINE_MODULATE, //!< A * B です。 821 COMBINE_ADD, //!< A + B です。 822 COMBINE_ADDSIGNED, //!< A + B - 0.5 です。 823 COMBINE_INTERPOLATE, //!< A * C + B * ( 1 - C ) です。 824 COMBINE_SUBTRACT, //!< A - B です。 825 COMBINE_DOT3_RGB, //!< RGB ← Dot ( A , B ) です。 826 COMBINE_DOT3_RGBA, //!< RGBA ← Dot ( A , B ) です。 827 COMBINE_MULT_ADD, //!< ( A * B ) + C です。 828 COMBINE_ADD_MULT //!< ( A + B ) * C です。 829 } Combine; 830 831 //--------------------------------------------------------------------------- 832 //! @brief テクスチャコンバイナの スケール設定の定義です。 833 //--------------------------------------------------------------------------- 834 typedef enum 835 { 836 SCALE_ONE = 0, //!< 1.0 倍。 837 SCALE_TWO, //!< 2.0 倍。 838 SCALE_FOUR //!< 4.0 倍。 839 } Scale; 840 841 //--------------------------------------------------------------------------- 842 //! @brief RGB 値のソースを取得します。 843 //! 844 //! @param[in] index 取得するソースのインデクスです。 845 //! 846 //! @return ソースの設定です。 847 //--------------------------------------------------------------------------- 848 //! @brief カラーのソースを取得します。 849 //! 850 //! @param[in] index 851 //! 852 //! @return ソースを返します。 GetSourceRgb(s32 index)853 Source GetSourceRgb(s32 index) const 854 { 855 NW_MINMAX_ASSERT( index, 0, 2 ); 856 enum { CMD_WIDTH = 4, CMD_MASK = 0xF }; 857 858 return (Source)internal::GetCmdValue( ref().m_CmdSource, CMD_MASK, CMD_WIDTH * index ); 859 } 860 861 //--------------------------------------------------------------------------- 862 //! @brief RGB 値のソースを設定します。 863 //! 864 //! @param[in] index 設定するソースのインデクスです。 865 //! @param[in] value ソースの設定値です。 866 //--------------------------------------------------------------------------- SetSourceRgb(s32 index,Source value)867 void SetSourceRgb(s32 index, Source value) 868 { 869 NW_MINMAX_ASSERT( index, 0, 2 ); 870 871 enum { CMD_WIDTH = 4, CMD_MASK = 0xF }; 872 873 internal::SetCmdValue( &ref().m_CmdSource, value, CMD_MASK, CMD_WIDTH * index ); 874 } 875 876 //--------------------------------------------------------------------------- 877 //! @brief Alpha 値のソースを取得します。 878 //! 879 //! @param[in] index 取得するソースのインデクスです。 880 //! 881 //! @return ソースの設定です。 882 //--------------------------------------------------------------------------- GetSourceAlpha(s32 index)883 Source GetSourceAlpha(s32 index) const 884 { 885 NW_MINMAX_ASSERT( index, 0, 2 ); 886 887 enum { CMD_SHIFT = 16, CMD_WIDTH = 4, CMD_MASK = 0xF }; 888 889 return (Source)internal::GetCmdValue( ref().m_CmdSource, CMD_MASK, CMD_WIDTH * index + CMD_SHIFT ); 890 } 891 892 //--------------------------------------------------------------------------- 893 //! @brief Alpha 値のソースを設定します。 894 //! 895 //! @param[in] index 設定するソースのインデクスです。 896 //! @param[in] value ソースの設定値です。 897 //--------------------------------------------------------------------------- SetSourceAlpha(s32 index,Source value)898 void SetSourceAlpha(s32 index, Source value) 899 { 900 NW_MINMAX_ASSERT( index, 0, 2 ); 901 902 enum { CMD_SHIFT = 16, CMD_WIDTH = 4, CMD_MASK = 0xF }; 903 904 internal::SetCmdValue( &ref().m_CmdSource, value, CMD_MASK, CMD_WIDTH * index + CMD_SHIFT ); 905 } 906 907 //--------------------------------------------------------------------------- 908 //! @brief RGB 値のオペランドを取得します。 909 //! 910 //! @param[in] index 取得するオペランドのインデクスです。 911 //! 912 //! @return オペランドの設定です。 913 //--------------------------------------------------------------------------- 914 //! @brief カラーのオペランドを取得します。 915 //! 916 //! @param[in] index 917 //! 918 //! @return オペランドを返します。 GetOperandRgb(s32 index)919 OperandRgb GetOperandRgb(s32 index) const 920 { 921 NW_MINMAX_ASSERT( index, 0, 2 ); 922 enum { CMD_WIDTH = 4, CMD_MASK = 0xF }; 923 924 return (OperandRgb)internal::GetCmdValue( ref().m_CmdOperand, CMD_MASK, CMD_WIDTH * index ); 925 } 926 927 //--------------------------------------------------------------------------- 928 //! @brief RGB 値のオペランドを設定します。 929 //! 930 //! @param[in] index 設定するオペランドのインデクスです。 931 //! @param[in] value オペランドの設定値です。 932 //--------------------------------------------------------------------------- SetOperandRgb(s32 index,OperandRgb value)933 void SetOperandRgb(s32 index, OperandRgb value) 934 { 935 NW_MINMAX_ASSERT( index, 0, 2 ); 936 937 enum { CMD_WIDTH = 4, CMD_MASK = 0xF }; 938 939 internal::SetCmdValue( &ref().m_CmdOperand, value, CMD_MASK, CMD_WIDTH * index ); 940 } 941 942 //--------------------------------------------------------------------------- 943 //! @brief Alpha 値のオペランドを取得します。 944 //! 945 //! @param[in] index 取得するオペランドのインデクスです。 946 //! 947 //! @return オペランドの設定です。 948 //--------------------------------------------------------------------------- GetOperandAlpha(s32 index)949 OperandAlpha GetOperandAlpha(s32 index) const 950 { 951 NW_MINMAX_ASSERT( index, 0, 2 ); 952 953 enum { CMD_SHIFT = 12, CMD_WIDTH = 4, CMD_MASK = 0xF }; 954 955 return (OperandAlpha)internal::GetCmdValue( ref().m_CmdOperand, CMD_MASK, CMD_WIDTH * index + CMD_SHIFT ); 956 } 957 958 //--------------------------------------------------------------------------- 959 //! @brief Alpha 値のオペランドを設定します。 960 //! 961 //! @param[in] index 設定するオペランドのインデクスです。 962 //! @param[in] value オペランドの設定値です。 963 //--------------------------------------------------------------------------- SetOperandAlpha(s32 index,OperandAlpha value)964 void SetOperandAlpha(s32 index, OperandAlpha value) 965 { 966 NW_MINMAX_ASSERT( index, 0, 2 ); 967 enum { CMD_SHIFT = 12, CMD_WIDTH = 4, CMD_MASK = 0xF }; 968 internal::SetCmdValue( &ref().m_CmdOperand, value, CMD_MASK, CMD_WIDTH * index + CMD_SHIFT ); 969 } 970 971 //--------------------------------------------------------------------------- 972 //! @brief RGB 値のコンバイナ関数を取得します。 973 //! 974 //! @return コンバイナ関数を返します。 975 //--------------------------------------------------------------------------- 976 //! @brief カラーの計算式を取得します。 977 //! 978 //! @return 計算式を返します。 GetCombineRgb()979 Combine GetCombineRgb() const 980 { 981 enum { CMD_SHIFT = 0, CMD_MASK = 0xF }; 982 return (Combine)internal::GetCmdValue( ref().m_CmdCombine, CMD_MASK, CMD_SHIFT ); 983 } 984 985 //--------------------------------------------------------------------------- 986 //! @brief RGB 値のコンバイナ関数を設定します。 987 //! 988 //! @param[in] value 設定するコンバイナ関数の値です。 989 //--------------------------------------------------------------------------- SetCombineRgb(Combine value)990 void SetCombineRgb(Combine value) 991 { 992 enum { CMD_SHIFT = 0, CMD_MASK = 0xF }; 993 internal::SetCmdValue( &ref().m_CmdCombine, value, CMD_MASK, CMD_SHIFT ); 994 } 995 996 //--------------------------------------------------------------------------- 997 //! @brief Alpha 値のコンバイナ関数を取得します。 998 //! 999 //! @return コンバイナ関数です。 1000 //--------------------------------------------------------------------------- GetCombineAlpha()1001 Combine GetCombineAlpha() const 1002 { 1003 enum { CMD_SHIFT = 16, CMD_MASK = 0xF }; 1004 return (Combine)internal::GetCmdValue( ref().m_CmdCombine, CMD_MASK, CMD_SHIFT ); 1005 } 1006 1007 //--------------------------------------------------------------------------- 1008 //! @brief Alpha 値のコンバイナ関数を設定します。 1009 //! 1010 //! @param[in] value 設定するコンバイナ関数の値です。 1011 //--------------------------------------------------------------------------- SetCombineAlpha(Combine value)1012 void SetCombineAlpha(Combine value) 1013 { 1014 enum { CMD_SHIFT = 16, CMD_MASK = 0xF }; 1015 internal::SetCmdValue( &ref().m_CmdCombine, value, CMD_MASK, CMD_SHIFT ); 1016 } 1017 1018 //--------------------------------------------------------------------------- 1019 //! @brief RGB 値のスケールを取得します。 1020 //! 1021 //! @return スケールの値です。 1022 //--------------------------------------------------------------------------- 1023 //! @brief カラーのスケールを取得します。 1024 //! 1025 //! @return スケールを返します。 GetScaleRgb()1026 Scale GetScaleRgb() const 1027 { 1028 enum { CMD_SHIFT = 0, CMD_MASK = 0x3 }; 1029 return (Scale)internal::GetCmdValue( ref().m_CmdScale, CMD_MASK, CMD_SHIFT ); 1030 } 1031 1032 //--------------------------------------------------------------------------- 1033 //! @brief RGB 値のスケールを設定します。 1034 //! 1035 //! @param[in] value 設定するスケールの値です。 1036 //--------------------------------------------------------------------------- SetScaleRgb(Scale value)1037 void SetScaleRgb(Scale value) 1038 { 1039 enum { CMD_SHIFT = 0, CMD_MASK = 0x3 }; 1040 internal::SetCmdValue( &ref().m_CmdScale, value, CMD_MASK, CMD_SHIFT ); 1041 } 1042 1043 //--------------------------------------------------------------------------- 1044 //! @brief Alpha 値のスケールを取得します。 1045 //! 1046 //! @return スケールの値です。 1047 //--------------------------------------------------------------------------- GetScaleAlpha()1048 Scale GetScaleAlpha() const 1049 { 1050 enum { CMD_SHIFT = 16, CMD_MASK = 0x3 }; 1051 return (Scale)internal::GetCmdValue( ref().m_CmdScale, CMD_MASK, CMD_SHIFT ); 1052 } 1053 1054 //--------------------------------------------------------------------------- 1055 //! @brief Alpha 値のスケールを設定します。 1056 //! 1057 //! @param[in] value 設定するスケールの値です。 1058 //--------------------------------------------------------------------------- SetScaleAlpha(Scale value)1059 void SetScaleAlpha(Scale value) 1060 { 1061 enum { CMD_SHIFT = 16, CMD_MASK = 0x3 }; 1062 internal::SetCmdValue( &ref().m_CmdScale, value, CMD_MASK, CMD_SHIFT ); 1063 } 1064 }; 1065 1066 //-------------------------------------------------------------------------- 1067 //! @brief フラグメントシェーダを表すバイナリリソースクラスです。 1068 //--------------------------------------------------------------------------- 1069 class ResFragmentShader : public nw::ut::ResCommon< ResFragmentShaderData > 1070 { 1071 public: 1072 //! @brief バッファのインプットを表します。 1073 enum BufferInput 1074 { 1075 BUFFERINPUT_PREVIOUS_BUFFER = 0, //!< 前段のバッファです。 1076 BUFFERINPUT_PREVIOUS = 1 //!< 前段の出力結果です。 1077 }; 1078 1079 NW_RES_CTOR( ResFragmentShader ) 1080 1081 //--------------------------------------------------------------------------- 1082 //! @fn ResTextureCombinerData & GetTextureCombinersData(int idx) 1083 //! @brief テクスチャコンバイナの設定の配列を取得します。 1084 //--------------------------------------------------------------------------- 1085 //--------------------------------------------------------------------------- 1086 //! @fn s32 GetTextureCombinersCount() const 1087 //! @brief テクスチャコンバイナの設定の要素数を取得します。 1088 //--------------------------------------------------------------------------- 1089 //--------------------------------------------------------------------------- 1090 //! @fn ResTextureCombiner GetTextureCombiners(int idx) 1091 //! @brief テクスチャコンバイナの設定を取得します。 1092 //--------------------------------------------------------------------------- 1093 //--------------------------------------------------------------------------- 1094 //! @fn ResFragmentLightingTable GetFragmentLightingTable() 1095 //! @brief フラグメントライティングテーブルを取得します。 1096 //--------------------------------------------------------------------------- 1097 //--------------------------------------------------------------------------- 1098 //! @fn ResFragmentLightingData & GetFragmentLightingData() 1099 //! @brief フラグメントライティング設定を取得します。 1100 //--------------------------------------------------------------------------- 1101 //--------------------------------------------------------------------------- 1102 //! @fn ResFragmentLighting GetFragmentLighting() 1103 //! @brief フラグメントライティング設定を取得します。 1104 //--------------------------------------------------------------------------- 1105 //--------------------------------------------------------------------------- 1106 //! @fn ResAlphaTestData & GetAlphaTestData() 1107 //! @brief アルファテストの設定を取得します。 1108 //--------------------------------------------------------------------------- 1109 //--------------------------------------------------------------------------- 1110 //! @fn ResAlphaTest GetAlphaTest() 1111 //! @brief アルファテストの設定を取得します。 1112 //--------------------------------------------------------------------------- 1113 NW_RES_FIELD_RESSTRUCT_DECL( ResFragmentLighting, FragmentLighting ) // GetFragmentLighting(), GetFragmentLightingData() 1114 NW_RES_FIELD_CLASS_DECL( ResFragmentLightingTable, FragmentLightingTable ) // GetFragmentLightingTable() 1115 NW_RES_FIELD_STRUCT_FIXED_LIST_DECL( ResTextureCombiner, TextureCombiners ) // GetTextureCombinersCount(), GetTextureCombiners(idx) 1116 NW_RES_FIELD_RESSTRUCT_DECL( ResAlphaTest, AlphaTest ) // GetAlphaTest(), GetAlphaTestData() 1117 1118 //--------------------------------------------------------------------------- 1119 //! @brief リソースの初期化処理をおこないます。 1120 //! 1121 //! @param[in] allocator アロケータです。 1122 //! @param[in] graphicsFile グラフィックスリソースです。 1123 //--------------------------------------------------------------------------- 1124 Result Setup(os::IAllocator* allocator, ResGraphicsFile graphicsFile); 1125 1126 //--------------------------------------------------------------------------- 1127 //! @brief リソースの後始末をおこないます。 1128 //--------------------------------------------------------------------------- 1129 void Cleanup(); 1130 1131 //! @brief フラグメントシェーダーが正しく設定されているか確認します。 1132 bool CheckFragmentShader(); 1133 1134 //! @brief バッファカラーを U32 で取得します。 1135 //! 1136 //! @return バッファカラーを U32 で返します。 GetBufferColorU32()1137 u32 GetBufferColorU32() const 1138 { 1139 return ref().m_BufferCommand[0]; 1140 } 1141 1142 //! @brief バッファカラーを設定します。 1143 //! 1144 //! @param[in] r 設定するバッファカラーの R 成分です。 1145 //! @param[in] g 設定するバッファカラーの G 成分です。 1146 //! @param[in] b 設定するバッファカラーの B 成分です。 SetBufferColor(f32 r,f32 g,f32 b)1147 void SetBufferColor( f32 r, f32 g, f32 b ) 1148 { 1149 ref().m_BufferColor.Set(r, g, b); 1150 ref().m_BufferCommand[0] = ref().m_BufferColor.ToPicaU32(); 1151 } 1152 1153 //! @brief バッファカラーを設定します。 1154 //! 1155 //! @param[in] r 設定するバッファカラーの R 成分です。 1156 //! @param[in] g 設定するバッファカラーの G 成分です。 1157 //! @param[in] b 設定するバッファカラーの B 成分です。 1158 //! @param[in] b 設定するバッファカラーのアルファ成分です。 SetBufferColor(f32 r,f32 g,f32 b,f32 a)1159 void SetBufferColor( f32 r, f32 g, f32 b, f32 a ) 1160 { 1161 ref().m_BufferColor.Set(r, g, b, a); 1162 ref().m_BufferCommand[0] = ref().m_BufferColor.ToPicaU32(); 1163 } 1164 1165 //! @brief バッファカラーを取得します。 1166 //! 1167 //! @return バッファカラーを返します。 GetBufferColor()1168 const ut::FloatColor& GetBufferColor() const 1169 { 1170 return ref().m_BufferColor; 1171 } 1172 1173 //! @brief バッファカラーを設定します。 1174 //! 1175 //! @param[in] value 設定するバッファカラーです。 SetBufferColor(const ut::FloatColor & value)1176 void SetBufferColor(const ut::FloatColor& value) 1177 { 1178 ref().m_BufferColor = value; 1179 ref().m_BufferCommand[0] = ref().m_BufferColor.ToPicaU32(); 1180 } 1181 1182 //! @brief RGB のバッファインプットを取得します。 1183 //! 1184 //! @param[in] index 取得するコンバイナのインデクスです。 GetBufferInputRgb(s32 index)1185 BufferInput GetBufferInputRgb(s32 index) const 1186 { 1187 NW_MINMAX_ASSERT(index, 1, 4); 1188 1189 enum { CMD_SHIFT = 7, CMD_MASK = 0x1 }; 1190 return static_cast<BufferInput>(internal::GetCmdValue( ref().m_BufferCommand[2], CMD_MASK, CMD_SHIFT+index )); 1191 } 1192 1193 //! @brief RGB のバッファインプットを設定します。 1194 //! 1195 //! @param[in] index 設定するコンバイナのインデクスです。 1196 //! @param[in] value 設定するバッファインプットです。 SetBufferInputRgb(s32 index,BufferInput value)1197 void SetBufferInputRgb(s32 index, BufferInput value) 1198 { 1199 NW_MINMAX_ASSERT(index, 1, 4); 1200 1201 enum { CMD_SHIFT = 7, CMD_MASK = 0x1 }; 1202 internal::SetCmdValue( &ref().m_BufferCommand[2], value, CMD_MASK, CMD_SHIFT+index ); 1203 } 1204 1205 //! @brief Alpha のバッファインプットを取得します。 1206 //! 1207 //! @param[in] index 取得するコンバイナのインデクスです。 GetBufferInputAlpha(s32 index)1208 BufferInput GetBufferInputAlpha(s32 index) const 1209 { 1210 NW_MINMAX_ASSERT(index, 1, 4); 1211 1212 enum { CMD_SHIFT = 11, CMD_MASK = 0x1 }; 1213 return static_cast<BufferInput>(internal::GetCmdValue( ref().m_BufferCommand[2], CMD_MASK, CMD_SHIFT+index )); 1214 } 1215 1216 //! @brief Alpha のバッファインプットを設定します。 1217 //! 1218 //! @param[in] index 設定するコンバイナのインデクスです。 1219 //! @param[in] value 設定するバッファインプットです。 SetBufferInputAlpha(s32 index,BufferInput value)1220 void SetBufferInputAlpha(s32 index, BufferInput value) 1221 { 1222 NW_MINMAX_ASSERT(index, 1, 4); 1223 1224 enum { CMD_SHIFT = 11, CMD_MASK = 0x1 }; 1225 internal::SetCmdValue( &ref().m_BufferCommand[2], value, CMD_MASK, CMD_SHIFT+index ); 1226 } 1227 }; 1228 1229 } // namespace res 1230 } // namespace gfx 1231 } // namespace nw 1232 1233 #endif // NW_GFX_RESFRAGMENTSHADER_H_ 1234