| 141 | } |
| 142 | |
| 143 | MaterialShader* MaterialShader::Create(const StringView& name, MemoryReadStream& shaderCacheStream, const MaterialInfo& info) |
| 144 | { |
| 145 | PROFILE_MEM(GraphicsMaterials); |
| 146 | MaterialShader* material; |
| 147 | switch (info.Domain) |
| 148 | { |
| 149 | case MaterialDomain::Surface: |
| 150 | material = info.BlendMode == MaterialBlendMode::Opaque ? (MaterialShader*)New<DeferredMaterialShader>(name) : (MaterialShader*)New<ForwardMaterialShader>(name); |
| 151 | break; |
| 152 | case MaterialDomain::PostProcess: |
| 153 | material = New<PostFxMaterialShader>(name); |
| 154 | break; |
| 155 | case MaterialDomain::Decal: |
| 156 | material = New<DecalMaterialShader>(name); |
| 157 | break; |
| 158 | case MaterialDomain::GUI: |
| 159 | material = New<GUIMaterialShader>(name); |
| 160 | break; |
| 161 | case MaterialDomain::Terrain: |
| 162 | material = New<TerrainMaterialShader>(name); |
| 163 | break; |
| 164 | case MaterialDomain::Particle: |
| 165 | material = New<ParticleMaterialShader>(name); |
| 166 | break; |
| 167 | case MaterialDomain::Deformable: |
| 168 | material = New<DeformableMaterialShader>(name); |
| 169 | break; |
| 170 | case MaterialDomain::VolumeParticle: |
| 171 | material = New<VolumeParticleMaterialShader>(name); |
| 172 | break; |
| 173 | default: |
| 174 | LOG(Error, "Unknown material type."); |
| 175 | return nullptr; |
| 176 | } |
| 177 | if (material->Load(shaderCacheStream, info)) |
| 178 | { |
| 179 | Delete(material); |
| 180 | return nullptr; |
| 181 | } |
| 182 | return material; |
| 183 | } |
| 184 | |
| 185 | class DummyMaterial : public MaterialShader |
| 186 | { |