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