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