///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public static Resource.Instance CreateResource(ResourceType resourceType, Resource.InstanceType instanceType, string name, bool wait, Metadata.TypeInfo createResultObjectWithType, bool componentCreateHierarchyController, bool?componentSetEnabled, out string error) { //!!!! if (!wait) { Log.Fatal("ResourceManager: CreateResource: wait == false. Background loading is not implemented."); } error = ""; //!!!!!threading if (string.IsNullOrEmpty(name)) { Log.Fatal("ResourceManager: CreateResource: The name can't be empty."); return(null); } Resource res; Resource.Instance ins; bool insCreated = false; lock ( lockObject ) { //get or create resource res = GetByName(name); if (res == null) { //!!!!override loader ConstructorInfo constructor = resourceType.resourceClass.GetConstructor(new Type[0]); res = (Resource)constructor.Invoke(new object[0]); res.resourceType = resourceType; res.name = name; res.loadFromFile = true; //add to the list resources.Add(GetKey(name), res); } //create instance if (instanceType == Resource.InstanceType.Resource) { //as Resource if (res.PrimaryInstance == null) { ins = res.CreateInstanceClassObject(instanceType, componentCreateHierarchyController, componentSetEnabled); res.PrimaryInstance = ins; insCreated = true; } else { ins = res.PrimaryInstance; } } else { //as Separate instance ins = res.CreateInstanceClassObject(instanceType, componentCreateHierarchyController, componentSetEnabled); insCreated = true; } } if (insCreated) { if (createResultObjectWithType != null) { object obj = createResultObjectWithType.InvokeInstance(null); var component = obj as Component; if (component != null) { if (componentSetEnabled != null) { component.Enabled = componentSetEnabled.Value; } if (componentCreateHierarchyController) { ComponentUtility.CreateHierarchyControllerForRootComponent(component, ins, true); //, true ); } } ins.ResultObject = obj; } //resource is ready ins.Status = Resource.Instance.StatusEnum.Ready; } ////_Load function //if( insCreated ) //{ // //load // if( wait ) // { // LoadTaskFunction( ins ); // } // else // { // Task task = new Task( LoadTaskFunction, ins ); // task.Start(); // } //} //wait if (wait) { //wait end of creation while (ins.Status == Resource.Instance.StatusEnum.CreationProcess) { //!!!!slow? maybe we can increase priority for this instance or something like this? if (VirtualFileSystem.MainThread == Thread.CurrentThread) { //process main thread tasks EngineThreading.ExecuteQueuedActionsFromMainThread(); } //!!!!? Thread.Sleep(0); } } //!!!!так? if (wait && ins.Status == Resource.Instance.StatusEnum.Error) { error = ins.StatusError; ins.Dispose(); return(null); } return(ins); }
protected virtual void Load() { //override behavior by event if (ResultObject == null) { bool handled = false; LoadOverride?.Invoke(this, ref handled); if (handled) { return; } } //default behavior if (ResultObject == null) { //load block if (Owner.LoadedBlock == null) { string error; Owner.LoadedBlock = TextBlockUtility.LoadFromVirtualFile(Owner.Name, out error); if (Owner.LoadedBlock == null) { //!!!! // comment this fatal ! //Log.Fatal( error ); //TODO: also we can use exceptions! //throw new Exception( error ); StatusError = error; Status = StatusEnum.Error; return; } } //parse text block string error2; var component = ComponentUtility.LoadComponentFromTextBlock(null, Owner.LoadedBlock, Owner.Name, this, componentSetEnabled, componentCreateHierarchyController, out error2); //var component = ComponentUtils.LoadComponentFromTextBlock( Owner.LoadedBlock, Owner.Name, null, out error2 ); if (component == null) { ////!!!!!!! //Log.Fatal( "impl" ); //!!!!! StatusError = error2; Status = StatusEnum.Error; return; } //!!!! //if( componentSetEnabled != null ) // component.Enabled = componentSetEnabled.Value; //xx xx; //xx xx;//сначала выключить иерархию? потом всем разом включится? ////!!!!возможно это раньше нужно делать, т.к. в GetProvidedType() что-то там надо //if( componentCreateHierarchyController ) // ComponentUtils.CreateHierarchyControllerForRootComponent( component, this, true );//, true ); //resource is ready //ResultObject = component; Status = StatusEnum.Ready; } }
protected override void OnRenderUI(CanvasRenderer renderer) { base.OnRenderUI(renderer); Vector2I size = GetNeededSize(); if (browser == null) { CreateBrowser(); } //update brower engine and texture if (browser != null) { if (viewSize != size /*&& !browser.IsResizing */) { var oldSize = viewSize; viewSize = size; OnResized(oldSize, viewSize); } //create texture if (texture == null || textureSize != size || needRecreateTexture) { if (texture != null) { texture.Dispose(); texture = null; } textureSize = size; bool mipmaps = false; //!!!! //if( ControlManager != null && ControlManager is UI3DControlContainer ) // mipmaps = renderingIn3DMipmaps; var usage = Component_Image.Usages.WriteOnly; if (mipmaps) { usage |= Component_Image.Usages.AutoMipmaps; } texture = ComponentUtility.CreateComponent <Component_Image>(null, true, false); texture.CreateType = Component_Image.TypeEnum._2D; texture.CreateSize = textureSize; texture.CreateMipmaps = mipmaps; // ? -1 : 0; texture.CreateFormat = PixelFormat.A8R8G8B8; texture.CreateUsage = usage; texture.Enabled = true; //Log.Info( textureSize.ToString() ); //if( mipmaps ) //{ // texture = TextureManager.Instance.Create( textureName, Texture.Type.Type2D, textureSize, // 1, -1, PixelFormat.A8R8G8B8, Texture.Usage.DynamicWriteOnlyDiscardable | Texture.Usage.AutoMipmap ); //} //else //{ // texture = TextureManager.Instance.Create( textureName, Texture.Type.Type2D, textureSize, // 1, 0, PixelFormat.A8R8G8B8, Texture.Usage.DynamicWriteOnlyDiscardable ); //} needUpdateTexture = true; needRecreateTexture = false; } if (needInvalidate) { browserHost.SetZoomLevel(Zoom); browserHost.Invalidate(new CefRectangle(0, 0, 100000, 100000), CefPaintElementType.View); needInvalidate = false; } //update texture if (/*browser.IsDirty ||*/ needUpdateTexture) { if (texture != null) { UpdateTexture(); } needUpdateTexture = false; } } //draw texture { //bool backColorZero = BackColor == new ColorValue( 0, 0, 0, 0 ); //ColorValue color = new ColorValue( 1, 1, 1 ); ////ColorValue color = backColorZero ? new ColorValue( 1, 1, 1 ) : BackColor; //if( texture == null ) // color = new ColorValue( 0, 0, 0, color.Alpha ); //color *= GetTotalColorMultiplier(); //var color = GetTotalColorMultiplier(); //if( color.Alpha > 0 ) //{ var color = new ColorValue(1, 1, 1); //color.Saturate(); GetScreenRectangle(out var rect); Component_Image tex = null; if (renderBuffer != null && renderBufferForSize == ViewSize && renderBuffer.Length == ViewSize.X * ViewSize.Y * 4) { tex = texture; } if (tex == null) { tex = ResourceUtility.WhiteTexture2D; } if (renderer.IsScreen) //&& !renderer._OutGeometryTransformEnabled ) { ////screen per pixel accuracy Vector2 viewportSize = renderer.ViewportForScreenCanvasRenderer.SizeInPixels.ToVector2F(); var v = size.ToVector2() / viewportSize; Rectangle fixedRect = new Rectangle(rect.LeftTop, rect.LeftTop + v); //Vec2 leftTop = rect.LeftTop; //leftTop *= viewportSize; //leftTop = new Vec2( (int)( leftTop.X + .9999f ), (int)( leftTop.Y + .9999f ) ); ////!!!!! ////if( RenderSystem.Instance.IsDirect3D() ) //// leftTop -= new Vec2( .5f, .5f ); //leftTop /= viewportSize; //Vec2 rightBottom = rect.RightBottom; //rightBottom *= viewportSize; //rightBottom = new Vec2( (int)( rightBottom.X + .9999f ), (int)( rightBottom.Y + .9999f ) ); ////!!!!! ////if( RenderSystem.Instance.IsDirect3D() ) //// rightBottom -= new Vec2( .5f, .5f ); //rightBottom /= viewportSize; //Rect fixedRect = new Rect( leftTop, rightBottom ); renderer.PushTextureFilteringMode(CanvasRenderer.TextureFilteringMode.Point); renderer.AddQuad(fixedRect, new Rectangle(0, 0, 1, 1), tex, color, true); renderer.PopTextureFilteringMode(); } else { renderer.AddQuad(rect, new Rectangle(0, 0, 1, 1), tex, color, true); } //} } if (!IsSupportedByThisPlatform()) { var text = string.Format("UIWebBrowser: {0} is not supported.", SystemSettings.CurrentPlatform); var center = GetScreenRectangle().GetCenter(); renderer.AddText(text, center, EHorizontalAlignment.Center, EVerticalAlignment.Center, new ColorValue(1, 0, 0)); } }
public void UpdateCaptureCubemap() { if (Mode.Value != ModeEnum.Capture) { return; } Component_Image texture = null; Component_Image textureRead = null; try { //create var resolution = Resolution.Value; var hdr = HDR.Value; var size = int.Parse(resolution.ToString().Replace("_", "")); //!!!!16 бит достаточно, тогда нужно поддержку для Image2D PixelFormat format = hdr ? PixelFormat.Float32RGBA : PixelFormat.A8R8G8B8; //PixelFormat format = hdr ? PixelFormat.Float16RGBA : PixelFormat.A8R8G8B8; texture = ComponentUtility.CreateComponent <Component_Image>(null, true, false); texture.CreateType = Component_Image.TypeEnum._2D; texture.CreateSize = new Vector2I(size, size); texture.CreateMipmaps = false; texture.CreateFormat = format; texture.CreateUsage = Component_Image.Usages.RenderTarget; texture.CreateFSAA = 0; texture.Enabled = true; var renderTexture = texture.Result.GetRenderTarget(0, 0); //!!!! var viewport = renderTexture.AddViewport(true, false); //var viewport = renderTexture.AddViewport( false, false ); viewport.Mode = Viewport.ModeEnum.ReflectionProbeCubemap; viewport.AttachedScene = ParentScene; textureRead = ComponentUtility.CreateComponent <Component_Image>(null, true, false); textureRead.CreateType = Component_Image.TypeEnum._2D; textureRead.CreateSize = new Vector2I(size, size); textureRead.CreateMipmaps = false; textureRead.CreateFormat = format; textureRead.CreateUsage = Component_Image.Usages.ReadBack | Component_Image.Usages.BlitDestination; textureRead.CreateFSAA = 0; textureRead.Enabled = true; //!!!! textureRead.Result.PrepareNativeObject(); //render var image2D = new ImageUtility.Image2D(PixelFormat.Float32RGB, new Vector2I(size * 4, size * 3)); var position = Transform.Value.Position; for (int face = 0; face < 6; face++) { Vector3 dir = Vector3.Zero; Vector3 up = Vector3.Zero; //flipped switch (face) { case 0: dir = -Vector3.YAxis; up = Vector3.ZAxis; break; case 1: dir = Vector3.YAxis; up = Vector3.ZAxis; break; case 2: dir = Vector3.ZAxis; up = -Vector3.XAxis; break; case 3: dir = -Vector3.ZAxis; up = Vector3.XAxis; break; case 4: dir = Vector3.XAxis; up = Vector3.ZAxis; break; case 5: dir = -Vector3.XAxis; up = Vector3.ZAxis; break; } //!!!!renderingPipelineOverride var cameraSettings = new Viewport.CameraSettingsClass(viewport, 1, 90, NearClipPlane.Value, FarClipPlane.Value, position, dir, up, ProjectionType.Perspective, 1, 1, 1); viewport.Update(true, cameraSettings); //clear temp data viewport.RenderingContext.MultiRenderTarget_DestroyAll(); viewport.RenderingContext.DynamicTexture_DestroyAll(); texture.Result.GetRealObject(true).BlitTo(viewport.RenderingContext.CurrentViewNumber, textureRead.Result.GetRealObject(true), 0, 0); //get data var totalBytes = PixelFormatUtility.GetNumElemBytes(format) * size * size; var data = new byte[totalBytes]; unsafe { fixed(byte *pBytes = data) { var demandedFrame = textureRead.Result.GetRealObject(true).Read((IntPtr)pBytes, 0); while (RenderingSystem.CallBgfxFrame() < demandedFrame) { } } } Vector2I index = Vector2I.Zero; switch (face) { case 1: index = new Vector2I(2, 1); break; case 0: index = new Vector2I(0, 1); break; case 2: index = new Vector2I(1, 0); break; case 3: index = new Vector2I(1, 2); break; case 4: index = new Vector2I(1, 1); break; case 5: index = new Vector2I(3, 1); break; } //switch( face ) //{ //case 0: index = new Vector2I( 2, 1 ); break; //case 1: index = new Vector2I( 0, 1 ); break; //case 2: index = new Vector2I( 1, 0 ); break; //case 3: index = new Vector2I( 1, 2 ); break; //case 4: index = new Vector2I( 1, 1 ); break; //case 5: index = new Vector2I( 3, 1 ); break; //} var faceImage = new ImageUtility.Image2D(format, new Vector2I(size, size), data); //flip by X var faceImageFlip = new ImageUtility.Image2D(format, new Vector2I(size, size)); for (int y = 0; y < size; y++) { for (int x = 0; x < size; x++) { var pixel = faceImage.GetPixel(new Vector2I(x, y)); faceImageFlip.SetPixel(new Vector2I(size - 1 - x, y), pixel); } } image2D.Blit(index * size, faceImageFlip); } //reset alpha channel for (int y = 0; y < image2D.Size.Y; y++) { for (int x = 0; x < image2D.Size.X; x++) { var pixel = image2D.GetPixel(new Vector2I(x, y)); pixel.W = 1.0f; image2D.SetPixel(new Vector2I(x, y), pixel); } } var destRealFileName = VirtualPathUtility.GetRealPathByVirtual(GetDestVirtualFileName()); if (!Directory.Exists(Path.GetDirectoryName(destRealFileName))) { Directory.CreateDirectory(Path.GetDirectoryName(destRealFileName)); } if (!ImageUtility.Save(destRealFileName, image2D.Data, image2D.Size, 1, image2D.Format, 1, 0, out var error)) { throw new Exception(error); } } catch (Exception e) { Log.Error(e.Message); } finally { texture?.Dispose(); textureRead?.Dispose(); } processedCubemapNeedUpdate = true; }
public Component_Image GetImage(out long uniqueMaskDataCounter) { uniqueMaskDataCounter = 0; if (MaskImage.Value != null) { return(MaskImage); } else if (Mask.Value != null && Mask.Value.Length != 0) { if (EnabledInHierarchy) { if (createdMaskImage == null) { int textureSize = (int)Math.Sqrt(Mask.Value.Length); //need set ShowInEditor = false before AddComponent var texture = ComponentUtility.CreateComponent <Component_Image>(null, false, false); texture.DisplayInEditor = false; AddComponent(texture, -1); //var texture = CreateComponent<Component_Image>( enabled: false ); texture.SaveSupport = false; texture.CloneSupport = false; //!!!! bool mipmaps = false; texture.CreateType = Component_Image.TypeEnum._2D; texture.CreateSize = new Vector2I(textureSize, textureSize); texture.CreateMipmaps = mipmaps; texture.CreateFormat = PixelFormat.L8; var usage = Component_Image.Usages.WriteOnly; if (mipmaps) { usage |= Component_Image.Usages.AutoMipmaps; } texture.CreateUsage = usage; texture.Enabled = true; createdMaskImage = texture; createdMaskImageNeedUpdate = true; } //update data if (createdMaskImageNeedUpdate) { GpuTexture gpuTexture = createdMaskImage.Result; if (gpuTexture != null) { var d = new GpuTexture.SurfaceData[] { new GpuTexture.SurfaceData(0, 0, Mask.Value) }; gpuTexture.SetData(d); } createdMaskImageNeedUpdate = false; } uniqueMaskDataCounter = this.uniqueMaskDataCounter; return(createdMaskImage); } } 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); }
///////////////////////////////////////// public void CreateDefaultFlares() { Component_LensFlare flare; flare = CreateComponent <Component_LensFlare>(); flare.Name = ComponentUtility.GetNewObjectUniqueName(flare); flare.Image = ReferenceUtility.MakeReference(@"Samples\Starter Content\Textures\Lens flares\hexangle.png"); flare.Color = new ColorValue(1, 0.4980392f, 0.4980392f, 0.05882353f); flare.Size = new Vector2(0.05f, 0.05f); flare.Position = -0.1f; flare = CreateComponent <Component_LensFlare>(); flare.Name = ComponentUtility.GetNewObjectUniqueName(flare); flare.Image = ReferenceUtility.MakeReference(@"Samples\Starter Content\Textures\Lens flares\hexangle.png"); flare.Color = new ColorValue(0.4980392f, 1, 0.4980392f, 0.05882353f); flare.Size = new Vector2(0.05f, 0.05f); flare.Position = -2; flare = CreateComponent <Component_LensFlare>(); flare.Name = ComponentUtility.GetNewObjectUniqueName(flare); flare.Image = ReferenceUtility.MakeReference(@"Samples\Starter Content\Textures\Lens flares\hexangle.png"); flare.Color = new ColorValue(1, 1, 1, 0.05882353f); flare.Size = new Vector2(0.08f, 0.08f); flare.Position = -1.5f; flare = CreateComponent <Component_LensFlare>(); flare.Name = ComponentUtility.GetNewObjectUniqueName(flare); flare.Image = ReferenceUtility.MakeReference(@"Samples\Starter Content\Textures\Lens flares\hexangle.png"); flare.Color = new ColorValue(1, 1, 1, 0.05882353f); flare.Size = new Vector2(0.1f, 0.1f); flare.Position = -1.7f; flare = CreateComponent <Component_LensFlare>(); flare.Name = ComponentUtility.GetNewObjectUniqueName(flare); flare.Image = ReferenceUtility.MakeReference(@"Samples\Starter Content\Textures\Lens flares\hexangle.png"); flare.Color = new ColorValue(1, 0.4980392f, 0.4980392f, 0.05882353f); flare.Size = new Vector2(0.06f, 0.06f); flare.Position = -3; flare = CreateComponent <Component_LensFlare>(); flare.Name = ComponentUtility.GetNewObjectUniqueName(flare); flare.Image = ReferenceUtility.MakeReference(@"Samples\Starter Content\Textures\Lens flares\hexangle.png"); flare.Color = new ColorValue(1, 1, 0.4980392f, 0.05882353f); flare.Size = new Vector2(0.05f, 0.05f); flare.Position = -.5f; flare = CreateComponent <Component_LensFlare>(); flare.Name = ComponentUtility.GetNewObjectUniqueName(flare); flare.Image = ReferenceUtility.MakeReference(@"Samples\Starter Content\Textures\Lens flares\hexangle.png"); flare.Color = new ColorValue(1, 1, 1, 0.05882353f); flare.Size = new Vector2(0.09f, 0.09f); flare.Position = -2.1f; flare = CreateComponent <Component_LensFlare>(); flare.Name = ComponentUtility.GetNewObjectUniqueName(flare); flare.Image = ReferenceUtility.MakeReference(@"Samples\Starter Content\Textures\Lens flares\hexangle.png"); flare.Color = new ColorValue(1, 1, 1, 0.05882353f); flare.Size = new Vector2(0.08f, 0.08f); flare.Position = -.65f; flare = CreateComponent <Component_LensFlare>(); flare.Name = ComponentUtility.GetNewObjectUniqueName(flare); flare.Image = ReferenceUtility.MakeReference(@"Samples\Starter Content\Textures\Lens flares\hexangle.png"); flare.Color = new ColorValue(0.4980392f, 1, 0.4980392f, 0.05882353f); flare.Size = new Vector2(0.05f, 0.05f); flare.Position = -.86f; flare = CreateComponent <Component_LensFlare>(); flare.Name = ComponentUtility.GetNewObjectUniqueName(flare); flare.Image = ReferenceUtility.MakeReference(@"Samples\Starter Content\Textures\Lens flares\hexangle.png"); flare.Color = new ColorValue(1, 1, 1, 0.05882353f); flare.Size = new Vector2(0.12f, 0.12f); flare.Position = -5; flare = CreateComponent <Component_LensFlare>(); flare.Name = ComponentUtility.GetNewObjectUniqueName(flare); flare.Image = ReferenceUtility.MakeReference(@"Samples\Starter Content\Textures\Lens flares\hexangle.png"); flare.Color = new ColorValue(1, 1, 1, 0.05882353f); flare.Size = new Vector2(0.04f, 0.04f); flare.Position = .3f; flare = CreateComponent <Component_LensFlare>(); flare.Name = ComponentUtility.GetNewObjectUniqueName(flare); flare.Image = ReferenceUtility.MakeReference(@"Samples\Starter Content\Textures\Lens flares\hexangle.png"); flare.Color = new ColorValue(0.4980392f, 1, 0.4980392f, 0.05882353f); flare.Size = new Vector2(0.03f, 0.03f); flare.Position = .6f; flare = CreateComponent <Component_LensFlare>(); flare.Name = ComponentUtility.GetNewObjectUniqueName(flare); flare.Image = ReferenceUtility.MakeReference(@"Samples\Starter Content\Textures\Lens flares\hexangle.png"); flare.Color = new ColorValue(1, 1, 1, 0.05882353f); flare.Size = new Vector2(0.06f, 0.06f); flare.Position = .1f; flare = CreateComponent <Component_LensFlare>(); flare.Name = ComponentUtility.GetNewObjectUniqueName(flare); flare.Image = ReferenceUtility.MakeReference(@"Samples\Starter Content\Textures\Lens flares\hexangle.png"); flare.Color = new ColorValue(1, 1, 1, 0.05882353f); flare.Size = new Vector2(0.04f, 0.04f); flare.Position = -.35f; }