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