1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     gfx_ParticleMaterialActivator.cpp
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: 25474 $
14  *---------------------------------------------------------------------------*/
15 
16 #include "precompiled.h"
17 #include <nw/gfx/gfx_ActivateCommand.h>
18 #include <nw/gfx/gfx_ParticleMaterialActivator.h>
19 #include <nw/gfx/gfx_MaterialState.h>
20 #include <nw/gfx/gfx_Model.h>
21 #include <nn/gx.h>
22 #include <nw/dev.h>
23 
24 
25 namespace nw
26 {
27 namespace gfx
28 {
29 
30 NW_UT_RUNTIME_TYPEINFO_DEFINITION(ParticleMaterialActivator, IMaterialActivator);
31 
32 //----------------------------------------
33 IMaterialActivator*
Create(os::IAllocator * allocator)34 ParticleMaterialActivator::Create(os::IAllocator* allocator)
35 {
36     void* memory = allocator->Alloc(sizeof(ParticleMaterialActivator));
37 
38     if (memory == NULL)
39     {
40         return NULL;
41     }
42     else
43     {
44         return new(memory) ParticleMaterialActivator(allocator);
45     }
46 }
47 
48 //----------------------------------------
49 void
Activate(RenderContext * renderContext,const Material * material)50 ParticleMaterialActivator::Activate(RenderContext* renderContext, const Material* material)
51 {
52     #define _NO_USE_MATERIAL_BUFFER (1)
53 
54     NW_NULL_ASSERT(renderContext);
55 
56     const SceneEnvironment& sceneEnvironment = renderContext->GetSceneEnvironment();
57 
58     // ParticleMaterialActivator の場合はリソースの比較を行います。
59     // 直前に設定したマテリアルがバッファを使っている場合はスキップできません。
60     const Material* cacheMaterial = renderContext->GetMaterialCache();
61     if ( ( cacheMaterial != NULL) &&
62          ( cacheMaterial->GetOriginal() == material->GetOriginal() ) )
63     {
64         return;
65     }
66 
67     const ShaderProgram* shaderProgram = renderContext->GetShaderProgram();
68     NW_NULL_ASSERT(shaderProgram);
69 
70     ResMaterial original = material->GetOriginal();
71     const Model* owner = material->GetOwnerModel();
72     NW_NULL_ASSERT(owner);
73 
74     RenderContext::MaterialHash materialHash = renderContext->GetMaterialHash();
75 
76     // シェーダパラメータは使用しない(ActivateShaderParameter)
77 
78     ResMaterial resShadingParametersMaterial = original;
79 
80     // シェーディングパラメータは使用しない(ActivateShadingParameters)
81     // フォグ
82     internal::MaterialState::ActivateFogParameters(sceneEnvironment, resShadingParametersMaterial);
83 
84     // ラスタライズ/ポリゴンオフセット等の設定
85     ResRasterization resRasterization = original.GetRasterization();
86     u32 rasterizationHash = original.GetRasterizationHash();
87     bool isRasterizationEnabled = (rasterizationHash == 0x0) || (rasterizationHash != materialHash.rasterization);
88     if (isRasterizationEnabled)
89     {
90         internal::MaterialState::ActivateRasterization(resRasterization);
91         materialHash.rasterization = rasterizationHash;
92     }
93 
94     // テクスチャコーディネイター
95     ResMaterial resTextureCoordinatorsMaterial = original;
96     u32 textureCoordinatorHash = resTextureCoordinatorsMaterial.GetTextureCoordinatorsHash();
97     if (textureCoordinatorHash != materialHash.textureCoordinator)
98     {
99         // パーティクル専用のテクスチャコーディネータを使用します。
100         internal::MaterialState::ActivateParticleTextureCoordinators(renderContext, shaderProgram, resTextureCoordinatorsMaterial);
101         materialHash.textureCoordinator = textureCoordinatorHash;
102     }
103 
104     // テクスチャマッパー
105     ResMaterial resTextureMappersMaterial = original;
106     u32 textureMappersHash = resTextureMappersMaterial.GetTextureMappersHash();
107     bool isTextureMappersEnabled = (textureMappersHash == 0x0) || (textureMappersHash != materialHash.textureMapper);
108     if (isTextureMappersEnabled)
109     {
110         internal::MaterialState::ActivateParticleTextureMappers(resTextureMappersMaterial);
111         materialHash.textureMapper = textureMappersHash;
112     }
113 
114     // ライトは使用しない(ActivateFragmentLighting/ActivateFragmentLightingTable)
115 
116     // マテリアルカラーは使用しない(ActivateMaterialColor)
117     ResMaterialColor resMaterialColor =  original.GetMaterialColor();
118 
119     // コンスタントカラー使用判別用
120     u32 materialColorHash = original.GetMaterialColorHash();
121     bool isMaterialColorEnabled = (materialColorHash == 0x0) || (materialColorHash != materialHash.materialColor);
122 
123     // テクスチャコンバイナ
124     ResFragmentShader resTextureCombinerFragmentShader = original.GetFragmentShader();
125     u32 textureCombinersHash = original.GetTextureCombinersHash();
126     bool isTextureCombinersEnabled = (textureCombinersHash == 0x0) || (textureCombinersHash != materialHash.textureCombiner);
127     if (isTextureCombinersEnabled || isMaterialColorEnabled)
128     {
129         internal::MaterialState::ActivateTextureCombiners(resTextureCombinerFragmentShader, resMaterialColor);
130         materialHash.textureCombiner = textureCombinersHash;
131     }
132 
133     // アルファテスト
134     ResAlphaTest resAlphaTest = original.GetFragmentShader().GetAlphaTest();
135     internal::MaterialState::ActivateAlphaTest(resAlphaTest);
136 
137     // ブレンド/デプス/ステンシル設定
138     ResFragmentOperation resFragmentOperation = original.GetFragmentOperation();
139     u32 fragmentOperationHash = original.GetFragmentOperationHash();
140     bool isFragmentOperationEnabled = (fragmentOperationHash == 0x0) || (fragmentOperationHash != materialHash.fragmentOperation);
141     if (isFragmentOperationEnabled)
142     {
143         internal::MaterialState::ActivateFragmentOperation(resFragmentOperation);
144         materialHash.fragmentOperation = fragmentOperationHash;
145     }
146     renderContext->SetMaterialHash(materialHash);
147 }
148 
149 //----------------------------------------
ParticleMaterialActivator(os::IAllocator * allocator)150 ParticleMaterialActivator::ParticleMaterialActivator(os::IAllocator* allocator)
151     : IMaterialActivator(allocator)
152 {
153 }
154 
155 //----------------------------------------
~ParticleMaterialActivator()156 ParticleMaterialActivator::~ParticleMaterialActivator()
157 {
158 }
159 
160 } // namespace gfx
161 } // namespace nw
162