/*---------------------------------------------------------------------------* Project: NintendoWare File: gfx_RelativeHashMaterialIdGenerator.cpp 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: 22484 $ *---------------------------------------------------------------------------*/ #include "precompiled.h" #include #include namespace nw { namespace gfx { NW_UT_RUNTIME_TYPEINFO_ROOT_DEFINITION(RelativeHashMaterialIdGenerator); //! ライブラリで標準的に用いるマテリアルのハッシュ値となります。 const u32 RelativeHashMaterialIdGenerator::m_DefaultHashes[] = { 0x3b75655e, //!< ShaderParameter 0x640102f8, //!< AlphaTest 0xa6eb8db7, //!< TextureSamplers 0x104f3679, //!< TextureCombiner 0xdbf039d1, //!< FragmentOperation 0x3b75655e, //!< FragmentLightingTableParameters 0xc06ac8f4, //!< Raterization 0x00000001, //!< ShadingParameter 0xf43df7f4, //!< TextureCoordinator 0xe9a0ea24, //!< MaterialColor 0x9be0aae3, //!< FragmentLighting }; //---------------------------------------- IMaterialIdGenerator* RelativeHashMaterialIdGenerator::Builder::Create( os::IAllocator* allocator ) { NW_NULL_ASSERT(allocator); void* memory = allocator->Alloc(sizeof(RelativeHashMaterialIdGenerator)); NW_NULL_ASSERT(memory); MaterialArray materials; if (m_Description.isFixedSizeMemory) { materials = MaterialArray(m_Description.maxMaterials, allocator); } else { materials = MaterialArray(allocator); } RelativeHashMaterialIdGenerator* generator = new(memory) RelativeHashMaterialIdGenerator( allocator, m_Description.isForceGeneration, materials); return generator; } //---------------------------------------- u32 RelativeHashMaterialIdGenerator::CompareHash(u32 materialHash, MaterialOrder order) { const u32 upperId = 0x1 << 0; const u32 lowerId = 0x1 << 1; if (materialHash != m_DefaultHashes[order]) { if (materialHash > m_DefaultHashes[order]) { return upperId << (order * 2); } else { return lowerId << (order * 2); } } return 0; } //---------------------------------------- void RelativeHashMaterialIdGenerator::Generate() { MaterialArray::iterator materialEnd = m_Materials.end(); for (MaterialArray::iterator iter = m_Materials.begin(); iter != materialEnd; ++iter) { ResMaterial resMaterial = (*iter)->GetOriginal(); NW_ASSERT(resMaterial.IsValid()); if (resMaterial.GetMaterialId() == 0x0 || m_IsForceGeneration) { u32 materialId = 0x0; materialId |= CompareHash(resMaterial.GetShaderParametersHash(), MATERIAL_ORDER_SHADER_PARAMETERS); materialId |= CompareHash(resMaterial.GetShadingParameterHash(), MATERIAL_ORDER_SHADING_PARMETER); materialId |= CompareHash(resMaterial.GetMaterialColorHash(), MATERIAL_ORDER_MATERIAL_COLOR); materialId |= CompareHash(resMaterial.GetRasterizationHash(), MATERIAL_ORDER_RASTERIZATION); materialId |= CompareHash(resMaterial.GetTextureCoordinatorsHash(), MATERIAL_ORDER_TEXTURE_COORDINATORS); materialId |= CompareHash(resMaterial.GetTextureSamplersHash(), MATERIAL_ORDER_TEXTURE_SAMPLERS); materialId |= CompareHash(resMaterial.GetFragmentLightingHash(), MATERIAL_ORDER_FRAGMENT_LIGHTING); materialId |= CompareHash(resMaterial.GetFragmentLightingTableParametersHash(), MATERIAL_ORDER_FRAGMENT_LIGHTING_TABLE_PARAMETERS); materialId |= CompareHash(resMaterial.GetTextureCombinersHash(), MATERIAL_ORDER_TEXTURE_COMBINER); materialId |= CompareHash(resMaterial.GetAlphaTestHash(), MATERIAL_ORDER_ALPHA_TEST); materialId |= CompareHash(resMaterial.GetFragmentOperationHash(), MATERIAL_ORDER_FRAGMENT_OPERATION); resMaterial.SetMaterialId(materialId); } } // 生成後はマテリアルのリストを解放します。 m_Materials.clear(); } } // namespace gfx } // namespace nw