1 /*---------------------------------------------------------------------------*
2 Project: NintendoWare
3 File: gfx_DirectMaterialActivator.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
20 #include <nw/gfx/gfx_MaterialActivator.h>
21 #include <nw/gfx/gfx_MaterialState.h>
22 #include <nw/gfx/gfx_Model.h>
23 #include <nn/gx.h>
24
25 namespace nw
26 {
27 namespace gfx
28 {
29
30 NW_UT_RUNTIME_TYPEINFO_DEFINITION(DirectMaterialActivator, IMaterialActivator);
31
32 //----------------------------------------
33 DirectMaterialActivator*
Create(os::IAllocator * allocator)34 DirectMaterialActivator::Create(os::IAllocator* allocator)
35 {
36 void* memory = allocator->Alloc(sizeof(DirectMaterialActivator));
37
38 if (memory == NULL)
39 {
40 return NULL;
41 }
42 else
43 {
44 return new(memory) DirectMaterialActivator(allocator);
45 }
46 }
47
48 //----------------------------------------
49 void
Activate(RenderContext * renderContext,const Material * material)50 DirectMaterialActivator::Activate(RenderContext* renderContext, const Material* material)
51 {
52 NW_NULL_ASSERT(renderContext);
53 const ShaderProgram* shaderProgram = renderContext->GetShaderProgram();
54 NW_NULL_ASSERT(shaderProgram);
55
56 const Model* owner = material->GetOwnerModel();
57 NW_NULL_ASSERT(owner);
58
59 const SceneEnvironment& sceneEnvironment = renderContext->GetSceneEnvironment();
60
61 RenderContext::MaterialHash materialHash = renderContext->GetMaterialHash();
62
63 if (ut::CheckFlag(m_ActivateFlags, Model::FLAG_BUFFER_SHADER_PARAMETER))
64 {
65 internal::MaterialState::ActivateShaderParameter(shaderProgram, material->GetShaderParameterResMaterial());
66 materialHash.shaderParameter = 0x0;
67 }
68
69 const ResMaterial resShadingParameterResMaterial = material->GetShadingParameterResMaterial();
70
71 // FragmentLightEnabled は必ず設定します。
72 internal::MaterialState::ActivateFragmentLightParameters(sceneEnvironment, shaderProgram, resShadingParameterResMaterial);
73
74 if (ut::CheckFlag(m_ActivateFlags, Model::FLAG_BUFFER_SHADING_PARAMETER))
75 {
76 internal::MaterialState::ActivateShadingParameters(sceneEnvironment, shaderProgram, resShadingParameterResMaterial);
77 materialHash.shadingParameter = 0x0;
78 }
79
80 const ResMaterial resRasterizationMaterial = material->GetRasterizationResMaterial();
81 if (ut::CheckFlag(m_ActivateFlags, Model::FLAG_BUFFER_RASTERIZATION))
82 {
83 internal::MaterialState::ActivateRasterization(resRasterizationMaterial.GetRasterization());
84 materialHash.rasterization = 0x0;
85 }
86
87 if (ut::CheckFlag(m_ActivateFlags, Model::FLAG_BUFFER_TEXTURE_COORDINATOR))
88 {
89 internal::MaterialState::ActivateTextureCoordinators(renderContext, shaderProgram, material->GetTextureCoordinatorResMaterial());
90 materialHash.textureCoordinator = 0x0;
91 }
92
93 if (ut::CheckFlag(m_ActivateFlags, Model::FLAG_BUFFER_TEXTURE_MAPPER))
94 {
95 internal::MaterialState::ActivateTextureMappers(material->GetTextureMapperResMaterial());
96 materialHash.textureMapper = 0x0;
97 }
98
99 const ResMaterial resFragmentLightingResMaterial = material->GetFragmentLightingResMaterial();
100 const ResFragmentLighting resFragmentLighting = resFragmentLightingResMaterial.GetFragmentShader().GetFragmentLighting();
101 if (ut::CheckFlag(m_ActivateFlags, Model::FLAG_BUFFER_FRAGMENT_LIGHTING))
102 {
103 internal::MaterialState::ActivateFragmentLighting(sceneEnvironment, resFragmentLighting);
104 materialHash.fragmentLighting = 0x0;
105 }
106
107 const ResMaterial resFramgnetLightingTableResMaterial = material->GetFragmentLightingTableResMaterial();
108 if (ut::CheckFlag(m_ActivateFlags, Model::FLAG_BUFFER_FRAGMENT_LIGHTING_TABLE))
109 {
110 const ResFragmentLightingTable resFragmentLightingTable = resFramgnetLightingTableResMaterial.GetFragmentShader().GetFragmentLightingTable();
111 internal::MaterialState::ActivateFragmentLightingTable(resFragmentLighting, resFragmentLightingTable);
112 materialHash.fragmentLightingTable = 0x0;
113 }
114
115 const ResMaterial resMaterialColorResMaterial = material->GetMaterialColorResMaterial();
116 const ResMaterialColor resMaterialColor = resMaterialColorResMaterial.GetMaterialColor();
117
118 Material* cacheMaterial = renderContext->GetMaterialCache();
119 if (ut::CheckFlag(m_ActivateFlags, Model::FLAG_BUFFER_MATERIAL_COLOR))
120 {
121 bool reflectionEnabled = ut::CheckFlag(resFragmentLighting.GetFlags(), ResFragmentLightingData::FLAG_REFLECTION_ENABLED);
122 internal::MaterialState::ActivateMaterialColor(sceneEnvironment, shaderProgram, resMaterialColor, reflectionEnabled);
123 materialHash.materialColor = 0x0;
124 }
125
126 const ResMaterial resTextureCombinerResMaterial = material->GetTextureCombinerResMaterial();
127 if (ut::CheckFlag(m_ActivateFlags, Model::FLAG_BUFFER_TEXTURE_COMBINER))
128 {
129 const ResFragmentShader resTextureCombinerFragmentShader = resTextureCombinerResMaterial.GetFragmentShader();
130 internal::MaterialState::ActivateTextureCombiners(resTextureCombinerFragmentShader, resMaterialColor);
131 materialHash.textureCombiner = 0x0;
132 }
133
134 const ResMaterial resAlphaTestResMaterial = material->GetAlphaTestResMaterial();
135 if (ut::CheckFlag(m_ActivateFlags, Model::FLAG_BUFFER_ALPHA_TEST))
136 {
137 const ResAlphaTest resAlphaTest = resAlphaTestResMaterial.GetFragmentShader().GetAlphaTest();
138 internal::MaterialState::ActivateAlphaTest(resAlphaTest);
139 materialHash.alphaTest = 0x0;
140 }
141
142 const ResMaterial resFragmentOperationResMaterial = material->GetFragmentOperationResMaterial();
143 if (ut::CheckFlag(m_ActivateFlags, Model::FLAG_BUFFER_FRAGMENT_OPERATION))
144 {
145 const ResFragmentOperation resFragmentOperation = resFragmentOperationResMaterial.GetFragmentOperation();
146 internal::MaterialState::ActivateFragmentOperation(resFragmentOperation);
147 materialHash.fragmentOperation = 0x0;
148 }
149
150 renderContext->SetMaterialHash(materialHash);
151 }
152
153 //----------------------------------------
DirectMaterialActivator(os::IAllocator * allocator)154 DirectMaterialActivator::DirectMaterialActivator(os::IAllocator* allocator)
155 : IMaterialActivator(allocator),
156 m_ActivateFlags(Model::MULTI_FLAG_BUFFER_MATERIAL)
157 {
158 }
159
160 //----------------------------------------
~DirectMaterialActivator()161 DirectMaterialActivator::~DirectMaterialActivator()
162 {
163 }
164
165 } // namespace gfx
166 } // namespace nw
167