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