/*---------------------------------------------------------------------------* Project: NintendoWare File: lyt_Common.h Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Revision: 26780 $ *---------------------------------------------------------------------------*/ #ifndef NW_LYT_COMMON_H_ #define NW_LYT_COMMON_H_ #include #include #include #include #ifdef NW_PLATFORM_CTR #define NW_LYT_WRITEONLY __writeonly #else #define NW_LYT_WRITEONLY #endif // ビルドターゲットにかかわらず出力します。 #define NW_LYT_PRINT ::nw::os::internal::Printf namespace nw { namespace lyt { class Material; struct Size; class DrawInfo; class GraphicsResource; class Layout; class ResourceAccessor; //--------------------------------------------------------------------------- //! :category リソースアクセサ //! //! @brief レイアウトリソースへのポインタを持つ構造体です。 //! //! @since 2009/09/18 初版。 //--------------------------------------------------------------------------- struct ResBlockSet { //! テクスチャリソースのリストです。 const res::TextureList* pTextureList; //! フォントリソースのリストです。 const res::FontList* pFontList; //! マテリアルリソースのリストです。 const res::MaterialList* pMaterialList; //! リソースアクセサです。 ResourceAccessor* pResAccessor; }; namespace internal { enum FrameSpecFlag { FRAMESPECFLAG_CONST_VERTEX = 1 << 0, FRAMESPECFLAG_FRAME = 1 << 1, FRAMESPECFLAG_SWAP = 1 << 2, FRAMESPECFLAG_RIGHT = 1 << 3, FRAMESPECFLAG_BOTTOM = 1 << 4, FRAMESPECFLAG_HFLIP = 1 << 5, FRAMESPECFLAG_VFLIP = 1 << 6, FRAMESPECFLAG_FRAME_LT = FRAMESPECFLAG_CONST_VERTEX | FRAMESPECFLAG_FRAME, FRAMESPECFLAG_FRAME_RT = FRAMESPECFLAG_CONST_VERTEX | FRAMESPECFLAG_FRAME | FRAMESPECFLAG_RIGHT, FRAMESPECFLAG_FRAME_LB = FRAMESPECFLAG_CONST_VERTEX | FRAMESPECFLAG_FRAME | FRAMESPECFLAG_BOTTOM, FRAMESPECFLAG_FRAME_RB = FRAMESPECFLAG_CONST_VERTEX | FRAMESPECFLAG_FRAME | FRAMESPECFLAG_RIGHT | FRAMESPECFLAG_BOTTOM, FRAMESPECFLAG_FLIP_HFLIP = FRAMESPECFLAG_HFLIP, FRAMESPECFLAG_FLIP_VFLIP = FRAMESPECFLAG_VFLIP, FRAMESPECFLAG_FLIP_R90 = FRAMESPECFLAG_HFLIP | FRAMESPECFLAG_SWAP, FRAMESPECFLAG_FLIP_R180 = FRAMESPECFLAG_HFLIP | FRAMESPECFLAG_VFLIP, FRAMESPECFLAG_FLIP_R270 = FRAMESPECFLAG_VFLIP | FRAMESPECFLAG_SWAP, FRAMESPECFLAG_NORMAL = 0 }; bool EqualsResName(const char* name1, const char* name2); bool EqualsMaterialName(const char* name1, const char* name2); inline const char* GetStrTableStr(const void* pStrTable, int index) { const u32* offsets = static_cast(pStrTable); const char* stringPool = static_cast(pStrTable); return &stringPool[offsets[index]]; } // 矩形のテクスチャ座標を複数個保持するクラスです。 class TexCoordAry { public: // コンストラクタです。 TexCoordAry(); // 保持可能なセット数が0か調べます。 bool IsEmpty() const { return m_Cap == 0; } // メンバーを解放し、保持可能なセット数を0に設定します。 void Free(); // 指定のセット数を保持するのに十分なメモリを確保します。 void Reserve(u8 num); // 保持しているセット数を取得します。 u8 GetSize() const { return m_Num; } // 保持するセット数を設定し、座標を初期化します。 void SetSize(u8 num); // テクスチャ座標配列の先頭アドレスを取得します。 const TexCoordQuad* GetArray() const { return m_pData; } // 指定したセットのテクスチャ座標配列の先頭アドレスを取得します。 void GetCoord( u32 idx, TexCoordQuad coord) const; // 指定したセットのテクスチャ座標を設定します。 void SetCoord( u32 idx, const TexCoordQuad coord); // リソースのテクスチャ座標をコピーします。 void Copy( const void* pResTexCoord, u8 texCoordNum); protected: //! @details :private u8 m_Cap; //! @details :private u8 m_Num; //! @details :private math::VEC2 (*m_pData)[VERTEX_MAX]; }; const ut::Color8 MultipleAlpha( const ut::Color8 col, u8 alpha); void DrawQuad( const DrawInfo& drawInfo, const math::VEC2& basePt, const Size& size, u8 texCoordNum = 0, const math::VEC2 (*texCoords)[VERTEX_MAX] = NULL, const ut::Color8* vtxColors = NULL); void DrawQuad_Repeat( const DrawInfo& drawInfo, const math::VEC2& basePt, const Size& size); void DrawLine( const DrawInfo& drawInfo, const math::VEC2& pos, const Size& size, ut::Color8 color); void FinalizeGraphics(); inline u8 GetVtxColorElement( const ut::Color8 cols[], u32 idx ) { NW_ASSERT(idx < ANIMTARGET_VERTEXCOLOR_MAX); return reinterpret_cast(&cols[idx / sizeof(ut::Color8)])[idx % sizeof(ut::Color8)]; } inline void SetVtxColorElement( ut::Color8 cols[], u32 idx, u8 value ) { NW_ASSERT(idx < ANIMTARGET_VERTEXCOLOR_MAX); reinterpret_cast(&cols[idx / sizeof(ut::Color8)])[idx % sizeof(ut::Color8)] = value; } inline HorizontalPosition GetHorizontalPosition(u8 var) { return static_cast(var % HORIZONTALPOSITION_MAX); } inline VerticalPosition GetVerticalPosition(u8 var) { return static_cast(var / HORIZONTALPOSITION_MAX); } inline void SetHorizontalPosition(u8* pVar, u8 newVal) { NW_ASSERT(newVal < HORIZONTALPOSITION_MAX); *pVar = u8(GetVerticalPosition(*pVar) * HORIZONTALPOSITION_MAX + newVal); } inline void SetVerticalPosition(u8* pVar, u8 newVal) { NW_ASSERT(newVal < VERTICALPOSITION_MAX); *pVar = u8(newVal * HORIZONTALPOSITION_MAX + GetHorizontalPosition(*pVar)); } class GL { public: static void SetTextureSamplerType(GraphicsResource& graphicsResource, int index, int value); static void SetTevCombineRgb(GraphicsResource& graphicsResource, int index, TevMode value); static void SetTevCombineAlpha(GraphicsResource& graphicsResource, int index, TevMode value); static void SetTevSrcRgb(GraphicsResource& graphicsResource, int index, TevSrc value0, TevSrc value1, TevSrc value2); static void SetTevSrcAlpha(GraphicsResource& graphicsResource, int index, TevSrc value0, TevSrc value1, TevSrc value2); static void SetTevOperandRgb(GraphicsResource& graphicsResource, int index, TevOpRgb value0, TevOpRgb value1, TevOpRgb value2); static void SetTevOperandAlpha(GraphicsResource& graphicsResource, int index, TevOpAlp value0, TevOpAlp value1, TevOpAlp value2); static void SetTevScaleRgb(GraphicsResource& graphicsResource, int index, TevScale value); static void SetTevScaleAlpha(GraphicsResource& graphicsResource, int index, TevScale value); static void SetTevConstRgba(GraphicsResource& graphicsResource, int index, ut::Color8 value); static void SetTevConstRgba(GraphicsResource& graphicsResource, int index, ut::Color8 value0, ut::Color8 value1); static void SetTevBufferColor(GraphicsResource &graphicsResource, ut::Color8 value); static void SetTevBufferInput(GraphicsResource &graphicsResource, int index, bool valueRgb, bool valueAlpha); static void SetEnableAlphaTest(GraphicsResource& graphicsResource, bool value); static void SetAlphaRefValue(GraphicsResource& graphicsResource, f32 value); static void SetAlphaTestFunc(GraphicsResource& graphicsResource, AlphaTest value); static void SetTexMinFilter(GraphicsResource& graphicsResoruce, TexFilter value); static void SetTexMagFilter(GraphicsResource& graphicsResoruce, TexFilter value); }; } // namespace nw::lyt::internal } // namespace nw::lyt } // namespace nw #endif // NW_LYT_COMMON_H_