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