1 /*---------------------------------------------------------------------------* 2 Project: NintendoWare 3 File: gfx_ResMaterial.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_RESMATERIAL_H_ 19 #define NW_GFX_RESMATERIAL_H_ 20 21 #include <GLES2/gl2.h> 22 #include <GLES2/gl2ext.h> 23 24 #include <nw/types.h> 25 #include <nw/ut/ut_Flag.h> 26 #include <nw/ut/ut_Color.h> 27 #include <nw/ut/ut_ResUtil.h> 28 #include <nw/ut/ut_ResDictionary.h> 29 #include <nw/gfx/res/gfx_ResRevision.h> 30 #include <nw/gfx/res/gfx_ResTextureMapper.h> 31 #include <nw/gfx/res/gfx_ResTexture.h> 32 #include <nw/gfx/res/gfx_ResShader.h> 33 #include <nw/gfx/res/gfx_ResFragmentShader.h> 34 #include <nw/gfx/res/gfx_ResTypeInfo.h> 35 #include <nw/gfx/gfx_CommandUtil.h> 36 37 namespace nw { 38 namespace gfx { 39 namespace res { 40 41 class ResGraphicsFile; 42 43 //! @details :private 44 struct ResMaterialColorData 45 { 46 nw::ut::ResFloatColor m_Emission; 47 nw::ut::ResFloatColor m_AmbientAndVertexColorScale; 48 nw::ut::ResFloatColor m_Diffuse; 49 nw::ut::ResFloatColor m_Specular0; 50 nw::ut::ResFloatColor m_Specular1; 51 nw::ut::ResFloatColor m_Constant0; 52 nw::ut::ResFloatColor m_Constant1; 53 nw::ut::ResFloatColor m_Constant2; 54 nw::ut::ResFloatColor m_Constant3; 55 nw::ut::ResFloatColor m_Constant4; 56 nw::ut::ResFloatColor m_Constant5; 57 nw::ut::ResU32 m_EmissionU32; 58 nw::ut::ResU32 m_AmbientU32; 59 nw::ut::ResU32 m_DiffuseU32; 60 nw::ut::ResU32 m_Specular0U32; 61 nw::ut::ResU32 m_Specular1U32; 62 nw::ut::ResU32 m_Constant0U32; 63 nw::ut::ResU32 m_Constant1U32; 64 nw::ut::ResU32 m_Constant2U32; 65 nw::ut::ResU32 m_Constant3U32; 66 nw::ut::ResU32 m_Constant4U32; 67 nw::ut::ResU32 m_Constant5U32; 68 69 void* m_CommandCache; 70 }; 71 72 // ResRasterizationData::m_CommandBuffer のフォーマットは次の形式になっています。 73 // 74 // [0] 0x040のデータ 75 // [1] 0x040へのヘッダ(BE:1) 76 //! @details :private 77 struct ResRasterizationData 78 { 79 enum Flag 80 { 81 FLAG_POLYGON_OFFSET_ENABLED = 0x1 << 0 82 }; 83 84 nw::ut::ResU32 m_Flags; 85 nw::ut::ResU32 m_CullingMode; 86 nw::ut::ResF32 m_PolygonOffsetUnit; 87 88 nw::ut::ResU32 m_CommandBuffer[2]; 89 }; 90 91 // ResBlendOperationData::m_CommandBuffer のフォーマットは次の形式になっています。 92 // 93 // [0] 0x100のデータ 94 // [1] 0x100へのヘッダ(BE:0xf) 95 // [2] 0x101のデータ 96 // [3] 0x102のデータ 97 // [4] 0x103のデータ 98 // [5] padding 99 //! @details :private 100 struct ResBlendOperationData 101 { 102 nw::ut::ResS32 m_Mode; 103 nw::ut::ResFloatColor m_BlendColor; 104 105 nw::ut::ResU32 m_CommandBuffer[6]; 106 }; 107 108 // ResDepthOperationData::m_CommandBuffer のフォーマットは次の形式になっています。 109 // 110 // [0] 0x107の[7:0] 111 // [1] 0x107へのヘッダ(BE:1) 112 // [2] 0x126の[31:24] 113 // [3] 0x126へのヘッダ(BE:8) 114 //! @details :private 115 struct ResDepthOperationData 116 { 117 enum Flag 118 { 119 FLAG_TEST_ENABLED = 0x1 << 0, 120 FLAG_MASK_ENABLED = 0x1 << 1 121 }; 122 123 nw::ut::ResU32 m_Flags; 124 125 nw::ut::ResU32 m_CommandBuffer[4]; 126 }; 127 128 // ResStencilOperationData::m_CommandBuffer のフォーマットは次の形式になっています。 129 // 130 // [0] 0x105のデータ 131 // [1] 0x105へのヘッダ(BE:0xd) 132 // [2] 0x106のデータ 133 // [3] 0x106へのヘッダ(BE:0xf) 134 //! @details :private 135 struct ResStencilOperationData 136 { 137 nw::ut::ResU32 m_CommandBuffer[4]; 138 }; 139 140 //! @details :private 141 struct ResFragmentOperationData 142 { 143 ResDepthOperationData m_DepthOperation; 144 ResBlendOperationData m_BlendOperation; 145 ResStencilOperationData m_StencilOperation; 146 }; 147 148 //! @details :private 149 struct ResTextureCoordinatorData 150 { 151 nw::ut::ResS32 m_SourceCoordinate; 152 nw::ut::ResS32 m_MappingMethod; 153 nw::ut::ResS32 m_ReferenceCamera; 154 nw::ut::ResS32 m_MatrixMode; 155 nw::ut::ResVec2 m_Scale; 156 nw::ut::ResF32 m_Rotate; 157 nw::ut::ResVec2 m_Translate; 158 nw::ut::ResBool m_IsDirty; 159 nw::ut::ResBool m_IsEnabled; 160 u8 _padding_0[2]; 161 nw::ut::ResMtx34 m_TextureMatrix; 162 }; 163 164 165 //! @details :private 166 struct ResMaterialData : public ResSceneObjectData 167 { 168 enum Flag 169 { 170 FLAG_FRAGMENTLIGHT_ENABLED = 0x1 << 0, 171 FLAG_VERTEXLIGHT_ENABLED = 0x1 << 1, 172 FLAG_HEMISPHERELIGHT_ENABLED = 0x1 << 2, 173 FLAG_HEMISPHERE_OCCLUSION_ENABLED = 0x1 << 3, 174 FLAG_FOG_ENABLED = 0x1 << 4, 175 FLAG_PARTICLE_MATERIAL_ENABLED = 0x1 << 5, 176 FLAG_HAS_BEEN_SETUP = 0x1 << 6, 177 FLAG_HAS_BEEN_SETUP_SHADER = 0x1 << 7, 178 FLAG_HAS_BEEN_SETUP_TEXTURE = 0x1 << 8, 179 FLAG_HAS_BEEN_SETUP_FRAGMENTSHADER = 0x1 << 9 180 }; 181 182 nw::ut::ResU32 m_Flags; 183 nw::ut::ResS32 m_TextureCoordinateConfig; 184 nw::ut::ResS32 m_TranslucencyKind; 185 ResMaterialColorData m_MaterialColor; 186 ResRasterizationData m_Rasterization; 187 ResFragmentOperationData m_FragmentOperation; 188 nw::ut::ResS32 m_ActiveTextureCoordinatorsCount; 189 ResTextureCoordinatorData m_TextureCoordinators[3]; 190 nw::ut::Offset toTextureMappers[3]; 191 nw::ut::Offset toProceduralTextureMapper; 192 nw::ut::Offset toShader; 193 nw::ut::Offset toFragmentShader; 194 nw::ut::ResS32 m_ShaderProgramDescriptionIndex; 195 nw::ut::ResS32 m_ShaderParametersTableCount; 196 nw::ut::Offset toShaderParametersTable; 197 nw::ut::ResS32 m_LightSetIndex; 198 nw::ut::ResS32 m_FogIndex; 199 nw::ut::ResU32 m_ShadingParameterHash; 200 nw::ut::ResU32 m_ShaderParametersHash; 201 nw::ut::ResU32 m_TextureCoordinatorsHash; 202 nw::ut::ResU32 m_TextureSamplersHash; 203 nw::ut::ResU32 m_TextureMappersHash; 204 nw::ut::ResU32 m_MaterialColorHash; 205 nw::ut::ResU32 m_RasterizationHash; 206 nw::ut::ResU32 m_FragmentLightingHash; 207 nw::ut::ResU32 m_FragmentLightingTableHash; 208 nw::ut::ResU32 m_FragmentLightingTableParametersHash; 209 nw::ut::ResU32 m_TextureCombinersHash; 210 nw::ut::ResU32 m_AlphaTestHash; 211 nw::ut::ResU32 m_FragmentOperationHash; 212 nw::ut::ResU32 m_MaterialId; 213 }; 214 215 216 //-------------------------------------------------------------------------- 217 //! @brief マテリアルを表すバイナリリソースクラスです。 218 //--------------------------------------------------------------------------- 219 class ResMaterialColor : public nw::ut::ResCommon< ResMaterialColorData > 220 { 221 public: NW_RES_CTOR(ResMaterialColor)222 NW_RES_CTOR( ResMaterialColor ) 223 224 //---------------------------------------- 225 //! @name 取得/設定 226 //@{ 227 228 //--------------------------------------------------------------------------- 229 //! @brief アンビエントカラーを取得します。 230 //! 231 //! @return α値に VertexColorScale が格納されたアンビエントカラーです。 232 //--------------------------------------------------------------------------- 233 const nw::ut::FloatColor& GetAmbient() const { return ref().m_AmbientAndVertexColorScale; } 234 235 //--------------------------------------------------------------------------- 236 //! @brief 頂点カラーのスケール値を取得します。 237 //! 238 //! @return 頂点カラーのスケール値を返します。 239 //--------------------------------------------------------------------------- GetVertexColorScale()240 f32 GetVertexColorScale() const { return ref().m_AmbientAndVertexColorScale.a; } 241 242 //--------------------------------------------------------------------------- 243 //! @brief 頂点カラーのスケール値を設定します。 244 //! 245 //! @param[in] scale 頂点カラーの設定値です。 246 //--------------------------------------------------------------------------- SetVertexColorScale(f32 scale)247 void SetVertexColorScale(f32 scale) { ref().m_AmbientAndVertexColorScale.a = scale; } 248 249 //--------------------------------------------------------------------------- 250 //! @brief アンビエントカラーを RGBA8 フォーマットで取得します。 251 //! 252 //! @return アンビエントカラーを RGBA8 フォーマットで返します。 253 //--------------------------------------------------------------------------- GetAmbientU32()254 u32 GetAmbientU32() const { return ref().m_AmbientU32; } 255 256 //--------------------------------------------------------------------------- 257 //! @brief アンビエントカラーを設定します。 258 //! 259 //! @param[in] r 設定するアンビエントカラーの R 成分です。 260 //! @param[in] g 設定するアンビエントカラーの G 成分です。 261 //! @param[in] b 設定するアンビエントカラーの B 成分です。 262 //--------------------------------------------------------------------------- SetAmbient(f32 r,f32 g,f32 b)263 void SetAmbient( f32 r, f32 g, f32 b ) 264 { 265 ref().m_AmbientAndVertexColorScale.SetColor(r, g, b); 266 ref().m_AmbientU32 = ref().m_AmbientAndVertexColorScale.ToPicaU32(); 267 } 268 269 //--------------------------------------------------------------------------- 270 //! @brief アンビエントカラーを設定します。 271 //! 272 //! @param[in] value 設定するアンビエントカラーです。 273 //--------------------------------------------------------------------------- SetAmbient(const nw::ut::FloatColor & value)274 void SetAmbient( const nw::ut::FloatColor& value ) 275 { 276 this->SetAmbient(value.r, value.g, value.b); 277 } 278 279 //--------------------------------------------------------------------------- 280 //! @fn u32 GetEmissionU32() const 281 //! @brief エミッションカラーを RGBA8 の32bitフォーマットで取得します。 282 //--------------------------------------------------------------------------- 283 //--------------------------------------------------------------------------- 284 //! @fn const nw::ut::FloatColor & GetEmission() const 285 //! @brief エミッションカラーを取得します。 286 //--------------------------------------------------------------------------- 287 //--------------------------------------------------------------------------- 288 //! @fn void SetEmission(f32 r, f32 g, f32 b) 289 //! @brief エミッションカラーを設定します。 290 //--------------------------------------------------------------------------- 291 NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Emission ) // GetEmission() 292 293 //--------------------------------------------------------------------------- 294 //! @fn u32 GetDiffuseU32() const 295 //! @brief ディフューズカラーを RGBA8 の32bitフォーマットで取得します。 296 //--------------------------------------------------------------------------- 297 //--------------------------------------------------------------------------- 298 //! @fn const nw::ut::FloatColor & GetDiffuse() const 299 //! @brief ディフューズカラーを取得します。 300 //--------------------------------------------------------------------------- 301 //--------------------------------------------------------------------------- 302 //! @fn void SetDiffuse(f32 r, f32 g, f32 b) 303 //! @brief ディフューズカラーを設定します。 304 //--------------------------------------------------------------------------- 305 NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Diffuse ) // GetDiffuse(), SetDiffuse(r,g,b), SetDiffuse(r,g,b,a), SetDiffuse(FloatColor) 306 307 //--------------------------------------------------------------------------- 308 //! @fn u32 GetSpecular0U32() const 309 //! @brief スペキュラカラー0を RGBA8 の32bitフォーマットで取得します。 310 //--------------------------------------------------------------------------- 311 //--------------------------------------------------------------------------- 312 //! @fn const nw::ut::FloatColor & GetSpecular0() const 313 //! @brief スペキュラカラー0を取得します。 314 //--------------------------------------------------------------------------- 315 //--------------------------------------------------------------------------- 316 //! @fn void SetSpecular0(f32 r, f32 g, f32 b) 317 //! @brief スペキュラカラー0を設定します。 318 //--------------------------------------------------------------------------- 319 NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Specular0 ) // GetSpecular0(), SetSpecular0(r,g,b), SetSpecular0(r,g,b,a), SetSpecular0(FloatColor) 320 321 //--------------------------------------------------------------------------- 322 //! @fn u32 GetSpecular1U32() const 323 //! @brief スペキュラカラー1を RGBA8 の32bitフォーマットで取得します。 324 //--------------------------------------------------------------------------- 325 //--------------------------------------------------------------------------- 326 //! @fn const nw::ut::FloatColor & GetSpecular1() const 327 //! @brief スペキュラカラー1を取得します。 328 //--------------------------------------------------------------------------- 329 //--------------------------------------------------------------------------- 330 //! @fn void SetSpecular1(f32 r, f32 g, f32 b) 331 //! @brief スペキュラカラー1を設定します。 332 //--------------------------------------------------------------------------- 333 NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Specular1 ) // GetSpecular1(), SetSpecular1(r,g,b), SetSpecular1(r,g,b,a), SetSpecular1(FloatColor) 334 335 //--------------------------------------------------------------------------- 336 //! @fn u32 GetConstant0U32() const 337 //! @brief コンスタントカラー0を RGBA8 の32bitフォーマットで取得します。 338 //--------------------------------------------------------------------------- 339 //--------------------------------------------------------------------------- 340 //! @fn const nw::ut::FloatColor & GetConstant0() const 341 //! @brief コンスタントカラー0を取得します。 342 //--------------------------------------------------------------------------- 343 //--------------------------------------------------------------------------- 344 //! @fn void SetConstant0(f32 r, f32 g, f32 b) 345 //! @brief コンスタントカラー0を設定します。 346 //--------------------------------------------------------------------------- 347 NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Constant0 ) // GetConstant0(), SetConstant0(r,g,b), SetConstant0(r,g,b,a), SetConstant0(FloatColor) 348 349 //--------------------------------------------------------------------------- 350 //! @fn u32 GetConstant1U32() const 351 //! @brief コンスタントカラー1を RGBA8 の32bitフォーマットで取得します。 352 //--------------------------------------------------------------------------- 353 //--------------------------------------------------------------------------- 354 //! @fn const nw::ut::FloatColor & GetConstant1() const 355 //! @brief コンスタントカラー1を取得します。 356 //--------------------------------------------------------------------------- 357 //--------------------------------------------------------------------------- 358 //! @fn void SetConstant1(f32 r, f32 g, f32 b) 359 //! @brief コンスタントカラー1を設定します。 360 //--------------------------------------------------------------------------- 361 NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Constant1 ) // GetConstant1(), SetConstant1(r,g,b), SetConstant1(r,g,b,a), SetConstant1(FloatColor) 362 363 //--------------------------------------------------------------------------- 364 //! @fn u32 GetConstant2U32() const 365 //! @brief コンスタントカラー2を RGBA8 の32bitフォーマットで取得します。 366 //--------------------------------------------------------------------------- 367 //--------------------------------------------------------------------------- 368 //! @fn const nw::ut::FloatColor & GetConstant2() const 369 //! @brief コンスタントカラー2を取得します。 370 //--------------------------------------------------------------------------- 371 //--------------------------------------------------------------------------- 372 //! @fn void SetConstant2(f32 r, f32 g, f32 b) 373 //! @brief コンスタントカラー2を設定します。 374 //--------------------------------------------------------------------------- 375 NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Constant2 ) // GetConstant2(), SetConstant2(r,g,b), SetConstant2(r,g,b,a), SetConstant2(FloatColor) 376 377 //--------------------------------------------------------------------------- 378 //! @fn u32 GetConstant3U32() const 379 //! @brief コンスタントカラー3を RGBA8 の32bitフォーマットで取得します。 380 //--------------------------------------------------------------------------- 381 //--------------------------------------------------------------------------- 382 //! @fn const nw::ut::FloatColor & GetConstant3() const 383 //! @brief コンスタントカラー3を取得します。 384 //--------------------------------------------------------------------------- 385 //--------------------------------------------------------------------------- 386 //! @fn void SetConstant3(f32 r, f32 g, f32 b) 387 //! @brief コンスタントカラー3を設定します。 388 //--------------------------------------------------------------------------- 389 NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Constant3 ) // GetConstant3(), SetConstant3(r,g,b), SetConstant3(r,g,b,a), SetConstant3(FloatColor) 390 391 //--------------------------------------------------------------------------- 392 //! @fn u32 GetConstant4U32() const 393 //! @brief コンスタントカラー4を RGBA8 の32bitフォーマットで取得します。 394 //--------------------------------------------------------------------------- 395 //--------------------------------------------------------------------------- 396 //! @fn const nw::ut::FloatColor & GetConstant4() const 397 //! @brief コンスタントカラー4を取得します。 398 //--------------------------------------------------------------------------- 399 //--------------------------------------------------------------------------- 400 //! @fn void SetConstant4(f32 r, f32 g, f32 b) 401 //! @brief コンスタントカラー4を設定します。 402 //--------------------------------------------------------------------------- 403 NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Constant4 ) // GetConstant4(), SetConstant4(r,g,b), SetConstant4(r,g,b,a), SetConstant4(FloatColor) 404 405 //--------------------------------------------------------------------------- 406 //! @fn u32 GetConstant5U32() const 407 //! @brief コンスタントカラー5を RGBA8 の32bitフォーマットで取得します。 408 //--------------------------------------------------------------------------- 409 //--------------------------------------------------------------------------- 410 //! @fn const nw::ut::FloatColor & GetConstant5() const 411 //! @brief コンスタントカラー5を取得します。 412 //--------------------------------------------------------------------------- 413 //--------------------------------------------------------------------------- 414 //! @fn void SetConstant5(f32 r, f32 g, f32 b) 415 //! @brief コンスタントカラー5を設定します。 416 //--------------------------------------------------------------------------- 417 NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Constant5 ) // GetConstant5(), SetConstant5(r,g,b), SetConstant5(r,g,b,a), SetConstant5(FloatColor) 418 419 //@} 420 }; 421 422 //-------------------------------------------------------------------------- 423 //! @brief ポリゴンのラスタライゼーション方法を管理するバイナリリソースクラスです。 424 //--------------------------------------------------------------------------- 425 class ResRasterization : public nw::ut::ResCommon< ResRasterizationData > 426 { 427 public: 428 429 //! カリングモードです。 430 enum CullingMode 431 { 432 CULLINGMODE_FRONT = 0, //!< 表面カリングです。 433 CULLINGMODE_BACK = 1, //!< 裏面カリングです。 434 CULLINGMODE_NONE = 3 //!< 両面表示です。 435 }; 436 437 NW_RES_CTOR( ResRasterization ) 438 439 //--------------------------------------------------------------------------- 440 //! @fn void SetFlags(u32 value) 441 //! @brief フラグの値を設定します。 442 //! 設定されなかったフラグは無効になります。 443 //--------------------------------------------------------------------------- 444 //--------------------------------------------------------------------------- 445 //! @fn void EnableFlags(u32 value) 446 //! @brief 指定された Flag の値を有効にします。 447 //! 設定されなかったフラグは変更されません。 448 //--------------------------------------------------------------------------- 449 //--------------------------------------------------------------------------- 450 //! @fn void DisableFlags(u32 value) 451 //! @brief 指定された Flag の値を無効にします。 452 //! 設定されなかったフラグは変更されません。 453 //--------------------------------------------------------------------------- 454 //--------------------------------------------------------------------------- 455 //! @fn u32 GetFlags() const 456 //! @brief フラグの値を取得します。 457 //--------------------------------------------------------------------------- NW_RES_FIELD_FLAGS_DECL(u32,Flags)458 NW_RES_FIELD_FLAGS_DECL( u32, Flags ) // GetFlags(), SetFlags(), EnableFlags(), DisableFlags() 459 460 //--------------------------------------------------------------------------- 461 //! @fn f32 GetPolygonOffsetUnit() const 462 //! @brief ポリゴンオフセットのユニット要素を取得します。 463 //--------------------------------------------------------------------------- 464 //--------------------------------------------------------------------------- 465 //! @fn void SetPolygonOffsetUnit(f32 value) 466 //! @brief ポリゴンオフセットのユニット要素を設定します。 467 //--------------------------------------------------------------------------- 468 NW_RES_FIELD_PRIMITIVE_DECL( f32, PolygonOffsetUnit ) // GetPolygonOffsetUnit(), SetPolygonOffsetUnit() 469 470 //--------------------------------------------------------------------------- 471 //! @fn u32 * GetCommandBuffer() 472 //! @brief コマンドバッファへのポインタを取得します。 473 //--------------------------------------------------------------------------- 474 NW_RES_FIELD_COMMAND_BUFFER() // GetCommandBuffer() 475 476 //--------------------------------------------------------------------------- 477 //! @brief カリングモードを取得します。 478 //! 479 //! @return カリングモードを返します。 480 //--------------------------------------------------------------------------- 481 CullingMode GetCullingMode() const 482 { 483 return static_cast<CullingMode>(this->ref().m_CullingMode); 484 } 485 486 //--------------------------------------------------------------------------- 487 //! @brief カリングモードを設定します。 488 //! 489 //! @param[in] value 設定するカリングモードです。 490 //--------------------------------------------------------------------------- SetCullingMode(CullingMode value)491 void SetCullingMode(CullingMode value) 492 { 493 enum { CMD_SHIFT = 0, CMD_MASK = 0x3, CMD_CULLING_MODE_NONE = 0, CMD_CULLING_MODE_OTHER = 1, CMD_CULLING_MODE_BACK = 2 }; 494 495 this->ref().m_CullingMode = static_cast<u32>(value); 496 497 static const u32 table[] = 498 { 499 CMD_CULLING_MODE_OTHER, 500 CMD_CULLING_MODE_BACK, 501 CMD_CULLING_MODE_OTHER, 502 CMD_CULLING_MODE_NONE 503 }; 504 505 internal::SetCmdValue( &ref().m_CommandBuffer[0], table[value], CMD_MASK, CMD_SHIFT ); 506 } 507 }; 508 509 //-------------------------------------------------------------------------- 510 //! @brief ブレンダーを表すバイナリリソースクラスです。 511 //--------------------------------------------------------------------------- 512 class ResBlendOperation : public nw::ut::ResCommon< ResBlendOperationData > 513 { 514 public: 515 516 //! @brief ブレンドモードの定義です。 517 enum Mode 518 { 519 MODE_NOT_USE, //!< 使用しません。 520 MODE_BLEND, //!< ブレンド処理です。 521 MODE_SEPARATE_BLEND, //!< セパレートブレンド処理です。 522 MODE_LOGIC //!< 論理演算です。 523 }; 524 525 //! @brief 論理演算の演算方法の定義です。 526 enum LogicOp 527 { 528 LOGICOP_CLEAR = 0, //!< すべてのビット値を 0 にします。 529 LOGICOP_AND = 1, //!< ソースカラーとディスティネーションカラーの論理積をとります。 530 LOGICOP_AND_REVERSE = 2, //!< ソースカラーとディスティネーションカラーの反転ビット値の論理積をとります。 531 LOGICOP_COPY = 3, //!< ソースカラーのビット値をとります。 532 LOGICOP_SET = 4, //!< すべてのビット値を 1 にします。 533 LOGICOP_COPY_INVERTED = 5, //!< ソースカラーの反転ビット値をとります。 534 LOGICOP_NOOP = 6, //!< ディスティネーションカラーのビット値をとります。 535 LOGICOP_INVERT = 7, //!< ディスティネーションカラーの反転ビット値をとります。 536 LOGICOP_NAND = 8, //!< ソースカラーとディスティネーションカラーの論理積の反転ビット値をとります。 537 LOGICOP_OR = 9, //!< ソースカラーとディスティネーションカラーの論理和をとります。 538 LOGICOP_NOR = 10, //!< ソースカラーとディスティネーションカラーの論理和の反転ビット値をとります。 539 LOGICOP_XOR = 11, //!< ソースカラーとディスティネーションカラーの排他的論理和をとります。 540 LOGICOP_EQUIV = 12, //!< ソースカラーとディスティネーションカラーの排他的論理和の反転ビット値をとります。 541 LOGICOP_AND_INVERTED = 13, //!< ソースカラーの反転ビット値と、ディスティネーションカラーの論理積をとります。 542 LOGICOP_OR_REVERSE = 14, //!< ソースカラーとディスティネーションカラーの反転ビット値の論理和をとります。 543 LOGICOP_OR_INVERTED = 15 //!< ソースカラーの反転ビット値と、ディスティネーションカラーの論理和をとります。 544 }; 545 546 //! @brief 入出力の要素の定義です。 547 //! 548 //! MIN(a,b) は a と b の小さい方を表します。 549 enum BlendFactor 550 { 551 BLENDFACTOR_ZERO = 0, //!< 指定の成分に「 0 」を利用します。 552 BLENDFACTOR_ONE = 1, //!< 指定の成分に「 1 」を利用します。 553 BLENDFACTOR_SRC_COLOR = 2, //!< 指定の成分に「ソースカラー」を利用します。 554 BLENDFACTOR_ONE_MINUS_SRC_COLOR = 3, //!< 指定の成分に「1 - ソースカラー」 を利用します。 555 BLENDFACTOR_DST_COLOR = 4, //!< 指定の成分に「デスティネーションカラー」を利用します。 556 BLENDFACTOR_ONE_MINUS_DST_COLOR = 5, //!< 指定の成分に「 1 - デスティネーションカラー」を利用します。 557 BLENDFACTOR_SRC_ALPHA = 6, //!< 指定の成分に「ソースアルファ」を利用します。 558 BLENDFACTOR_ONE_MINUS_SRC_ALPHA = 7, //!< 指定の成分に「 1 - ソースアルファ」 を利用します。 559 BLENDFACTOR_DST_ALPHA = 8, //!< 指定の成分に「デスティネーションアルファ」を利用します。 560 BLENDFACTOR_ONE_MINUS_DST_ALPHA = 9, //!< 指定の成分に「 1 - デスティネーションアルファ」を利用します。 561 BLENDFACTOR_CONSTANT_COLOR = 10, //!< 指定の成分に「コンスタントカラー(ブレンドカラー)」を利用します。 562 BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR = 11, //!< 指定の成分に「 1 - コンスタントカラー」を利用します。 563 BLENDFACTOR_CONSTANT_ALPHA = 12, //!< 指定の成分に「コンスタントアルファ(ブレンドアルファ)」を利用します。 564 BLENDFACTOR_ONE_MINUS_CONSTANT_ALPHA = 13, //!< 指定の成分に「 1 - コンスタントアルファ」を利用します。 565 BLENDFACTOR_SRC_ALPHA_SATURATE = 14 //!< 指定の成分に「 MIN( ソースアルファ , 1 - デスティネーションアルファ ) 」を利用します。 566 }; 567 568 //! @brief ブレンド式の定義です。 569 enum BlendEquation 570 { 571 BLENDEQ_FUNC_ADD = 0, //!< ソースとデスティネーションを加算します。 572 BLENDEQ_FUNC_SUBTRACT = 1, //!< ソースからデスティネーションを減算します。 573 BLENDEQ_FUNC_REVERSE_SUBTRACT = 2, //!< デスティネーションからソースを減算します。 574 BLENDEQ_MIN = 3, //!< ソースとデスティネーションのより小さい方です。 575 BLENDEQ_MAX = 4 //!< ソースとデスティネーションのより大きい方です。 576 }; 577 NW_RES_CTOR(ResBlendOperation)578 NW_RES_CTOR( ResBlendOperation ) 579 580 //--------------------------------------------------------------------------- 581 //! @brief ブレンドモードを取得します。 582 //! 583 //! @return ブレンドモードを返します。 584 //--------------------------------------------------------------------------- 585 Mode GetMode() const 586 { 587 return static_cast<Mode>(ref().m_Mode); 588 } 589 590 //--------------------------------------------------------------------------- 591 //! @brief ブレンドモードを設定します。 592 //! 593 //! @param[in] value 設定するブレンドモードです。 594 //--------------------------------------------------------------------------- SetMode(Mode value)595 void SetMode(Mode value) 596 { 597 enum { CMD_SHIFT = 8, CMD_MASK = 0x1, CMD_BLEND_MODE_LOGIC = 0, CMD_BLEND_MODE_OTHER = 1 }; 598 599 ref().m_Mode = value; 600 601 const u32 table[] = 602 { 603 CMD_BLEND_MODE_OTHER, 604 CMD_BLEND_MODE_OTHER, 605 CMD_BLEND_MODE_OTHER, 606 CMD_BLEND_MODE_LOGIC 607 }; 608 609 internal::SetCmdValue( &ref().m_CommandBuffer[0], table[value], CMD_MASK, CMD_SHIFT ); 610 } 611 612 //--------------------------------------------------------------------------- 613 //! @brief ブレンドカラーを設定します。 614 //! 615 //! @param[in] r 設定するブレンドカラーの R 成分です。 616 //! @param[in] g 設定するブレンドカラーの G 成分です。 617 //! @param[in] b 設定するブレンドカラーの B 成分です。 618 //--------------------------------------------------------------------------- SetBlendColor(f32 r,f32 g,f32 b)619 void SetBlendColor( f32 r, f32 g, f32 b ) 620 { 621 enum { CMD_SHIFT = 0, CMD_MASK = 0xffffffff }; 622 623 ref().m_BlendColor.Set(r, g, b); 624 u32 colorByte = ref().m_BlendColor.ToPicaU32(); 625 internal::SetCmdValue( &ref().m_CommandBuffer[4], colorByte, CMD_MASK, CMD_SHIFT ); 626 } 627 628 //--------------------------------------------------------------------------- 629 //! @brief ブレンドカラーを設定します。 630 //! 631 //! @param[in] r 設定するブレンドカラーの R 成分です。 632 //! @param[in] g 設定するブレンドカラーの G 成分です。 633 //! @param[in] b 設定するブレンドカラーの B 成分です。 634 //! @param[in] a 設定するブレンドカラーのアルファ成分です。 635 //--------------------------------------------------------------------------- SetBlendColor(f32 r,f32 g,f32 b,f32 a)636 void SetBlendColor( f32 r, f32 g, f32 b, f32 a ) 637 { 638 enum { CMD_SHIFT = 0, CMD_MASK = 0xffffffff }; 639 640 ref().m_BlendColor.Set(r, g, b, a); 641 u32 colorByte = ref().m_BlendColor.ToPicaU32(); 642 internal::SetCmdValue( &ref().m_CommandBuffer[4], colorByte, CMD_MASK, CMD_SHIFT ); 643 } 644 645 //--------------------------------------------------------------------------- 646 //! @brief ブレンドカラーを取得します。 647 //! 648 //! @return ブレンドカラーを返します。 649 //--------------------------------------------------------------------------- GetBlendColor()650 const nw::ut::FloatColor& GetBlendColor() const 651 { 652 return ref().m_BlendColor; 653 } 654 655 //--------------------------------------------------------------------------- 656 //! @brief ブレンドカラーを設定します。 657 //! 658 //! @param[in] value 設定するブレンドカラーです。 659 //--------------------------------------------------------------------------- SetBlendColor(const nw::ut::FloatColor & value)660 void SetBlendColor(const nw::ut::FloatColor& value) 661 { 662 enum { CMD_SHIFT = 0, CMD_MASK = 0xffffffff }; 663 664 ref().m_BlendColor = value; 665 u32 colorByte = ref().m_BlendColor.ToPicaU32(); 666 internal::SetCmdValue( &ref().m_CommandBuffer[4], colorByte, CMD_MASK, CMD_SHIFT ); 667 } 668 669 //--------------------------------------------------------------------------- 670 //! @brief 論理演算の演算方法を取得します。 671 //! 672 //! @return 演算方法を返します。 673 //--------------------------------------------------------------------------- GetLogicOperation()674 LogicOp GetLogicOperation() const 675 { 676 enum { CMD_SHIFT = 0, CMD_MASK = 0xf }; 677 678 return static_cast<LogicOp>(internal::GetCmdValue( ref().m_CommandBuffer[3], CMD_MASK, CMD_SHIFT )); 679 } 680 681 //--------------------------------------------------------------------------- 682 //! @brief 論理演算の演算方法を設定します。 683 //! 684 //! @param[in] value 設定する演算方法です。 685 //--------------------------------------------------------------------------- SetLogicOperation(LogicOp value)686 void SetLogicOperation(LogicOp value) 687 { 688 enum { CMD_SHIFT = 0, CMD_MASK = 0xf }; 689 690 internal::SetCmdValue( &ref().m_CommandBuffer[3], value, CMD_MASK, CMD_SHIFT ); 691 } 692 693 //------------------------------------------------------------ 694 //! @brief カラーブレンド式の入力要素を取得します。 695 //! 696 //! @return 入力要素を返します。 697 //--------------------------------------------------------------------------- GetBlendFuncSrcRgb()698 BlendFactor GetBlendFuncSrcRgb() const 699 { 700 enum { CMD_SHIFT = 16, CMD_MASK = 0xf }; 701 702 return static_cast<BlendFactor>(internal::GetCmdValue( ref().m_CommandBuffer[2], CMD_MASK, CMD_SHIFT )); 703 } 704 705 //--------------------------------------------------------------------------- 706 //! @brief カラーブレンド式の入力要素を設定します。 707 //! 708 //! @param[in] value 設定する入力要素です。 709 //--------------------------------------------------------------------------- SetBlendFuncSrcRgb(BlendFactor value)710 void SetBlendFuncSrcRgb(BlendFactor value) 711 { 712 enum { CMD_SHIFT = 16, CMD_MASK = 0xf }; 713 714 internal::SetCmdValue( &ref().m_CommandBuffer[2], value, CMD_MASK, CMD_SHIFT ); 715 } 716 717 //------------------------------------------------------------ 718 //! @brief アルファブレンド式の入力要素を取得します。 719 //! 720 //! @return 入力要素を返します。 721 //--------------------------------------------------------------------------- GetBlendFuncSrcAlpha()722 BlendFactor GetBlendFuncSrcAlpha() const 723 { 724 enum { CMD_SHIFT = 24, CMD_MASK = 0xf }; 725 726 return static_cast<BlendFactor>(internal::GetCmdValue( ref().m_CommandBuffer[2], CMD_MASK, CMD_SHIFT )); 727 } 728 729 //--------------------------------------------------------------------------- 730 //! @brief アルファブレンド式の入力要素を設定します。 731 //! 732 //! @param[in] value 設定する入力要素です。 733 //--------------------------------------------------------------------------- SetBlendFuncSrcAlpha(BlendFactor value)734 void SetBlendFuncSrcAlpha(BlendFactor value) 735 { 736 enum { CMD_SHIFT = 24, CMD_MASK = 0xf }; 737 738 internal::SetCmdValue( &ref().m_CommandBuffer[2], value, CMD_MASK, CMD_SHIFT ); 739 } 740 741 //------------------------------------------------------------ 742 //! @brief カラーブレンド式の出力要素を取得します。 743 //! 744 //! @return 出力要素を返します。 745 //--------------------------------------------------------------------------- GetBlendFuncDstRgb()746 BlendFactor GetBlendFuncDstRgb() const 747 { 748 enum { CMD_SHIFT = 20, CMD_MASK = 0xf }; 749 750 return static_cast<BlendFactor>(internal::GetCmdValue( ref().m_CommandBuffer[2], CMD_MASK, CMD_SHIFT )); 751 } 752 753 //--------------------------------------------------------------------------- 754 //! @brief カラーブレンド式の出力要素を設定します。 755 //! 756 //! @param[in] value 設定する出力要素です。 757 //--------------------------------------------------------------------------- SetBlendFuncDstRgb(BlendFactor value)758 void SetBlendFuncDstRgb(BlendFactor value) 759 { 760 enum { CMD_SHIFT = 20, CMD_MASK = 0xf }; 761 762 internal::SetCmdValue( &ref().m_CommandBuffer[2], value, CMD_MASK, CMD_SHIFT ); 763 } 764 765 //--------------------------------------------------------------------------- 766 //! @brief アルファブレンド式の出力要素を取得します。 767 //! 768 //! @return 出力要素を返します。 769 //--------------------------------------------------------------------------- GetBlendFuncDstAlpha()770 BlendFactor GetBlendFuncDstAlpha() const 771 { 772 enum { CMD_SHIFT = 28, CMD_MASK = 0xf }; 773 774 return static_cast<BlendFactor>(internal::GetCmdValue( ref().m_CommandBuffer[2], CMD_MASK, CMD_SHIFT )); 775 } 776 777 //--------------------------------------------------------------------------- 778 //! @brief アルファブレンド式の出力要素を設定します。 779 //! 780 //! @param[in] value 設定する出力要素です。 781 //--------------------------------------------------------------------------- SetBlendFuncDstAlpha(BlendFactor value)782 void SetBlendFuncDstAlpha(BlendFactor value) 783 { 784 enum { CMD_SHIFT = 28, CMD_MASK = 0xf }; 785 786 internal::SetCmdValue( &ref().m_CommandBuffer[2], value, CMD_MASK, CMD_SHIFT ); 787 } 788 789 //------------------------------------------------------------ 790 //! @brief カラーブレンド式を取得します。 791 //! 792 //! @return カラーブレンド式を返します。 793 //--------------------------------------------------------------------------- GetBlendEquationRgb()794 BlendEquation GetBlendEquationRgb() const 795 { 796 enum { CMD_SHIFT = 0, CMD_MASK = 0x7 }; 797 798 return static_cast<BlendEquation>(internal::GetCmdValue( ref().m_CommandBuffer[2], CMD_MASK, CMD_SHIFT )); 799 } 800 801 //--------------------------------------------------------------------------- 802 //! @brief カラーブレンド式を設定します、。 803 //! 804 //! @param[in] value 設定するカラーブレンド式です。 805 //--------------------------------------------------------------------------- SetBlendEquationRgb(BlendEquation value)806 void SetBlendEquationRgb(BlendEquation value) 807 { 808 enum { CMD_SHIFT = 0, CMD_MASK = 0x7 }; 809 810 internal::SetCmdValue( &ref().m_CommandBuffer[2], value, CMD_MASK, CMD_SHIFT ); 811 } 812 813 //--------------------------------------------------------------------------- 814 //! @brief アルファブレンド式を取得します。 815 //! 816 //! @return アルファブレンド式を返します。 817 //--------------------------------------------------------------------------- GetBlendEquationAlpha()818 BlendEquation GetBlendEquationAlpha() const 819 { 820 enum { CMD_SHIFT = 8, CMD_MASK = 0x7 }; 821 822 return static_cast<BlendEquation>(internal::GetCmdValue( ref().m_CommandBuffer[2], CMD_MASK, CMD_SHIFT )); 823 } 824 825 //--------------------------------------------------------------------------- 826 //! @brief アルファブレンド式を設定します。 827 //! 828 //! @param[in] value 設定するアルファブレンド式です。 829 //--------------------------------------------------------------------------- SetBlendEquationAlpha(BlendEquation value)830 void SetBlendEquationAlpha(BlendEquation value) 831 { 832 enum { CMD_SHIFT = 8, CMD_MASK = 0x7 }; 833 834 internal::SetCmdValue( &ref().m_CommandBuffer[2], value, CMD_MASK, CMD_SHIFT ); 835 } 836 837 //--------------------------------------------------------------------------- 838 //! @fn u32 * GetCommandBuffer() 839 //! @brief コマンドバッファへのポインタを取得します。 840 //--------------------------------------------------------------------------- 841 NW_RES_FIELD_COMMAND_BUFFER(); 842 }; 843 844 //-------------------------------------------------------------------------- 845 //! @brief デプステストを表すバイナリリソースクラスです。 846 //--------------------------------------------------------------------------- 847 class ResDepthOperation : public nw::ut::ResCommon< ResDepthOperationData > 848 { 849 public: 850 851 //! @brief デプステスト方法です。 852 enum TestFunc 853 { 854 TESTFUNC_NEVER = 0, //!< すべて不通過です。 855 TESTFUNC_ALWAYS = 1, //!< すべて通過です。 856 TESTFUNC_EQUAL = 2, //!< デプスバッファの値と等しければ通過します。 857 TESTFUNC_NOTEQUAL = 3, //!< デプスバッファの値と等しくなければ通過します。 858 TESTFUNC_LESS = 4, //!< デプスバッファの値より小さければ通過します。 859 TESTFUNC_LEQUAL = 5, //!< デプスバッファの値以下であれば通過します。 860 TESTFUNC_GREATER = 6, //!< デプスバッファの値より大きければ通過します。 861 TESTFUNC_GEQUAL = 7 //!< デプスバッファの値以上であれば通過します。 862 }; 863 NW_RES_CTOR(ResDepthOperation)864 NW_RES_CTOR( ResDepthOperation ) 865 866 //--------------------------------------------------------------------------- 867 //! @brief フラグ値を取得します。 868 //! 869 //! @return フラグの値です。 870 //--------------------------------------------------------------------------- 871 u32 GetFlags() const 872 { 873 return static_cast<u32>(ref().m_Flags); 874 } 875 876 //--------------------------------------------------------------------------- 877 //! @brief フラグ値を設定します。 878 //! 879 //! @return 設定するフラグの値です。 880 //--------------------------------------------------------------------------- SetFlags(u32 value)881 void SetFlags(u32 value) 882 { 883 ref().m_Flags = value; 884 885 enum { CMD_SHIFT = 0, CMD_MASK = 0x1 }; 886 887 // ここでは DepthTestEnabled のみ設定します。 888 // DepthMask に関しては実行時にフラグの値から設定します。 889 internal::SetCmdValue( &ref().m_CommandBuffer[0], value, CMD_MASK, CMD_SHIFT ); 890 } 891 892 //--------------------------------------------------------------------------- 893 //! @brief テスト方法を取得します。 894 //! 895 //! @return テスト方法を返します。 896 //--------------------------------------------------------------------------- GetTestFunc()897 TestFunc GetTestFunc() const 898 { 899 enum { CMD_SHIFT = 4, CMD_MASK = 0x7 }; 900 901 return static_cast<TestFunc>(internal::GetCmdValue( ref().m_CommandBuffer[0], CMD_MASK, CMD_SHIFT )); 902 } 903 904 //--------------------------------------------------------------------------- 905 //! @brief テスト方法を設定します。 906 //! 907 //! @param[in] value 設定するテスト方法です。 908 //--------------------------------------------------------------------------- SetTestFunc(TestFunc value)909 void SetTestFunc(TestFunc value) 910 { 911 enum { CMD_SHIFT = 4, CMD_MASK = 0x7 }; 912 enum { CMD_SHIFT126 = 24, CMD_MASK126 = 0x3, CMD_NEVER = 0, CMD_ALWAYS = 1, CMD_GEATERORGEQUAL = 2, CMD_OTHERS = 3 }; 913 914 internal::SetCmdValue( &ref().m_CommandBuffer[0], value, CMD_MASK, CMD_SHIFT ); 915 916 static const uint table[] = 917 { 918 CMD_NEVER, 919 CMD_ALWAYS, 920 CMD_OTHERS, 921 CMD_OTHERS, 922 CMD_OTHERS, 923 CMD_OTHERS, 924 CMD_GEATERORGEQUAL, 925 CMD_GEATERORGEQUAL 926 }; 927 928 internal::SetCmdValue( &ref().m_CommandBuffer[2], table[value], CMD_MASK126, CMD_SHIFT126 ); 929 } 930 931 //--------------------------------------------------------------------------- 932 //! @fn u32 * GetCommandBuffer() 933 //! @brief コマンドバッファへのポインタを取得します。 934 //--------------------------------------------------------------------------- 935 NW_RES_FIELD_COMMAND_BUFFER() // GetCommandBuffer() 936 }; 937 938 //-------------------------------------------------------------------------- 939 //! @brief ステンシルテストを表すバイナリリソースクラスです。 940 //--------------------------------------------------------------------------- 941 class ResStencilOperation : public nw::ut::ResCommon< ResStencilOperationData > 942 { 943 public: 944 945 //! @brief ステンシルテスト関数です。 946 enum TestFunc 947 { 948 TESTFUNC_NEVER, //!< すべて不通過です。 949 TESTFUNC_ALWAYS, //!< すべて通過です。 950 TESTFUNC_EQUAL, //!< 参照値と等しければ通過します。 951 TESTFUNC_NOTEQUAL, //!< 参照値と等しくなければ通過します。 952 TESTFUNC_LESS, //!< 参照値より小さければ通過します。 953 TESTFUNC_LEQUAL, //!< 参照値以下であれば通過します。 954 TESTFUNC_GREATER, //!< 参照値より大きければ通過します。 955 TESTFUNC_GEQUAL //!< 参照値以上であれば通過します。 956 }; 957 958 //! @brief テスト後の処理です。 959 enum StencilOp 960 { 961 STENCILOP_KEEP, //!< 現在の値を保持します。 962 STENCILOP_ZERO, //!< 0 に置換します。 963 STENCILOP_REPLACE, //!< 参照値に置換します。 964 STENCILOP_INCREASE, //!< 増加させます。極値処理はクランプです。 965 STENCILOP_DECREASE, //!< 減少させます。極値処理はクランプです。 966 STENCILOP_INVERT, //!< ビット単位で反転させます。 967 STENCILOP_INCREASE_WRAP, //!< 増加させます。極値処理は回り込みです。 968 STENCILOP_DECREASE_WRAP //!< 減少させます。極値処理は回り込みです。 969 }; 970 971 NW_RES_CTOR( ResStencilOperation ) 972 973 //--------------------------------------------------------------------------- 974 //! @fn u32 * GetCommandBuffer() 975 //! @brief コマンドバッファへのポインタを取得します。 976 //--------------------------------------------------------------------------- 977 NW_RES_FIELD_COMMAND_BUFFER(); 978 979 //! @brief ステンシルテストが有効であるかどうかを取得します。 IsTestEnabled()980 bool IsTestEnabled() const 981 { 982 enum { CMD_SHIFT = 0, CMD_MASK = 0x1 }; 983 984 return (internal::GetCmdValue( ref().m_CommandBuffer[0], CMD_MASK, CMD_SHIFT )) ? true : false; 985 } 986 987 //! @brief ステンシルテストが有効であるかどうかを設定します。 SetTestEnabled(bool value)988 void SetTestEnabled(bool value) 989 { 990 enum { CMD_SHIFT = 0, CMD_MASK = 0x1 }; 991 992 internal::SetCmdValue( &ref().m_CommandBuffer[0], value, CMD_MASK, CMD_SHIFT ); 993 } 994 995 //! @brief テスト関数を取得します。 GetTestFunction()996 TestFunc GetTestFunction() const 997 { 998 enum { CMD_SHIFT = 4, CMD_MASK = 0x7 }; 999 1000 return static_cast<TestFunc>(internal::GetCmdValue( ref().m_CommandBuffer[0], CMD_MASK, CMD_SHIFT )); 1001 } 1002 1003 //! @brief テスト関数を設定します。 SetTestFunction(TestFunc value)1004 void SetTestFunction(TestFunc value) 1005 { 1006 enum { CMD_SHIFT = 4, CMD_MASK = 0x7 }; 1007 1008 internal::SetCmdValue( &ref().m_CommandBuffer[0], value, CMD_MASK, CMD_SHIFT ); 1009 } 1010 1011 //! @brief 参照値を取得します。 GetTestReference()1012 s32 GetTestReference() const 1013 { 1014 enum { CMD_SHIFT = 16, CMD_MASK = 0xff }; 1015 1016 return static_cast<s32>(internal::GetCmdValue( ref().m_CommandBuffer[0], CMD_MASK, CMD_SHIFT )); 1017 } 1018 1019 //! @brief 参照値を設定します。 SetTestReference(s32 value)1020 void SetTestReference(s32 value) 1021 { 1022 enum { CMD_SHIFT = 16, CMD_MASK = 0xff }; 1023 1024 internal::SetCmdValue( &ref().m_CommandBuffer[0], value, CMD_MASK, CMD_SHIFT ); 1025 } 1026 1027 //! @brief テストマスクを取得します。 GetTestMask()1028 u32 GetTestMask() const 1029 { 1030 enum { CMD_SHIFT = 24, CMD_MASK = 0xff }; 1031 1032 return static_cast<u32>(internal::GetCmdValue( ref().m_CommandBuffer[0], CMD_MASK, CMD_SHIFT )); 1033 } 1034 1035 //! @brief テストマスクを設定します。 SetTestMask(u32 value)1036 void SetTestMask(u32 value) 1037 { 1038 enum { CMD_SHIFT = 24, CMD_MASK = 0xff }; 1039 1040 internal::SetCmdValue( &ref().m_CommandBuffer[0], value, CMD_MASK, CMD_SHIFT ); 1041 } 1042 1043 //! @brief ステンシルテストを通過できなかったフラグメントへの処理を取得します。 GetFailOperation()1044 StencilOp GetFailOperation() const 1045 { 1046 enum { CMD_SHIFT = 0, CMD_MASK = 0x7 }; 1047 1048 return static_cast<StencilOp>(internal::GetCmdValue( ref().m_CommandBuffer[2], CMD_MASK, CMD_SHIFT )); 1049 } 1050 1051 //! @brief ステンシルテストを通過できなかったフラグメントへの処理を設定します。 SetFailOperation(StencilOp value)1052 void SetFailOperation(StencilOp value) 1053 { 1054 enum { CMD_SHIFT = 0, CMD_MASK = 0x7 }; 1055 1056 internal::SetCmdValue( &ref().m_CommandBuffer[2], value, CMD_MASK, CMD_SHIFT ); 1057 } 1058 1059 //! @brief ステンシルテストを通過し、デプステストを通過できなかったフラグメントへの処理を取得します。 GetZFailOperation()1060 StencilOp GetZFailOperation() const 1061 { 1062 enum { CMD_SHIFT = 4, CMD_MASK = 0x7 }; 1063 1064 return static_cast<StencilOp>(internal::GetCmdValue( ref().m_CommandBuffer[2], CMD_MASK, CMD_SHIFT )); 1065 } 1066 1067 //! @brief ステンシルテストを通過し、デプステストを通過できなかったフラグメントへの処理を設定します。 SetZFailOperation(StencilOp value)1068 void SetZFailOperation(StencilOp value) 1069 { 1070 enum { CMD_SHIFT = 4, CMD_MASK = 0x7 }; 1071 1072 internal::SetCmdValue( &ref().m_CommandBuffer[2], value, CMD_MASK, CMD_SHIFT ); 1073 } 1074 1075 //! @brief ステンシルテストを通過し、デプステストを通過または非実施のフラグメントへの処理を取得します。 GetPassOperation()1076 StencilOp GetPassOperation() const 1077 { 1078 enum { CMD_SHIFT = 8, CMD_MASK = 0x7 }; 1079 1080 return static_cast<StencilOp>(internal::GetCmdValue( ref().m_CommandBuffer[2], CMD_MASK, CMD_SHIFT )); 1081 } 1082 1083 //! @brief ステンシルテストを通過し、デプステストを通過または非実施のフラグメントへの処理を設定します。 SetPassOperation(StencilOp value)1084 void SetPassOperation(StencilOp value) 1085 { 1086 enum { CMD_SHIFT = 8, CMD_MASK = 0x7 }; 1087 1088 internal::SetCmdValue( &ref().m_CommandBuffer[2], value, CMD_MASK, CMD_SHIFT ); 1089 } 1090 }; 1091 1092 //-------------------------------------------------------------------------- 1093 //! @brief フラグメントオペレーションを表すバイナリリソースクラスです。 1094 //--------------------------------------------------------------------------- 1095 class ResFragmentOperation : public nw::ut::ResCommon< ResFragmentOperationData > 1096 { 1097 public: 1098 NW_RES_CTOR( ResFragmentOperation ) 1099 1100 //! @brief フラグメントオペレーションモードです。 1101 enum FragmentOperationMode 1102 { 1103 FRAGMENT_OPERATION_MODE_GL = 0, 1104 FRAGMENT_OPERATION_MODE_GAS = 1, 1105 FRAGMENT_OPERATION_MODE_SHADOW = 3 1106 }; 1107 1108 //! @brief フラグメントオペレーションモードを設定します。 SetFragmentOperationMode(FragmentOperationMode value)1109 void SetFragmentOperationMode(FragmentOperationMode value) 1110 { 1111 enum { CMD_SHIFT = 0, CMD_MASK = 0x3 }; 1112 1113 ResBlendOperation blendOperation = GetBlendOperation(); 1114 NW_ASSERT(blendOperation.IsValid()); 1115 1116 internal::SetCmdValue( &blendOperation.ref().m_CommandBuffer[0], value, CMD_MASK, CMD_SHIFT ); 1117 } 1118 1119 //! @brief フラグメントオペレーションモードを取得します。 GetFragmentOperationMode()1120 FragmentOperationMode GetFragmentOperationMode() const 1121 { 1122 enum { CMD_SHIFT = 0, CMD_MASK = 0x3 }; 1123 1124 ResBlendOperation blendOperation = GetBlendOperation(); 1125 NW_ASSERT(blendOperation.IsValid()); 1126 1127 return static_cast<FragmentOperationMode>(internal::GetCmdValue( blendOperation.ref().m_CommandBuffer[0], CMD_MASK, CMD_SHIFT )); 1128 } 1129 1130 //--------------------------------------------------------------------------- 1131 //! @fn ResDepthOperationData & GetDepthOperationData() 1132 //! @brief デプスオペレーションのデータを取得します。 1133 //--------------------------------------------------------------------------- 1134 //--------------------------------------------------------------------------- 1135 //! @fn ResDepthOperation GetDepthOperation() 1136 //! @brief デプスオペレーションのデータを取得します。 1137 //--------------------------------------------------------------------------- 1138 NW_RES_FIELD_RESSTRUCT_DECL( ResDepthOperation, DepthOperation ) // GetDepthOperation(), GetDepthOperationData() 1139 1140 //--------------------------------------------------------------------------- 1141 //! @fn ResBlendOperationData & GetBlendOperationData() 1142 //! @brief ブレンドオペレーションのデータを取得します。 1143 //--------------------------------------------------------------------------- 1144 //--------------------------------------------------------------------------- 1145 //! @fn ResBlendOperation GetBlendOperation() 1146 //! @brief ブレンドオペレーションのデータを取得します。 1147 //--------------------------------------------------------------------------- 1148 NW_RES_FIELD_RESSTRUCT_DECL( ResBlendOperation, BlendOperation ) // GetBlendOperation(), GetBlendOperationData() 1149 1150 //--------------------------------------------------------------------------- 1151 //! @fn ResStencilOperationData & GetStencilOperationData() 1152 //! @brief ステンシルオペレーションのデータを取得します。 1153 //--------------------------------------------------------------------------- 1154 //--------------------------------------------------------------------------- 1155 //! @fn ResStencilOperation GetStencilOperation() 1156 //! @brief ステンシルオペレーションのデータを取得します。 1157 //--------------------------------------------------------------------------- 1158 NW_RES_FIELD_RESSTRUCT_DECL( ResStencilOperation, StencilOperation ) // GetStencilOperation(), GetStencilOperationData() 1159 }; 1160 1161 //-------------------------------------------------------------------------- 1162 //! @brief テクスチャ座標の設定や変換情報を表すバイナリリソースクラスです。 1163 //--------------------------------------------------------------------------- 1164 class ResTextureCoordinator : public nw::ut::ResCommon< ResTextureCoordinatorData > 1165 { 1166 public: 1167 1168 //! @brief テクスチャマッピングの方法です。 1169 enum MappingMethod 1170 { 1171 MAPPINGMETHOD_UV_COORDINATE, //!< テクスチャ座標です。 1172 MAPPINGMETHOD_CAMERA_CUBE_ENV, //!< カメラキューブ座標です。 1173 MAPPINGMETHOD_CAMERA_SPHERE_ENV, //!< カメラスフィア座標です。 1174 MAPPINGMETHOD_PROJECTION, //!< 投影します。 1175 MAPPINGMETHOD_SHADOW, //!< シャドウ用の投影です。 1176 MAPPINGMETHOD_SHADOW_CUBE //!< シャドウキューブ用の投影です。 1177 }; 1178 1179 //! @brief テクスチャ座標の計算方法です。 1180 enum MappingMatrixMode 1181 { 1182 MAPPINGMATRIXMODE_MAYA, //!< Maya 方式です。 1183 MAPPINGMATRIXMODE_SOFTIMAGE, //!< Softimage 方式です。 1184 MAPPINGMATRIXMODE_3DSMAX //!< 3ds max 方式です。 1185 }; 1186 NW_RES_CTOR(ResTextureCoordinator)1187 NW_RES_CTOR( ResTextureCoordinator ) 1188 1189 //! @brief テクスチャのスケールを取得します。 1190 const nw::math::VEC2& GetScale() const 1191 { 1192 return this->ref().m_Scale; 1193 } 1194 1195 //! @brief テクスチャのスケールを設定します。 1196 //! TextureMatrix を再計算する Dirty フラグを立てます。 SetScale(const nw::math::VEC2 & scale)1197 void SetScale(const nw::math::VEC2& scale) 1198 { 1199 if (this->ref().m_Scale != scale) 1200 { 1201 this->ref().m_Scale.Set(scale.x, scale.y); 1202 this->SetDirty(true); 1203 } 1204 } 1205 1206 //! @brief テクスチャの回転を取得します。 GetRotate()1207 f32 GetRotate() 1208 { 1209 return this->ref().m_Rotate; 1210 } 1211 1212 //! @brief テクスチャの回転を設定します。 1213 //! TextureMatrix を再計算する Dirty フラグを立てます。 SetRotate(f32 rotate)1214 void SetRotate(f32 rotate) 1215 { 1216 if (this->ref().m_Rotate != rotate) 1217 { 1218 this->ref().m_Rotate = rotate; 1219 this->SetDirty(true); 1220 } 1221 } 1222 1223 //! @brief テクスチャの平行移動を取得します。 GetTranslate()1224 const nw::math::VEC2& GetTranslate() const 1225 { 1226 return this->ref().m_Translate; 1227 } 1228 1229 //! @brief テクスチャの平行移動を設定します。 1230 //! TextureMatrix を再計算する Dirty フラグを立てます。 SetTranslate(const nw::math::VEC2 & translate)1231 void SetTranslate(const nw::math::VEC2& translate) 1232 { 1233 if (this->ref().m_Translate != translate) 1234 { 1235 this->ref().m_Translate.Set(translate.x, translate.y); 1236 this->SetDirty(true); 1237 } 1238 } 1239 1240 //--------------------------------------------------------------------------- 1241 //! @fn s32 GetSourceCoordinate() const 1242 //! @brief ソースとなるテクスチャ座標の番号を取得します。 1243 //--------------------------------------------------------------------------- 1244 //--------------------------------------------------------------------------- 1245 //! @fn void SetSourceCoordinate(s32 value) 1246 //! @brief ソースとなるテクスチャ座標の番号を設定します。 1247 //--------------------------------------------------------------------------- 1248 NW_RES_FIELD_PRIMITIVE_DECL( s32, SourceCoordinate ) // GetSourceCoordinate(), SetSourceCoordinate() 1249 1250 //--------------------------------------------------------------------------- 1251 //! @fn MappingMethod GetMappingMethod() const 1252 //! @brief テクスチャマッピングの方法を取得します。 1253 //--------------------------------------------------------------------------- 1254 //--------------------------------------------------------------------------- 1255 //! @fn void SetMappingMethod(MappingMethod value) 1256 //! @brief テクスチャマッピングの方法を設定します。 1257 //! テクスチャマッピングの方法を変更した場合は ResTextureSampler::SetSamplerType() を用いてサンプラータイプを変更してください。 1258 //--------------------------------------------------------------------------- 1259 NW_RES_FIELD_PRIMITIVE_DECL( MappingMethod, MappingMethod ) // GetMappingMethod(), SetMappingMethod() 1260 1261 //--------------------------------------------------------------------------- 1262 //! @fn s32 GetReferenceCamera() const 1263 //! @brief 参照するカメラの番号を取得します。 1264 //--------------------------------------------------------------------------- 1265 //--------------------------------------------------------------------------- 1266 //! @fn void SetReferenceCamera(s32 value) 1267 //! @brief 参照するカメラの番号を設定します。 1268 //--------------------------------------------------------------------------- 1269 NW_RES_FIELD_PRIMITIVE_DECL( s32, ReferenceCamera ) // GetReferenceCamera(), SetReferenceCamera() 1270 1271 //--------------------------------------------------------------------------- 1272 //! @fn MappingMatrixMode GetMatrixMode() const 1273 //! @brief テクスチャ座標計算の方法を取得します。 1274 //--------------------------------------------------------------------------- 1275 //--------------------------------------------------------------------------- 1276 //! @fn void SetMatrixMode(MappingMatrixMode value) 1277 //! @brief テクスチャ座標計算の方法を設定します。 1278 //--------------------------------------------------------------------------- 1279 NW_RES_FIELD_PRIMITIVE_DECL( MappingMatrixMode, MatrixMode ) // GetMatrixMode(), SetMatrixMode() 1280 1281 //--------------------------------------------------------------------------- 1282 //! @fn bool IsDirty() const 1283 //! @brief ダーティフラグを取得します。 1284 //--------------------------------------------------------------------------- 1285 //--------------------------------------------------------------------------- 1286 //! @fn void SetDirty(bool value) 1287 //! @brief ダーティフラグを設定します。 1288 //--------------------------------------------------------------------------- 1289 NW_RES_FIELD_BOOL_PRIMITIVE_DECL( Dirty ) // IsDirty(), SetDirty() 1290 1291 //--------------------------------------------------------------------------- 1292 //! @fn bool IsEnabled() const 1293 //! @brief 有効・無効フラグを取得します。 1294 //--------------------------------------------------------------------------- 1295 //--------------------------------------------------------------------------- 1296 //! @fn void SetEnabled(bool value) 1297 //! @brief 有効・無効フラグを設定します。 1298 //--------------------------------------------------------------------------- 1299 NW_RES_FIELD_BOOL_PRIMITIVE_DECL( Enabled ) // IsEnabled(), SetEnabled() 1300 1301 //--------------------------------------------------------------------------- 1302 //! @fn nw::math::MTX34 & GetTextureMatrix() 1303 //! @brief テクスチャ行列を取得します。 1304 //--------------------------------------------------------------------------- 1305 //--------------------------------------------------------------------------- 1306 //! @fn void SetTextureMatrix(const nw::math::MTX34 & value) 1307 //! @brief テクスチャ行列を設定します。 1308 //--------------------------------------------------------------------------- 1309 NW_RES_FIELD_STRUCT_DECL( nw::math::MTX34, TextureMatrix ) // GetTextureMatrix() 1310 }; 1311 //-------------------------------------------------------------------------- 1312 //! @brief マテリアルを表すバイナリリソースクラスです。 1313 //--------------------------------------------------------------------------- 1314 class ResMaterial : public ResSceneObject 1315 { 1316 public: 1317 enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResMaterial) }; 1318 enum { SIGNATURE = NW_RES_SIGNATURE32('MTOB') }; 1319 enum { BINARY_REVISION = REVISION_RES_MATERIAL }; 1320 1321 //! @brief テクスチャコーディネータの設定です。 1322 //! 1323 //! どのテクスチャコーディネータを割り当てるかを設定します。 1324 //! テクスチャ 0 、テクスチャ 1 、テクスチャ 2 、プロシージャルテクスチャの順で表します。 1325 enum TextureCoordinateConfig 1326 { 1327 CONFIG_0120, //!< 0 1 2 0 です。 1328 CONFIG_0110, //!< 0 1 1 0 です。 1329 CONFIG_0111, //!< 0 1 1 1 です。 1330 CONFIG_0112, //!< 0 1 1 2 です。 1331 CONFIG_0121, //!< 0 1 2 1 です。 1332 CONFIG_0122, //!< 0 1 2 2 です。 1333 CONFIG_NUM //!< 使用しません。 1334 }; 1335 1336 //! @brief 描画レイヤーです。 1337 enum TranslucencyKind 1338 { 1339 TRANSLUCENCY_KIND_LAYER0, //!< レイヤー 0 ( 不透明メッシュとして描画 ) です。 1340 TRANSLUCENCY_KIND_LAYER1, //!< レイヤー 2 ( 半透明メッシュとして描画 ) です。 1341 TRANSLUCENCY_KIND_LAYER2, //!< レイヤー 3 ( 減算合成メッシュとして描画 ) です。 1342 TRANSLUCENCY_KIND_LAYER3, //!< レイヤー 4 ( 加算合成メッシュとして描画 ) です。 1343 TRANSLUCENCY_KIND_OPAQUE = TRANSLUCENCY_KIND_LAYER0, //!< TRANSLUCENCY_KIND_LAYER0 と同じです。 1344 TRANSLUCENCY_KIND_TRANSLUCENT = TRANSLUCENCY_KIND_LAYER1, //!< TRANSLUCENCY_KIND_LAYER1 と同じです。 1345 TRANSLUCENCY_KIND_SUBTRACTIVE = TRANSLUCENCY_KIND_LAYER2, //!< TRANSLUCENCY_KIND_LAYER2 と同じです。 1346 TRANSLUCENCY_KIND_ADDITIVE = TRANSLUCENCY_KIND_LAYER3, //!< TRANSLUCENCY_KIND_LAYER3 と同じです。 1347 1348 TRANSLUCENCY_KIND_END = TRANSLUCENCY_KIND_LAYER3 //!< 最後の描画レイヤーです。 1349 }; 1350 NW_RES_CTOR_INHERIT(ResMaterial,ResSceneObject)1351 NW_RES_CTOR_INHERIT( ResMaterial, ResSceneObject ) 1352 1353 //--------------------------------------------------------------------------- 1354 //! @fn u32 GetFlags() const 1355 //! @brief フラグの値を取得します。 1356 //--------------------------------------------------------------------------- 1357 //--------------------------------------------------------------------------- 1358 //! @fn void SetFlags(u32 value) 1359 //! @brief フラグの値を設定します。 1360 //! 設定されなかったフラグは無効になります。 1361 //--------------------------------------------------------------------------- 1362 //--------------------------------------------------------------------------- 1363 //! @fn void EnableFlags(u32 value) 1364 //! @brief 指定された Flag の値を有効にします。 1365 //! 設定されなかったフラグは変更されません。 1366 //--------------------------------------------------------------------------- 1367 //--------------------------------------------------------------------------- 1368 //! @fn void DisableFlags(u32 value) 1369 //! @brief 指定された Flag の値を無効にします。 1370 //! 設定されなかったフラグは変更されません。 1371 //--------------------------------------------------------------------------- 1372 NW_RES_FIELD_FLAGS_DECL( u32, Flags ) // GetFlags(), SetFlags(), EnableFlags(), DisableFlags() 1373 1374 //--------------------------------------------------------------------------- 1375 //! @fn void SetTextureCoordinateConfig(TextureCoordinateConfig value) 1376 //! @brief テクスチャの座標のユニット割当設定を設定します。 1377 //--------------------------------------------------------------------------- 1378 //--------------------------------------------------------------------------- 1379 //! @fn TextureCoordinateConfig GetTextureCoordinateConfig() const 1380 //! @brief テクスチャの座標のユニット割当設定を取得します。 1381 //--------------------------------------------------------------------------- 1382 NW_RES_FIELD_PRIMITIVE_DECL( TextureCoordinateConfig, TextureCoordinateConfig ) // GetTextureCoordinateConfig(), SetTextureCoordinateConfig() 1383 1384 //--------------------------------------------------------------------------- 1385 //! @fn TranslucencyKind GetTranslucencyKind() const 1386 //! @brief 透明性の種類を取得します。 1387 //--------------------------------------------------------------------------- 1388 //--------------------------------------------------------------------------- 1389 //! @fn void SetTranslucencyKind(TranslucencyKind value) 1390 //! @brief 透明性の種類を設定します。 1391 //--------------------------------------------------------------------------- 1392 NW_RES_FIELD_PRIMITIVE_DECL( TranslucencyKind, TranslucencyKind ) // GetTranslucencyKind(), SetTranslucencyKind() 1393 1394 //--------------------------------------------------------------------------- 1395 //! @fn ResMaterialColorData & GetMaterialColorData() 1396 //! @brief マテリアルカラーを取得します。 1397 //--------------------------------------------------------------------------- 1398 //--------------------------------------------------------------------------- 1399 //! @fn ResMaterialColor GetMaterialColor() 1400 //! @brief マテリアルカラーを取得します。 1401 //--------------------------------------------------------------------------- 1402 NW_RES_FIELD_RESSTRUCT_DECL( ResMaterialColor, MaterialColor ) // GetMaterialColor(), GetMaterialColorData() 1403 1404 //--------------------------------------------------------------------------- 1405 //! @fn ResRasterizationData & GetRasterizationData() 1406 //! @brief ラスタライゼーションを取得します。 1407 //--------------------------------------------------------------------------- 1408 //--------------------------------------------------------------------------- 1409 //! @fn ResRasterization GetRasterization() 1410 //! @brief ラスタライゼーションを取得します。 1411 //--------------------------------------------------------------------------- 1412 NW_RES_FIELD_RESSTRUCT_DECL( ResRasterization, Rasterization ) // GetRasterization(), GetRasterizationData() 1413 1414 //--------------------------------------------------------------------------- 1415 //! @fn ResFragmentOperationData & GetFragmentOperationData() 1416 //! @brief フラグメントオペレーションを取得します。 1417 //--------------------------------------------------------------------------- 1418 //--------------------------------------------------------------------------- 1419 //! @fn ResFragmentOperation GetFragmentOperation() 1420 //! @brief フラグメントオペレーションを取得します。 1421 //--------------------------------------------------------------------------- 1422 NW_RES_FIELD_RESSTRUCT_DECL( ResFragmentOperation, FragmentOperation ) // GetFragmentOperation(), GetFragmentOperationData() 1423 1424 //--------------------------------------------------------------------------- 1425 //! @fn s32 GetActiveTextureCoordinatorsCount() const 1426 //! @brief テクスチャコーディネータの有効な数を取得します。 1427 //--------------------------------------------------------------------------- 1428 //--------------------------------------------------------------------------- 1429 //! @fn void SetActiveTextureCoordinatorsCount(s32 value) 1430 //! @brief テクスチャコーディネータの有効な数を設定します。 1431 //--------------------------------------------------------------------------- 1432 NW_RES_FIELD_PRIMITIVE_DECL( s32, ActiveTextureCoordinatorsCount ) // SetActiveTextureCoordinatorsCount() GetActiveTextureCoordinatorsCount() 1433 1434 //--------------------------------------------------------------------------- 1435 //! @fn ResTextureCoordinatorData & GetTextureCoordinatorsData(int idx) 1436 //! @brief テクスチャコーディネータの配列を取得します。 1437 //--------------------------------------------------------------------------- 1438 //--------------------------------------------------------------------------- 1439 //! @fn s32 GetTextureCoordinatorsCount() const 1440 //! @brief テクスチャコーディネータの要素数を取得します。 1441 //--------------------------------------------------------------------------- 1442 //--------------------------------------------------------------------------- 1443 //! @fn ResTextureCoordinator GetTextureCoordinators(int idx) 1444 //! @brief テクスチャコーディネータを取得します。 1445 //--------------------------------------------------------------------------- 1446 NW_RES_FIELD_STRUCT_FIXED_LIST_DECL( ResTextureCoordinator, TextureCoordinators ) // GetTextureCoordinators(int idx), GetTextureCoodinatorsData(), GetTextureCoordinatorsData(int idx), GetTextureCoordinatorsCount() 1447 1448 //--------------------------------------------------------------------------- 1449 //! @fn s32 GetTextureMappersCount() const 1450 //! @brief テクスチャマッパーの要素数を取得します。 1451 //--------------------------------------------------------------------------- 1452 //--------------------------------------------------------------------------- 1453 //! @fn ResPixelBasedTextureMapper GetTextureMappers(int idx) 1454 //! @brief テクスチャマッパーを取得します。 1455 //--------------------------------------------------------------------------- 1456 NW_RES_FIELD_CLASS_FIXED_LIST_DECL( ResPixelBasedTextureMapper, TextureMappers ) // GetTextureMappers(int idx), GetTextureMappersCount() 1457 1458 //--------------------------------------------------------------------------- 1459 //! @fn ResProceduralTextureMapper GetProceduralTextureMapper() 1460 //! @brief プロシージャルテクスチャユニットのマッパーを取得します。 1461 //--------------------------------------------------------------------------- 1462 NW_RES_FIELD_CLASS_DECL( ResProceduralTextureMapper, ProceduralTextureMapper ) // GetProceduralTextureMapper() 1463 1464 //--------------------------------------------------------------------------- 1465 //! @fn ResShader GetShader() 1466 //! @brief シェーダーを取得します。 1467 //--------------------------------------------------------------------------- 1468 NW_RES_FIELD_CLASS_DECL( ResShader, Shader ) // GetShader() 1469 1470 //--------------------------------------------------------------------------- 1471 //! @fn ResFragmentShader GetFragmentShader() 1472 //! @brief フラグメントシェーダーを取得します。 1473 //--------------------------------------------------------------------------- 1474 NW_RES_FIELD_CLASS_DECL( ResFragmentShader, FragmentShader ) // GetFragmentShader() 1475 1476 //--------------------------------------------------------------------------- 1477 //! @fn s32 GetShaderProgramDescriptionIndex() const 1478 //! @brief シェーダープログラムのインデックスを取得します。 1479 //--------------------------------------------------------------------------- 1480 //--------------------------------------------------------------------------- 1481 //! @fn void SetShaderProgramDescriptionIndex(s32 value) 1482 //! @brief シェーダープログラムのインデックスを設定します。 1483 //--------------------------------------------------------------------------- 1484 NW_RES_FIELD_PRIMITIVE_DECL( s32, ShaderProgramDescriptionIndex ) // GetShaderProgramDescriptionIndex() 1485 1486 //--------------------------------------------------------------------------- 1487 //! @fn s32 GetShaderParametersCount() const 1488 //! @brief シェーダーパラメータの要素数を取得します。 1489 //--------------------------------------------------------------------------- 1490 //--------------------------------------------------------------------------- 1491 //! @fn ResShaderParameter GetShaderParameters(int idx) 1492 //! @brief シェーダーパラメータを取得します。 1493 //--------------------------------------------------------------------------- 1494 NW_RES_FIELD_CLASS_LIST_DECL( ResShaderParameter, ShaderParameters ) // GetParameters(int idx), GetParametersCount() 1495 1496 //--------------------------------------------------------------------------- 1497 //! @fn s32 GetLightSetIndex() const 1498 //! @brief ライトセットのインデクスを取得します。 1499 //--------------------------------------------------------------------------- 1500 //--------------------------------------------------------------------------- 1501 //! @fn void SetLightSetIndex(s32 value) 1502 //! @brief ライトセットのインデクスを設定します。 1503 //--------------------------------------------------------------------------- 1504 NW_RES_FIELD_PRIMITIVE_DECL( s32, LightSetIndex ) // GetLightSetIndex(), SetLightSetIndex() 1505 1506 //--------------------------------------------------------------------------- 1507 //! @fn s32 GetFogIndex() const 1508 //! @brief フォグのインデクスを取得します。 1509 //--------------------------------------------------------------------------- 1510 //--------------------------------------------------------------------------- 1511 //! @fn void SetFogIndex(s32 value) 1512 //! @brief フォグのインデクスを設定します。 1513 //--------------------------------------------------------------------------- 1514 NW_RES_FIELD_PRIMITIVE_DECL( s32, FogIndex ) // GetFogIndex(), SetFogIndex() 1515 1516 NW_RES_FIELD_PRIMITIVE_DECL( u32, ShadingParameterHash ) // GetShadingParameterHash(), SetShadingParameterHash() 1517 NW_RES_FIELD_PRIMITIVE_DECL( u32, ShaderParametersHash ) // GetShaderParametersHash(), SetShaderParametersHash() 1518 NW_RES_FIELD_PRIMITIVE_DECL( u32, TextureCoordinatorsHash ) // GetTextureCoordinatorsHash(), SetTextureCoordinatorsHash() 1519 NW_RES_FIELD_PRIMITIVE_DECL( u32, TextureSamplersHash ) // GetTextureSamplersHash(), SetTextureSamplersHash() 1520 NW_RES_FIELD_PRIMITIVE_DECL( u32, TextureMappersHash ) // GetTextureMappersHash(), SetTextureMappersHash() 1521 NW_RES_FIELD_PRIMITIVE_DECL( u32, MaterialColorHash ) // GetMaterialColorHash(), SetMaterialColorHash() 1522 NW_RES_FIELD_PRIMITIVE_DECL( u32, RasterizationHash ) // GetRasterizationHash(), SetRasterizationHash() 1523 NW_RES_FIELD_PRIMITIVE_DECL( u32, FragmentLightingHash ) // GetFragmentLightingHash(), SetFragmentLightingHash() 1524 NW_RES_FIELD_PRIMITIVE_DECL( u32, FragmentLightingTableHash ) // GetFragmentLightingTableHash(), SetFragmentLightingTableHash() 1525 NW_RES_FIELD_PRIMITIVE_DECL( u32, FragmentLightingTableParametersHash ) // GetFragmentLightingTableParametersHash(), SetFragmentLightingTableParametersHash() 1526 NW_RES_FIELD_PRIMITIVE_DECL( u32, AlphaTestHash ) // GetAlphaTestHash(), SetAlphaTestHash() 1527 NW_RES_FIELD_PRIMITIVE_DECL( u32, TextureCombinersHash ) // GetTextureCombinersHash(), SetTextureCombinersHash() 1528 NW_RES_FIELD_PRIMITIVE_DECL( u32, FragmentOperationHash ) // GetFragmentOperationHash(), SetFragmentOperationHash() 1529 1530 //--------------------------------------------------------------------------- 1531 //! @fn u32 GetMaterialId() const 1532 //! @brief 描画ソートに使用するマテリアルIDを取得します。 1533 //--------------------------------------------------------------------------- 1534 //--------------------------------------------------------------------------- 1535 //! @fn void SetMaterialId(u32 value) 1536 //! @brief 描画ソートに使用するマテリアルIDを設定します。 1537 //--------------------------------------------------------------------------- 1538 NW_RES_FIELD_PRIMITIVE_DECL( u32, MaterialId ) // GetMaterialId(), SetMaterialId() 1539 1540 //! @brief マテリアルバイナリのリビジョンを取得します。 1541 //! 1542 //! @return マテリアルバイナリのリビジョンを返します。 1543 u32 GetRevision() const { return this->GetHeader().revision; } 1544 1545 //--------------------------------------------------------------------------- 1546 //! @brief リソースの初期化処理をおこないます。 1547 //! 1548 //! @param[in] allocator アロケータです。 1549 //! @param[in] graphicsFile グラフィックスリソースです。 1550 //--------------------------------------------------------------------------- 1551 Result Setup(os::IAllocator* allocator, ResGraphicsFile graphicsFile); 1552 1553 //--------------------------------------------------------------------------- 1554 //! @brief リソースの後始末をおこないます。 1555 //--------------------------------------------------------------------------- 1556 void Cleanup(); 1557 1558 //! @brief セットアップ済みのシェーダーを設定します。 1559 //! 1560 //! @param[in] resShader 設定するシェーダーです。 1561 //! 1562 void SetShader(ResShader resShader); 1563 1564 //! @brief targetName で参照しているテクスチャを、 texture で強制的に置き換えます。 1565 //! 1566 void ForceSetupTexture(const char* targetName, ResTexture texture); 1567 1568 //! @brief 参照しているシェーダを、 shader で強制的に置き換えます。 1569 //! SetShaderと異なり、内部でsetup時の処理を行います。 1570 //! 1571 void ForceSetupShader(const char* targetName, ResShader resShader); 1572 1573 //! @brief FragmentShader 内部の Lut を、 lut で強制的に置き換えます。 1574 //! targetNameで参照解決を行っている LookupTable が対象です。 1575 void ForceSetupLookupTable(const char* targetName, ResLookupTable lut); 1576 1577 //--------------------------------------------------------------------------- 1578 //! @fn void SetMaterialColorHash(u32 value) 1579 //! @details :private 1580 //--------------------------------------------------------------------------- 1581 //--------------------------------------------------------------------------- 1582 //! @fn void SetFragmentOperationHash(u32 value) 1583 //! @details :private 1584 //--------------------------------------------------------------------------- 1585 //--------------------------------------------------------------------------- 1586 //! @fn void SetFragmentLightingTableParametersHash(u32 value) 1587 //! @details :private 1588 //--------------------------------------------------------------------------- 1589 //--------------------------------------------------------------------------- 1590 //! @fn void SetFragmentLightingTableHash(u32 value) 1591 //! @details :private 1592 //--------------------------------------------------------------------------- 1593 //--------------------------------------------------------------------------- 1594 //! @fn void SetFragmentLightingHash(u32 value) 1595 //! @details :private 1596 //--------------------------------------------------------------------------- 1597 //--------------------------------------------------------------------------- 1598 //! @fn void SetAlphaTestHash(u32 value) 1599 //! @details :private 1600 //--------------------------------------------------------------------------- 1601 //--------------------------------------------------------------------------- 1602 //! @fn u32 GetTextureSamplersHash() const 1603 //! @details :private 1604 //--------------------------------------------------------------------------- 1605 //--------------------------------------------------------------------------- 1606 //! @fn u32 GetTextureMappersHash() const 1607 //! @details :private 1608 //--------------------------------------------------------------------------- 1609 //--------------------------------------------------------------------------- 1610 //! @fn u32 GetTextureCoordinatorsHash() const 1611 //! @details :private 1612 //--------------------------------------------------------------------------- 1613 //--------------------------------------------------------------------------- 1614 //! @fn u32 GetTextureCombinersHash() const 1615 //! @details :private 1616 //--------------------------------------------------------------------------- 1617 //--------------------------------------------------------------------------- 1618 //! @fn u32 GetShadingParameterHash() const 1619 //! @details :private 1620 //--------------------------------------------------------------------------- 1621 //--------------------------------------------------------------------------- 1622 //! @fn u32 GetFragmentOperationHash() const 1623 //! @details :private 1624 //--------------------------------------------------------------------------- 1625 //--------------------------------------------------------------------------- 1626 //! @fn u32 GetMaterialColorHash() const 1627 //! @details :private 1628 //--------------------------------------------------------------------------- 1629 //--------------------------------------------------------------------------- 1630 //! @fn u32 GetRasterizationHash() const 1631 //! @details :private 1632 //--------------------------------------------------------------------------- 1633 //--------------------------------------------------------------------------- 1634 //! @fn u32 GetFragmentLightingTableParametersHash() const 1635 //! @details :private 1636 //--------------------------------------------------------------------------- 1637 //--------------------------------------------------------------------------- 1638 //! @fn u32 GetFragmentLightingTableHash() const 1639 //! @details :private 1640 //--------------------------------------------------------------------------- 1641 //--------------------------------------------------------------------------- 1642 //! @fn u32 GetFragmentLightingHash() const 1643 //! @details :private 1644 //--------------------------------------------------------------------------- 1645 //--------------------------------------------------------------------------- 1646 //! @fn u32 GetAlphaTestHash() const 1647 //! @details :private 1648 //--------------------------------------------------------------------------- 1649 //--------------------------------------------------------------------------- 1650 //! @fn void SetTextureSamplersHash(u32 value) 1651 //! @details :private 1652 //--------------------------------------------------------------------------- 1653 //--------------------------------------------------------------------------- 1654 //! @fn void SetTextureMappersHash(u32 value) 1655 //! @details :private 1656 //--------------------------------------------------------------------------- 1657 //--------------------------------------------------------------------------- 1658 //! @fn void SetTextureCoordinatorsHash(u32 value) 1659 //! @details :private 1660 //--------------------------------------------------------------------------- 1661 //--------------------------------------------------------------------------- 1662 //! @fn void SetTextureCombinersHash(u32 value) 1663 //! @details :private 1664 //--------------------------------------------------------------------------- 1665 //--------------------------------------------------------------------------- 1666 //! @fn void SetShadingParameterHash(u32 value) 1667 //! @details :private 1668 //--------------------------------------------------------------------------- 1669 //--------------------------------------------------------------------------- 1670 //! @fn void SetRasterizationHash(u32 value) 1671 //! @details :private 1672 //--------------------------------------------------------------------------- 1673 //--------------------------------------------------------------------------- 1674 //! @fn void SetShaderParametersHash(u32 value) 1675 //! @details :private 1676 //--------------------------------------------------------------------------- 1677 //--------------------------------------------------------------------------- 1678 //! @fn u32 GetShaderParametersHash() const 1679 //! @details :private 1680 //--------------------------------------------------------------------------- 1681 private: 1682 //! @brief シェーダーをセットアップします。 1683 Result SetupShader(os::IAllocator* allocator, ResShader resShader, ResGraphicsFile graphicsFile); 1684 1685 //! @brief テクスチャをセットアップします。 1686 Result SetupTextures(os::IAllocator* allocator, ResMaterial resMaterial, ResGraphicsFile graphicsFile); 1687 1688 //! @brief シェーダーシンボルへのインデックスをキャッシュします。 1689 //! 1690 //! @param[in] symbols キャッシュを行うシェーダーシンボルの配列です。 1691 //! 1692 void CacheUserUniformIndex(ResShaderSymbolArray symbols); 1693 1694 //! @brief フラグメントライティングテーブルをセットアップします。 1695 Result SetupFragmentLightingTable(os::IAllocator* allocator, ResFragmentLightingTable resLightingTable, ResGraphicsFile graphicsFile); 1696 1697 //! @brief フラグメントライティングのハッシュを計算します。 1698 void CalcFragmentLightingTableHash(); 1699 }; 1700 typedef nw::ut::ResArrayPatricia<ResMaterial>::type ResMaterialArray; 1701 typedef nw::ut::ResArrayPatricia<const ResMaterial>::type ResMaterialArrayConst; 1702 1703 } // namespace res 1704 } // namespace gfx 1705 } // namespace nw 1706 1707 #endif // NW_GFX_RESMATERIAL_H_ 1708