/// <summary> /// The dynamic texture update exclude /// </summary> /// <param name="dtexture">No more dynamic textures</param> public void RemoveDynamicTexture(IDynamicTexture dtexture) { if (this.dynamicTextures.Contains(dtexture)) { this.dynamicTextures.Remove(dtexture); } }
/// <summary> /// Called by code which actually renders the dynamic texture to supply texture data. /// </summary> /// <param name="updaterId"></param> /// <param name="texture"></param> public void ReturnData(UUID updaterId, IDynamicTexture texture) { DynamicTextureUpdater updater = null; if (Updaters.TryGetValue(updaterId, out updater)) { Scene scene; if (RegisteredScenes.TryGetValue(updater.SimUUID, out scene)) { UUID newTextureID = updater.DataReceived(texture.Data, scene); if (ReuseTextures && !updater.BlendWithOldTexture && texture.IsReuseable && (ReuseLowDataTextures || IsDataSizeReuseable(texture))) { m_reuseableDynamicTextures[GenerateReusableTextureKey(texture.InputCommands, texture.InputParams)] = newTextureID; } } } if (updater.UpdateTimer == 0) { Updaters.Remove(updater.UpdaterID); } }
/// <summary> /// Determines whether the texture is reuseable based on its data size. /// </summary> /// <remarks> /// This is a workaround for a viewer bug where very small data size textures relative to their pixel size /// are not redisplayed properly when pulled from cache. The calculation here is based on the typical discard /// level of 2, a 'rate' of 0.125 and 4 components (which makes for a factor of 0.5). /// </remarks> /// <returns></returns> private bool IsDataSizeReuseable(IDynamicTexture texture) { // Console.WriteLine("{0} {1}", texture.Size.Width, texture.Size.Height); int discardLevel2DataThreshold = (int)Math.Ceiling((texture.Size.Width >> 2) * (texture.Size.Height >> 2) * 0.5); // m_log.DebugFormat( // "[DYNAMIC TEXTURE MODULE]: Discard level 2 threshold {0}, texture data length {1}", // discardLevel2DataThreshold, texture.Data.Length); return(discardLevel2DataThreshold < texture.Data.Length); }
/// <summary> /// Called by code which actually renders the dynamic texture to supply texture data. /// </summary> /// <param name="updaterId"></param> /// <param name="texture"></param> public void ReturnData(UUID updaterId, IDynamicTexture texture) { DynamicTextureUpdater updater = null; lock (Updaters) { if (Updaters.ContainsKey(updaterId)) { updater = Updaters[updaterId]; } } if (updater != null) { if (RegisteredScenes.ContainsKey(updater.SimUUID)) { Scene scene = RegisteredScenes[updater.SimUUID]; UUID newTextureID = updater.DataReceived(texture.Data, scene); if (ReuseTextures && !updater.BlendWithOldTexture && texture.IsReuseable && (ReuseLowDataTextures || IsDataSizeReuseable(texture))) { m_reuseableDynamicTextures.Store( GenerateReusableTextureKey(texture.InputCommands, texture.InputParams), newTextureID); } } } if (updater.UpdateTimer == 0) { lock (Updaters) { if (!Updaters.ContainsKey(updater.UpdaterID)) { Updaters.Remove(updater.UpdaterID); } } } }
/// <summary> /// Called by code which actually renders the dynamic texture to supply texture data. /// </summary> /// <param name="updaterId"></param> /// <param name="texture"></param> public void ReturnData(UUID updaterId, IDynamicTexture texture) { DynamicTextureUpdater updater = null; if(Updaters.TryGetValue(updaterId, out updater)) { Scene scene; if (RegisteredScenes.TryGetValue(updater.SimUUID, out scene)) { UUID newTextureID = updater.DataReceived(texture.Data, scene); if (ReuseTextures && !updater.BlendWithOldTexture && texture.IsReuseable && (ReuseLowDataTextures || IsDataSizeReuseable(texture))) { m_reuseableDynamicTextures[GenerateReusableTextureKey(texture.InputCommands, texture.InputParams)] = newTextureID; } } } if (updater.UpdateTimer == 0) { Updaters.Remove(updater.UpdaterID); } }
/// <summary> /// Add dynamic texture update /// </summary> /// <param name="dtexture">Dynamic textures need to be updated</param> public void AddDynamicTexture(IDynamicTexture dtexture) { this.dynamicTextures.Add(dtexture); }
protected override void OnLoad(EventArgs e) { base.OnLoad(e); WorldSpace.AddDrawableGroup(new ControllerDrawableGroup(1, "Controller", RenderContext)); KeyPreview = true; KinectDeviceManager dev = null; //BasicGrid grid=new BasicGrid(); //grid.Load(RenderContext); Controller = new TransformController(RenderContext, ScreenContext.HitChekcer); WorldSpace.AddResource(Controller, "Controller"); //if (!String.IsNullOrEmpty(Settings.Default.InitLoadModel)) //{ // MMDModel model = MMDModelWithPhysics.OpenLoad(Settings.Default.InitLoadModel, RenderContext); // WorldSpace.AddResource(model); // if (!String.IsNullOrEmpty(Settings.Default.InitLoadMotion)) // { // model.MotionManager.ApplyMotion(model.MotionManager.AddMotionFromFile(Settings.Default.InitLoadMotion, false)); // } //} //更新する必要のあるワールドスペースは、UpdateRequireWorldsに追加しなけれbなりません。 //PlaneBoard bill = new PlaneBoard(RenderContext, resourceView, new Vector2(800, 800)); //WorldSpace.AddResource(bill); //bill.Transformer.Position = new Vector3(0, 0, 20); #region Kinectテストコード #if KINECT OpenNIManager.Initialize(); dev = OpenNIManager.getDevice(); ColTexture = new ColorTexture(RenderContext, dev); tex2 = new DepthTexture(RenderContext, 1000, dev); #endif #endregion //format = SpriteBatch.CreateTextformat("Meiriyo", 30, FontWeight.ExtraBold); //brush = SpriteBatch.CreateRadialGradientBrush(g, // new RadialGradientBrushProperties() {CenterPoint = new PointF(100,100),GradientOriginOffset = new PointF(0,0),HorizontalRadius = 100f,VerticalRadius = 200f}).Brush; //brush = SpriteBatch.CreateSolidColorBrush(Color.Aquamarine); ScreenContext.CameraMotionProvider = new BasicCameraControllerMotionProvider(this, this); BasicGrid gird = new BasicGrid(); gird.Visibility = true; gird.Load(RenderContext); ScreenContext.WorldSpace.AddResource(gird); //textureの世界には、childウィンドウに追加からできるようにしてあります。 ControlForm controlForm = new ControlForm(RenderContext, ScreenContext, null, dev); controlForm.Show(this); //OpenFileDialog ofd = new OpenFileDialog(); //if (ofd.ShowDialog() == DialogResult.OK) //{ // VMDCameraMotionProvider camMotion=VMDCameraMotionProvider.OpenFile(ofd.FileName); // ScreenContext.CameraMotionProvider = camMotion; // camMotion.Start(); //} #region Kinectテストコード #if KINECT PlaneBoard bill = new PlaneBoard(RenderContext, ColTexture.TextureResourceView); bill.Transformer.Position = new Vector3(0, 0, 50); //bill.Transformer.Rotation *= Quaternion.RotationAxis(new Vector3(0,1,0),(float) (Math.PI)); form.WorldSpace.AddResource(bill); form.WorldSpace.AddDynamicTexture(ColTexture); #endif #endregion }