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