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