private MaterialPtr createFromDescription(MaterialDescription description, bool alpha) { String name = description.Name; if (description.CreateAlphaMaterial && alpha) //Is this an automatic alpha material? { name += "Alpha"; } MaterialPtr material = MaterialManager.getInstance().create(name, GroupName, false, null); CreateMaterial createMaterial = createUnifiedMaterial; if (description.IsSpecialMaterial && !specialMaterialFuncs.TryGetValue(description.SpecialMaterial, out createMaterial)) { Logging.Log.Error("Could not find special material creation function {0} for material {1} in {2}.", description.SpecialMaterial, description.Name, description.SourceFile); createMaterial = createUnifiedMaterial; //Attempt to create something, out above clears this variable } IndirectionTexture indirectionTex = createMaterial(material.Value.getTechnique(0), description, alpha, true); if (alpha) { //Create no depth check technique Technique technique = material.Value.createTechnique(); technique.setLodIndex(1); technique.createPass(); createMaterial(technique, description, alpha, false); } //If we have an indirection texture we need to seup the virtual texturing, if not no additional techniques will be created and the //entity must disable itself for feedback buffer rendering somehow (likely visibility mask). if (indirectionTex != null) { String vertexShaderName = shaderFactory.createFeedbackVertexProgram(indirectionTex.FeedbackBufferVPName, description.NumHardwareBones, description.NumHardwarePoses); String fragmentShaderName = shaderFactory.createFeedbackBufferFP(indirectionTex.FeedbackBufferFPName); indirectionTex.setupFeedbackBufferTechnique(material.Value, vertexShaderName); int count = 0; if (!indirectionTextureUsageCounts.TryGetValue(indirectionTex.Id, out count)) { indirectionTextureUsageCounts.Add(indirectionTex.Id, 0); } else { indirectionTextureUsageCounts[indirectionTex.Id] = count + 1; } } material.Value.compile(); material.Value.load(); createdMaterials.Add(material.Value, new MaterialInfo(material.Value, indirectionTex)); return(material); }
public void Dispose() { var ogreSubsystem = engineResourceManager.getSubsystemResource("Ogre"); ogreSubsystem.removeResourceGroup("Internal"); engineResourceManager.initializeResources(); if (OgreConfig.SaveMicrocodeCache && GpuProgramManager.Instance.IsCacheDirty && MicrocodeCachePath != null) { try { using (Stream stream = File.Open(MicrocodeCachePath, System.IO.FileMode.Create, System.IO.FileAccess.ReadWrite, System.IO.FileShare.Read)) { GpuProgramManager.Instance.saveMicrocodeCache(stream); Log.Info("Saved microcode cache {0}", MicrocodeCachePath); } } catch (Exception ex) { Log.Error("{0} saving microcode cache {1}.\nReason:{2}", ex.GetType().Name, MicrocodeCachePath, ex.Message); } } OgreInterface_DestroyVaryingCompressedTextures(); GpuProgramManager.Instance.Dispose(); HighLevelGpuProgramManager.Instance.Dispose(); MaterialManager.getInstance().Dispose(); MeshManager.getInstance().Dispose(); SkeletonManager.getInstance().Dispose(); HardwareBufferManager.getInstance().Dispose(); TextureManager.getInstance().Dispose(); OgreDataStream.DisposeSharedPtrs(); destroyRendererWindow(primaryWindow); root.Dispose(); OgreInterface_UnloadRenderSystem(renderSystemPlugin); if (deviceLostListener != null) { deviceLostListener.Dispose(); } if (Disposed != null) { Disposed.Invoke(this); } }
public override void destroyMaterial(MaterialPtr materialPtr) { MaterialInfo info; if (createdMaterials.TryGetValue(materialPtr.Value, out info)) { int count = 0; if (info.IndirectionTexture != null && indirectionTextureUsageCounts.TryGetValue(info.IndirectionTexture.Id, out count)) { --count; if (count == 0) { virtualTextureManager.destroyIndirectionTexture(info.IndirectionTexture); indirectionTextureUsageCounts.Remove(info.IndirectionTexture.Id); } else { indirectionTextureUsageCounts[info.IndirectionTexture.Id] = count; } } PhysicalTexture physicalTexture; foreach (var technique in materialPtr.Value.Techniques) { foreach (var pass in technique.Passes) { foreach (var textureUnitState in pass.TextureUnitStates) { if (virtualTextureManager.tryGetPhysicalTexture(textureUnitState.Name, out physicalTexture)) { physicalTexture.removeTextureUnit(textureUnitState); } } } } createdMaterials.Remove(materialPtr.Value); MaterialManager.getInstance().remove(materialPtr.Value.Name); materialPtr.Dispose(); } }
public UnifiedMaterialBuilder(VirtualTextureManager virtualTextureManager, CompressedTextureSupport textureFormat, ResourceManager liveResourceManager) { PixelFormat otherFormat; PixelFormat normalFormat; NormaMapReadMode normalMapReadMode = NormaMapReadMode.RG; switch (textureFormat) { case CompressedTextureSupport.DXT_BC4_BC5: textureFormatExtension = ".dds"; normalTextureFormatExtension = "_bc5.dds"; normalMapReadMode = NormaMapReadMode.RG; createOpacityTexture = true; otherFormat = PixelFormat.PF_DXT5; normalFormat = PixelFormat.PF_BC5_UNORM; break; case CompressedTextureSupport.DXT: textureFormatExtension = ".dds"; normalTextureFormatExtension = ".dds"; normalMapReadMode = NormaMapReadMode.AG; createOpacityTexture = true; otherFormat = PixelFormat.PF_DXT5; normalFormat = PixelFormat.PF_DXT5; break; default: case CompressedTextureSupport.None: textureFormatExtension = PagedImage.FileExtension; normalTextureFormatExtension = PagedImage.FileExtension; normalMapReadMode = NormaMapReadMode.RG; createOpacityTexture = false; otherFormat = PixelFormat.PF_A8R8G8B8; normalFormat = PixelFormat.PF_A8R8G8B8; break; } this.virtualTextureManager = virtualTextureManager; if (OgreInterface.Instance.RenderSystem.isShaderProfileSupported("hlsl")) { shaderFactory = new HlslUnifiedShaderFactory(liveResourceManager, normalMapReadMode, createOpacityTexture); } else if (OgreInterface.Instance.RenderSystem.isShaderProfileSupported("glsl")) { shaderFactory = new GlslUnifiedShaderFactory(liveResourceManager, normalMapReadMode, createOpacityTexture); } else if (OgreInterface.Instance.RenderSystem.isShaderProfileSupported("glsles")) { shaderFactory = new GlslesUnifiedShaderFactory(liveResourceManager, normalMapReadMode, createOpacityTexture); } else { throw new OgreException("Cannot create Unified Material Builder, device must support shader profiles hlsl, glsl, or glsles."); } diffuseTexture = virtualTextureManager.createPhysicalTexture("Diffuse", otherFormat); normalTexture = virtualTextureManager.createPhysicalTexture("NormalMap", normalFormat); specularTexture = virtualTextureManager.createPhysicalTexture("Specular", otherFormat); if (createOpacityTexture) { opacityTexture = virtualTextureManager.createPhysicalTexture("Opacity", otherFormat); } specialMaterialFuncs.Add("EyeOuter", createEyeOuterMaterial); specialMaterialFuncs.Add("ColorVertex", createColorVertexMaterial); OgreResourceGroupManager.getInstance().createResourceGroup(GroupName); MaterialPtr hiddenMaterial = MaterialManager.getInstance().create("HiddenMaterial", GroupName, false, null); setupHiddenMaterialPass(hiddenMaterial.Value.getTechnique(0).getPass(0), false, false); createdMaterials.Add(hiddenMaterial.Value, new MaterialInfo(hiddenMaterial.Value, null)); builtInMaterials.Add(hiddenMaterial); //Delete stock resources MaterialManager.getInstance().remove("BaseWhite"); MaterialManager.getInstance().remove("BaseWhiteNoLighting"); MaterialManager.getInstance().remove("Ogre/Debug/AxesMat"); //Rebuild with our materials var baseWhite = createFromDescription(new MaterialDescription() { Name = "BaseWhite" }, false); builtInMaterials.Add(baseWhite); var baseWhiteNoLighting = createFromDescription(new MaterialDescription() { Name = "BaseWhiteNoLighting" }, false); builtInMaterials.Add(baseWhiteNoLighting); MaterialPtr axesMat = MaterialManager.getInstance().create("Ogre/Debug/AxesMat", GroupName, false, null); axesMat.Value.setLightingEnabled(false); axesMat.Value.setSceneBlending(SceneBlendType.SBT_TRANSPARENT_ALPHA); axesMat.Value.setCullingMode(CullingMode.CULL_NONE); axesMat.Value.setDepthWriteEnabled(false); axesMat.Value.setDepthCheckEnabled(false); builtInMaterials.Add(axesMat); createdMaterials.Add(axesMat.Value, new MaterialInfo(axesMat.Value, null)); }
public MaterialPtr clone(String newName, bool changeGroup, String newGroup) { MaterialManager matManager = MaterialManager.getInstance(); return(matManager.getObject(Material_cloneChangeGroup(resource, newName, changeGroup, newGroup, matManager.ProcessWrapperObjectCallback))); }
public MaterialPtr clone(String newName) { MaterialManager matManager = MaterialManager.getInstance(); return(matManager.getObject(Material_clone(resource, newName, matManager.ProcessWrapperObjectCallback))); }
public MaterialPtr getMaterial() { MaterialManager matManager = MaterialManager.getInstance(); return(matManager.getObject(SubEntity_getMaterial(subEntity, matManager.ProcessWrapperObjectCallback))); }