///////////////////////////////////////// Component_Image DynamicTexture_GetFree(DynamicTextureType type, Component_Image.TypeEnum imageType, Vector2I size, PixelFormat format, int fsaaLevel, bool mipmaps, int arrayLayers, bool createSimple3DRenderer, bool createCanvasRenderer) { //var item = renderTargetsFree.Find( i => i.type == type && i.size == size && i.format == format && i.fsaaLevel == fsaaLevel ); DynamicTextureItem item = null; foreach (var i in dynamicTexturesFree) { if (i.type == type && i.imageType == imageType && i.size == size && i.format == format && i.fsaaLevel == fsaaLevel && i.mipmaps == mipmaps && i.arrayLayers == arrayLayers && i.createSimple3DRenderer == createSimple3DRenderer && i.createCanvasRenderer == createCanvasRenderer) { item = i; break; } } if (item != null) { dynamicTexturesFree.Remove(item); item.usedLastUpdate = true; return(item.image); } return(null); }
public Component_Image DynamicTexture_Alloc(DynamicTextureType type, Component_Image.TypeEnum imageType, Vector2I size, PixelFormat format, int fsaaLevel, bool mipmaps, int arrayLayers = 1, bool createSimple3DRenderer = false, bool createCanvasRenderer = false) { if (type == DynamicTextureType.RenderTarget) { UpdateStatisticsCurrent.RenderTargets++; } else { UpdateStatisticsCurrent.DynamicTextures++; } //find free { var target = DynamicTexture_GetFree(type, imageType, size, format, fsaaLevel, mipmaps, arrayLayers, createSimple3DRenderer, createCanvasRenderer); if (target != null) { return(target); } } //!!!!need hierarchy controller? Component_Image texture = ComponentUtility.CreateComponent <Component_Image>(null, true, false); texture.CreateType = imageType; texture.CreateSize = size; texture.CreateMipmaps = mipmaps; texture.CreateArrayLayers = arrayLayers; texture.CreateFormat = format; if (type == DynamicTextureType.DynamicTexture) { texture.CreateUsage = Component_Image.Usages.Dynamic | Component_Image.Usages.WriteOnly; } else { texture.CreateUsage = Component_Image.Usages.RenderTarget; } texture.CreateFSAA = fsaaLevel; texture.Enabled = true; //!!!!!как проверять ошибки создания текстур? везде так //if( texture == null ) //{ // //!!!!! // Log.Fatal( "ViewportRenderingPipeline: RenderTarget_Alloc: Unable to create texture." ); // return null; //} int faces = imageType == Component_Image.TypeEnum.Cube ? 6 : arrayLayers; int numMips; if (mipmaps) { int max = size.MaxComponent(); float kInvLogNat2 = 1.4426950408889634073599246810019f; numMips = 1 + (int)(Math.Log(size.MaxComponent()) * kInvLogNat2); } else { numMips = 1; } if (type == DynamicTextureType.RenderTarget) { for (int face = 0; face < faces; face++) { for (int mip = 0; mip < numMips; mip++) { RenderTexture renderTexture = texture.Result.GetRenderTarget(mip, face); var viewport = renderTexture.AddViewport(createSimple3DRenderer, createCanvasRenderer); viewport.RenderingPipelineCreate(); viewport.RenderingPipelineCreated.UseRenderTargets = false; } //!!!!что-то еще? } } //Log.Info( "alloc: " + type.ToString() + " " + size.ToString() ); //add to list of allocated var item = new DynamicTextureItem(); item.type = type; item.imageType = imageType; item.size = size; item.format = format; item.fsaaLevel = fsaaLevel; item.mipmaps = mipmaps; //item.num_mipmaps = num_mipmaps; item.arrayLayers = arrayLayers; item.createSimple3DRenderer = createSimple3DRenderer; item.createCanvasRenderer = createCanvasRenderer; item.image = texture; dynamicTexturesAllocated.Add(item); item.usedLastUpdate = true; return(texture); }