private static GenericObject DefineAnimation_2Anims_31Secs() { // Define animation parameters / objects GenericObject genObject = new GenericObject(NamedOrGenericKey.Empty); // Define animation sequence // Same as above, just with a wait-finished event here (dynamic wait step) genObject.BuildAnimationSequence() .Move3DTo(new Vector3(6f, 0f, 0f), new MovementSpeed(0.3f)) // 20,0 Secs .Scale3DTo(new Vector3(2f, 2f, 2f), TimeSpan.FromSeconds(2.0)) // 02,0 Secs .WaitFinished() .Move3DTo(new Vector3(9f, 0f, 0f), new MovementSpeed(0.3f)) // 10,0 Secs .RotateEulerAnglesBy(new Vector3(2f, 0f, 0f), TimeSpan.FromSeconds(12.0)) // 12,0 Secs .WaitFinished() .Apply(); genObject.BuildAnimationSequence() .Move3DTo(new Vector3(10f, 0f, 0f), new MovementSpeed(0.4f)) // 25,0 Secs .Scale3DTo(new Vector3(2f, 2f, 2f), TimeSpan.FromSeconds(30.0)) // 30,0 Secs .WaitFinished() .Move3DTo(new Vector3(11f, 0f, 0f), new MovementSpeed(0.4f)) // 2,5 Secs .RotateEulerAnglesBy(new Vector3(2f, 0f, 0f), TimeSpan.FromSeconds(1.0)) // 1,0 Secs .WaitFinished() .ApplyAsSecondary(); return(genObject); }
public void Test_EventDriven_SimpleAnimation_8() { // Define animation parameters / objects GenericObject genObject = new GenericObject(NamedOrGenericKey.Empty); // Define animation sequence // Same as above, just with a wait-finished event here (dynamic wait step) genObject.BuildAnimationSequence() .Move3DTo(new Vector3(6f, 0f, 0f), new MovementSpeed(0.3f)) // 20,0 Secs .Scale3DTo(new Vector3(2f, 2f, 2f), TimeSpan.FromSeconds(2.0)) // 02,0 Secs .WaitFinished() .Move3DTo(new Vector3(9f, 0f, 0f), new MovementSpeed(0.3f)) // 10,0 Secs .RotateEulerAnglesBy(new Vector3(2f, 0f, 0f), TimeSpan.FromSeconds(12.0)) // 12,0 Secs .WaitFinished() .Apply(); genObject.BuildAnimationSequence() .Move3DTo(new Vector3(10f, 0f, 0f), new MovementSpeed(0.4f)) // 25,0 Secs .Scale3DTo(new Vector3(2f, 2f, 2f), TimeSpan.FromSeconds(30.0)) // 30,0 Secs .WaitFinished() .Move3DTo(new Vector3(11f, 0f, 0f), new MovementSpeed(0.4f)) // 2,5 Secs .RotateEulerAnglesBy(new Vector3(2f, 0f, 0f), TimeSpan.FromSeconds(1.0)) // 1,0 Secs .WaitFinished() .ApplyAsSecondary(); // Perform animation in an event-driven way EventDrivenPassInfo passInfo = genObject.AnimationHandler.CalculateEventDriven(); // Check results Assert.True(passInfo.CountSteps == 4); Assert.True(passInfo.Steps[0].UpdateTime == TimeSpan.FromSeconds(20.0)); Assert.True(passInfo.Steps[1].UpdateTime == TimeSpan.FromSeconds(10.0)); Assert.True(passInfo.Steps[2].UpdateTime == TimeSpan.FromSeconds(2.0)); Assert.True(passInfo.Steps[3].UpdateTime == TimeSpan.FromSeconds(0.5)); Assert.True(Math.Round(passInfo.TotalTime.TotalSeconds, 1) == 32.5); }
/// <summary> /// Builds the demo scene. /// </summary> /// <param name="manipulator">Current scene manipulator object.</param> /// <param name="sideLength">The side length of the pallet cube.</param> /// <param name="camera">The camera to be manipulated too.</param> private static void BuildPalletCubes(SceneManipulator manipulator, NamedOrGenericKey[] resPalletGeometrys, int sideLength) { // Build the scene Vector3 startPosition = new Vector3(-sideLength * SPACE_X / 2f, 0f, -sideLength * SPACE_Z / 2f); Random randomizer = new Random(Environment.TickCount); for (int loopX = 0; loopX < sideLength; loopX++) { for (int loopY = 0; loopY < sideLength; loopY++) { for (int loopZ = 0; loopZ < sideLength; loopZ++) { GenericObject palletObject = new GenericObject( resPalletGeometrys[randomizer.Next(0, resPalletGeometrys.Length)], new Vector3(loopX * SPACE_X, loopY * SPACE_Y, loopZ * SPACE_Z) + startPosition); palletObject.Color = POSSIBLE_COLORS[randomizer.Next(0, POSSIBLE_COLORS.Length)]; palletObject.EnableShaderGeneratedBorder(); manipulator.Add(palletObject); // Define animation palletObject.BuildAnimationSequence() .Delay(randomizer.Next(100, 1000)) .Apply(); palletObject.BuildAnimationSequence() .Scale3DTo(0.5f, TimeSpan.FromSeconds(2.0)) .WaitFinished() .Scale3DTo(1f, TimeSpan.FromSeconds(2.0)) .ApplyAndRewind(); } } } }
public void Test_EventDriven_SimpleAnimation_7() { // Define animation parameters / objects GenericObject genObject = new GenericObject(NamedOrGenericKey.Empty); // Define animation sequence // Same as above, just with a wait-finished event here (dynamic wait step) genObject.BuildAnimationSequence() .Move3DBy(new Vector3(5f, 0f, 0f), TimeSpan.FromMilliseconds(500.0)) .Scale3DTo(new Vector3(2f, 2f, 2f), TimeSpan.FromMilliseconds(1750.0)) .WaitFinished() .RotateEulerAnglesBy(new Vector3(2f, 0f, 0f), TimeSpan.FromMilliseconds(500.0)) .WaitFinished() .Apply(); genObject.BuildAnimationSequence() .Move3DBy(new Vector3(5f, 0f, 0f), TimeSpan.FromMilliseconds(400.0)) .Scale3DTo(new Vector3(2f, 2f, 2f), TimeSpan.FromMilliseconds(1850.0)) .WaitFinished() .RotateEulerAnglesBy(new Vector3(2f, 0f, 0f), TimeSpan.FromMilliseconds(300.0)) .WaitFinished() .ApplyAsSecondary(); // Perform animation in an event-driven way EventDrivenPassInfo passInfo = genObject.AnimationHandler.CalculateEventDriven(); // Check results Assert.True(passInfo.CountSteps == 4); Assert.True(passInfo.Steps[0].UpdateTime == TimeSpan.FromMilliseconds(1750.0)); Assert.True(passInfo.Steps[1].UpdateTime == TimeSpan.FromMilliseconds(100.0)); Assert.True(passInfo.Steps[2].UpdateTime == TimeSpan.FromMilliseconds(300.0)); Assert.True(passInfo.Steps[3].UpdateTime == TimeSpan.FromMilliseconds(100.0)); }
private async void OnMainWindow_Loaded(object sender, RoutedEventArgs e) { CtrlRenderPanel.RenderLoop.ClearColor = Color4.CornflowerBlue; // Build scene graph await CtrlRenderPanel.Scene.ManipulateSceneAsync((manipulator) => { // Create pallet geometry resource PalletType pType = new PalletType(); pType.ContentColor = Color4.GreenColor; var resPalletGeometry = manipulator.AddResource <GeometryResource>( () => new GeometryResource(pType)); // Create pallet object GenericObject palletObject = manipulator.AddGeneric(resPalletGeometry); palletObject.Color = Color4.GreenColor; palletObject.EnableShaderGeneratedBorder(); palletObject.BuildAnimationSequence() .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_180DEG, EngineMath.RAD_45DEG), TimeSpan.FromSeconds(2.0)) .WaitFinished() .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_360DEG, EngineMath.RAD_45DEG), TimeSpan.FromSeconds(2.0)) .WaitFinished() .RotateEulerAnglesTo(new Vector3(0f, 0f, 0f), TimeSpan.FromSeconds(2.0)) .WaitFinished() .CallAction(() => palletObject.RotationEuler = Vector3.Zero) .ApplyAndRewind(); }); // Configure camera Camera3DBase camera = CtrlRenderPanel.Camera; camera.Position = new Vector3(2f, 2f, 2f); camera.Target = new Vector3(0f, 0.5f, 0f); camera.UpdateCamera(); }
public async Task Render_Skybox() { await UnitTestHelper.InitializeWithGrahicsAsync(); using (MemoryRenderTarget memRenderTarget = new MemoryRenderTarget(1024, 1024)) { memRenderTarget.ClearColor = Color4.CornflowerBlue; // Get and configure the camera PerspectiveCamera3D camera = memRenderTarget.Camera as PerspectiveCamera3D; camera.Position = new Vector3(-3f, -3f, -7f); camera.Target = new Vector3(0f, 0f, 0f); camera.UpdateCamera(); // Define scene await memRenderTarget.Scene.ManipulateSceneAsync((manipulator) => { // Create pallet geometry resource PalletType pType = new PalletType(); pType.ContentColor = Color4.Transparent; var resPalletGeometry = manipulator.AddResource <GeometryResource>( () => new GeometryResource(pType)); // Create pallet object GenericObject palletObject = manipulator.AddGeneric(resPalletGeometry); palletObject.Color = Color4.GreenColor; palletObject.EnableShaderGeneratedBorder(); palletObject.BuildAnimationSequence() .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_180DEG, 0f), TimeSpan.FromSeconds(2.0)) .WaitFinished() .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_360DEG, 0f), TimeSpan.FromSeconds(2.0)) .WaitFinished() .CallAction(() => palletObject.RotationEuler = Vector3.Zero) .ApplyAndRewind(); var resSkyboxTexture = manipulator.AddTexture(new Uri("/SeeingSharp.Tests.Rendering;component/Ressources/Textures/Skybox.dds", UriKind.Relative)); // Create the skybox on a new layer manipulator.AddLayer("Skybox"); SkyboxObject skyboxObject = new SkyboxObject(resSkyboxTexture); manipulator.Add(skyboxObject, "Skybox"); }); // Take screenshot GDI.Bitmap screenshot = await memRenderTarget.RenderLoop.GetScreenshotGdiAsync(); screenshot = await memRenderTarget.RenderLoop.GetScreenshotGdiAsync(); //screenshot.DumpToDesktop("Blub.png"); // Calculate and check difference bool isNearEqual = BitmapComparison.IsNearEqual( screenshot, Properties.Resources.ReferenceImage_Skybox); Assert.True(isNearEqual, "Difference to reference image is to big!"); } // Finishing checks Assert.True(GraphicsCore.Current.MainLoop.RegisteredRenderLoopCount == 0, "RenderLoops where not disposed correctly!"); }
private async void OnMainPage_Loaded(object sender, RoutedEventArgs e) { if (m_panelPainter != null) { return; } // Attach the painter to the target render panel m_panelPainter = new SeeingSharpPanelPainter(this.RenderTargetPanel); m_panelPainter.RenderLoop.ClearColor = Color4.CornflowerBlue; // Build scene graph await m_panelPainter.Scene.ManipulateSceneAsync((manipulator) => { // Define a BACKGROUND layer and configure layer IDs // => Ensures correct render order SceneLayer bgLayer = manipulator.AddLayer("BACKGROUND"); manipulator.SetLayerOrderID(bgLayer, 0); manipulator.SetLayerOrderID(Scene.DEFAULT_LAYER_NAME, 1); // Add the background texture painter to the BACKGROUND layer var resBackgroundTexture = manipulator.AddTexture( new AssemblyResourceUriBuilder( "SeeingSharp.Tutorials.Introduction03", true, "Assets/Textures/Background.png")); manipulator.Add(new FullscreenTextureObject(resBackgroundTexture), bgLayer.Name); // Create pallet geometry resource PalletType pType = new PalletType(); pType.ContentColor = Color4.GreenColor; var resPalletGeometry = manipulator.AddResource <GeometryResource>( () => new GeometryResource(pType)); // Create pallet object and add it to the scene // => The DEFAULT layer is used by default GenericObject palletObject = manipulator.AddGeneric(resPalletGeometry); palletObject.Color = Color4.GreenColor; palletObject.EnableShaderGeneratedBorder(); palletObject.BuildAnimationSequence() .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_180DEG, EngineMath.RAD_45DEG), TimeSpan.FromSeconds(2.0)) .WaitFinished() .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_360DEG, EngineMath.RAD_45DEG), TimeSpan.FromSeconds(2.0)) .WaitFinished() .RotateEulerAnglesTo(new Vector3(0f, 0f, 0f), TimeSpan.FromSeconds(2.0)) .WaitFinished() .CallAction(() => palletObject.RotationEuler = Vector3.Zero) .ApplyAndRewind(); }); // Configure camera Camera3DBase camera = m_panelPainter.Camera; camera.Position = new Vector3(2f, 2f, 2f); camera.Target = new Vector3(0f, 0.5f, 0f); camera.UpdateCamera(); }
private static GenericObject DefineAnimation_2Secs() { // Define animation parameters / objects GenericObject genObject = new GenericObject(NamedOrGenericKey.Empty); // Define animation sequence (very simple) genObject.BuildAnimationSequence() .Move3DTo(new Vector3(0.6f, 0f, 0f), new MovementSpeed(0.3f)) // 20,0 Secs .Apply(); return(genObject); }
/// <summary> /// Called when the sample has to startup. /// </summary> /// <param name="targetRenderLoop">The target render loop.</param> /// <returns></returns> public override async Task OnStartupAsync(RenderLoop targetRenderLoop) { targetRenderLoop.EnsureNotNull(nameof(targetRenderLoop)); // Build dummy scene Scene scene = targetRenderLoop.Scene; Camera3DBase camera = targetRenderLoop.Camera as Camera3DBase; // Build scene initially if we are on first load if (scene.CountObjects <= 0) { await scene.ManipulateSceneAsync((manipulator) => { // Create floor SampleSceneBuilder.BuildStandardFloor( manipulator, Scene.DEFAULT_LAYER_NAME); // Create pallet geometry resource PalletType pType = new PalletType(); pType.ContentColor = Color4.Transparent; var resPalletGeometry = manipulator.AddResource <GeometryResource>( () => new GeometryResource(pType)); // Create pallet object GenericObject palletObject = manipulator.AddGeneric(resPalletGeometry); palletObject.Color = Color4.GreenColor; palletObject.EnableShaderGeneratedBorder(); palletObject.BuildAnimationSequence() .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_180DEG, 0f), TimeSpan.FromSeconds(2.0)) .WaitFinished() .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_360DEG, 0f), TimeSpan.FromSeconds(2.0)) .WaitFinished() .CallAction(() => palletObject.RotationEuler = Vector3.Zero) .ApplyAndRewind(); var resSkyboxTexture = manipulator.AddTexture( new AssemblyResourceLink( typeof(SeeingSharpSampleResources), "Textures.SkyBox.dds")); // Create the skybox on a new layer manipulator.AddLayer("Skybox"); SkyboxObject skyboxObject = new SkyboxObject(resSkyboxTexture); manipulator.Add(skyboxObject, "Skybox"); }); // Configure camera camera.Position = new Vector3(5f, 3f, 5f); camera.Target = new Vector3(0f, 2f, 0f); camera.UpdateCamera(); } }
private async Task OnStartupAsync_Fallback(RenderLoop targetRenderLoop) { targetRenderLoop.EnsureNotNull(nameof(targetRenderLoop)); // Build dummy scene Scene scene = targetRenderLoop.Scene; Camera3DBase camera = targetRenderLoop.Camera as Camera3DBase; await targetRenderLoop.Scene.ManipulateSceneAsync((manipulator) => { // Create floor SampleSceneBuilder.BuildStandardFloor( manipulator, Scene.DEFAULT_LAYER_NAME); // Define texture and material resource var resTexture = manipulator.AddTexture( new AssemblyResourceLink( typeof(SeeingSharpSampleResources), "Textures.NoCaptureDevice.png")); var resMaterial = manipulator.AddSimpleColoredMaterial(resTexture); // Create pallet geometry resource PalletType pType = new PalletType(); pType.ContentMaterial = resMaterial; var resPalletGeometry = manipulator.AddResource <GeometryResource>( () => new GeometryResource(pType)); // Create pallet object GenericObject palletObject = manipulator.AddGeneric(resPalletGeometry); palletObject.Color = Color4.GreenColor; palletObject.EnableShaderGeneratedBorder(); palletObject.BuildAnimationSequence() .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_180DEG, 0f), TimeSpan.FromSeconds(2.0)) .WaitFinished() .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_360DEG, 0f), TimeSpan.FromSeconds(2.0)) .WaitFinished() .RotateEulerAnglesTo(new Vector3(0f, 0f, 0f), TimeSpan.FromSeconds(2.0)) .WaitFinished() .CallAction(() => palletObject.RotationEuler = Vector3.Zero) .ApplyAndRewind(); }); // Configure camera camera.Position = new Vector3(2f, 2f, 2f); camera.Target = new Vector3(0f, 0.5f, 0f); camera.UpdateCamera(); }
public void Test_EventDriven_SimpleAnimation_3() { // Define animation parameters / objects GenericObject genObject = new GenericObject(NamedOrGenericKey.Empty); // Define animation sequence // .. use 3D-Engine GenericObject (animated just like simulation objects) genObject.BuildAnimationSequence() .Move3DBy(new Vector3(5f, 0f, 0f), TimeSpan.FromMilliseconds(500.0)) .Scale3DTo(new Vector3(2f, 2f, 2f), TimeSpan.FromMilliseconds(750.0)) .WaitFinished() .Apply(); // Main-Test: Perform animation in an event-driven way EventDrivenPassInfo passInfo = genObject.AnimationHandler.CalculateEventDriven(); // Check results Assert.True(passInfo.CountSteps == 1); Assert.True(passInfo.Steps[0].UpdateTime == TimeSpan.FromMilliseconds(750.0)); }
/// <summary> /// A method that starts the app view. /// </summary> public void Run() { RenderLoop targetRenderLoop = m_mainWindowPainter.RenderLoop; Camera3DBase camera = targetRenderLoop.Camera; // Configure camera camera.Position = new Vector3(-5f, -5f, -5f); camera.Target = new Vector3(0f, 0.5f, 0f); camera.UpdateCamera(); targetRenderLoop.Scene.ManipulateSceneAsync((manipulator) => { // Create pallet geometry resource PalletType pType = new PalletType(); pType.ContentColor = Color4.Transparent; var resPalletGeometry = manipulator.AddResource <GeometryResource>( () => new GeometryResource(pType)); // Create pallet object GenericObject palletObject = manipulator.AddGeneric(resPalletGeometry); palletObject.Position = new Vector3(); palletObject.Color = Color4.GreenColor; palletObject.EnableShaderGeneratedBorder(); palletObject.BuildAnimationSequence() .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_180DEG, 0f), TimeSpan.FromSeconds(2.0)) .WaitFinished() .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_360DEG, 0f), TimeSpan.FromSeconds(2.0)) .WaitFinished() .CallAction(() => palletObject.RotationEuler = Vector3.Zero) .ApplyAndRewind(); }).FireAndForget(); targetRenderLoop.SceneComponents.Add( new FreeMovingCameraComponent()); m_mainWindow.Activate(); m_mainWindow.Dispatcher.ProcessEvents(CoreProcessEventsOption.ProcessUntilQuit); }
/// <summary> /// Called when the sample has to startup. /// </summary> /// <param name="targetRenderLoop">The target render loop.</param> public override async Task OnStartupAsync(RenderLoop targetRenderLoop) { targetRenderLoop.EnsureNotNull(nameof(targetRenderLoop)); // Build dummy scene Scene scene = targetRenderLoop.Scene; Camera3DBase camera = targetRenderLoop.Camera as Camera3DBase; await targetRenderLoop.Scene.ManipulateSceneAsync((manipulator) => { // Create floor SampleSceneBuilder.BuildStandardFloor( manipulator, Scene.DEFAULT_LAYER_NAME); // Create pallet geometry resource PalletType pType = new PalletType(); pType.ContentColor = Color4.Transparent; var resPalletGeometry = manipulator.AddResource <GeometryResource>( () => new GeometryResource(pType)); // Create pallet object GenericObject palletObject = manipulator.AddGeneric(resPalletGeometry); palletObject.Color = Color4.GreenColor; palletObject.EnableShaderGeneratedBorder(); palletObject.BuildAnimationSequence() .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_180DEG, 0f), TimeSpan.FromSeconds(2.0)) .WaitFinished() .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_360DEG, 0f), TimeSpan.FromSeconds(2.0)) .WaitFinished() .CallAction(() => palletObject.RotationEuler = Vector3.Zero) .ApplyAndRewind(); }); // Configure camera camera.Position = new Vector3(2f, 2f, 2f); camera.Target = new Vector3(0f, 0.5f, 0f); camera.UpdateCamera(); }
public void Test_EventDriven_SimpleAnimation_5() { // Define animation parameters / objects GenericObject genObject = new GenericObject(NamedOrGenericKey.Empty); // Define animation sequence // .. A bit more complicated.. this method uses a fixed wait timer in between. Not all animations before it would be finished // More complicated here: The step "Scale3DTo" is the longest and controls the duration of the second event genObject.BuildAnimationSequence() .Move3DBy(new Vector3(5f, 0f, 0f), TimeSpan.FromMilliseconds(500.0)) .Scale3DTo(new Vector3(2f, 2f, 2f), TimeSpan.FromMilliseconds(1750.0)) .WaitUntilTimePassed(TimeSpan.FromMilliseconds(600.0)) .RotateEulerAnglesBy(new Vector3(2f, 0f, 0f), TimeSpan.FromMilliseconds(500.0)) .WaitFinished() .Apply(); // Perform animation in an event-driven way EventDrivenPassInfo passInfo = genObject.AnimationHandler.CalculateEventDriven(); // Check results Assert.True(passInfo.CountSteps == 2); Assert.True(passInfo.Steps[0].UpdateTime == TimeSpan.FromMilliseconds(600.0)); Assert.True(passInfo.Steps[1].UpdateTime == TimeSpan.FromMilliseconds(1150.0)); }
/// <summary> /// Called when the sample has to startup. /// </summary> /// <param name="targetRenderLoop">The target render loop.</param> public override async Task OnStartupAsync(RenderLoop targetRenderLoop) { targetRenderLoop.EnsureNotNull(nameof(targetRenderLoop)); // Build dummy scene Scene scene = targetRenderLoop.Scene; Camera3DBase camera = targetRenderLoop.Camera as Camera3DBase; // Define 2D overlay m_solidBrush = new SolidBrushResource(Color4.LightSteelBlue.ChangeAlphaTo(0.7f)); m_textFormat = new TextFormatResource("Arial", 36); m_textBrush = new SolidBrushResource(Color4.RedColor); Action <Graphics2D> draw2DAction = (graphics) => { // 2D rendering is made here RectangleF d2dRectangle = new RectangleF( 10, 10, graphics.ScreenSize.Width - 20, graphics.ScreenSize.Height - 20); if (d2dRectangle.Width < 100) { return; } if (d2dRectangle.Height < 100) { return; } // Draw background rectangle graphics.FillRoundedRectangle( d2dRectangle, 30, 30, m_solidBrush); // Draw the text d2dRectangle.Inflate(-10, -10); d2dRectangle.Y = d2dRectangle.Y + 15f; graphics.DrawText("Hello Direct2D!", m_textFormat, d2dRectangle, m_textBrush); }; await targetRenderLoop.Scene.ManipulateSceneAsync((manipulator) => { // Add the 2D layer to the scene manipulator.AddDrawingLayer(draw2DAction); // Create floor SampleSceneBuilder.BuildStandardFloor( manipulator, Scene.DEFAULT_LAYER_NAME); // Create pallet geometry resource PalletType pType = new PalletType(); pType.ContentColor = Color4.Transparent; var resPalletGeometry = manipulator.AddResource <GeometryResource>( () => new GeometryResource(pType)); // Create pallet object GenericObject palletObject = manipulator.AddGeneric(resPalletGeometry); palletObject.Color = Color4.GreenColor; palletObject.EnableShaderGeneratedBorder(); palletObject.BuildAnimationSequence() .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_180DEG, 0f), TimeSpan.FromSeconds(2.0)) .WaitFinished() .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_360DEG, 0f), TimeSpan.FromSeconds(2.0)) .WaitFinished() .CallAction(() => palletObject.RotationEuler = Vector3.Zero) .ApplyAndRewind(); }); // Configure camera camera.Position = new Vector3(2f, 2f, 2f); camera.Target = new Vector3(0f, 0.5f, 0f); camera.UpdateCamera(); }
/// <summary> /// Called when the sample has to startup. /// </summary> /// <param name="targetRenderLoop">The target render loop.</param> public override async Task OnStartupAsync(RenderLoop targetRenderLoop) { targetRenderLoop.EnsureNotNull(nameof(targetRenderLoop)); // Build dummy scene Scene scene = targetRenderLoop.Scene; Camera3DBase camera = targetRenderLoop.Camera as Camera3DBase; // 2D rendering is made here m_solidBrush = new SolidBrushResource(Color4.Gray); m_textFormat = new TextFormatResource("Arial", 36); m_textBrush = new SolidBrushResource(Color4.RedColor); Custom2DDrawingLayer d2dDrawingLayer = new Custom2DDrawingLayer((graphics) => { RectangleF d2dRectangle = new RectangleF(10, 10, 236, 236); graphics.Clear(Color4.LightBlue); graphics.FillRoundedRectangle( d2dRectangle, 30, 30, m_solidBrush); d2dRectangle.Inflate(-10, -10); graphics.DrawText("Hello Direct2D!", m_textFormat, d2dRectangle, m_textBrush); }); // Build 3D scene await targetRenderLoop.Scene.ManipulateSceneAsync((manipulator) => { // Create floor SampleSceneBuilder.BuildStandardFloor( manipulator, Scene.DEFAULT_LAYER_NAME); // Define Direct2D texture resource var resD2DTexture = manipulator.AddResource <Direct2DTextureResource>( () => new Direct2DTextureResource(d2dDrawingLayer, 256, 256)); var resD2DMaterial = manipulator.AddSimpleColoredMaterial(resD2DTexture); // Create pallet geometry resource PalletType pType = new PalletType(); pType.PalletMaterial = NamedOrGenericKey.Empty; pType.ContentMaterial = resD2DMaterial; var resPalletGeometry = manipulator.AddResource <GeometryResource>( () => new GeometryResource(pType)); // Create pallet object GenericObject palletObject = manipulator.AddGeneric(resPalletGeometry); palletObject.Color = Color4.GreenColor; palletObject.EnableShaderGeneratedBorder(); palletObject.BuildAnimationSequence() .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_180DEG, 0f), TimeSpan.FromSeconds(2.0)) .WaitFinished() .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_360DEG, 0f), TimeSpan.FromSeconds(2.0)) .WaitFinished() .CallAction(() => palletObject.RotationEuler = Vector3.Zero) .ApplyAndRewind(); }); // Configure camera camera.Position = new Vector3(2f, 2f, 2f); camera.Target = new Vector3(0f, 0.5f, 0f); camera.UpdateCamera(); }
/// <summary> /// Starts and controls the animation for the given object. /// </summary> /// <param name="targetObject">The object to be animated.</param> private async void AttachMoveBehavior(GenericObject targetObject) { Random randomizer = new Random(Environment.TickCount); // Set initial values targetObject.Position = new Vector3(0f, 2f, -2f); targetObject.Scaling = new Vector3(5f, 5f, 5f); targetObject.TransformationType = SpacialTransformationType.ScalingTranslationEulerAngles; targetObject.RotationEuler = new Vector3(0f, EngineMath.RAD_270DEG, 0f); targetObject.Opacity = 0f; // Create initial animation await targetObject.BuildAnimationSequence() .Move3DBy(new Vector3(0f, -1.5f, 0f), TimeSpan.FromSeconds(0.5)) .Scale3DTo(new Vector3(1f, 1f, 1f), TimeSpan.FromSeconds(0.5)) .ChangeFloatBy( () => targetObject.Opacity, (actValue) => targetObject.Opacity = actValue, 1f, TimeSpan.FromSeconds(0.5)) .ApplyAsync(); // Ensure correct opacity targetObject.Opacity = 1f; // Accelerate banana await targetObject.BuildAnimationSequence() .Move3DBy( new Vector3(0f, 0f, 1f), new MovementSpeed(2.0f, 1.5f)) .ApplyAsync(); // Enter looping animation (move around the rectangle) do { await targetObject.BuildAnimationSequence() //Move on right line .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_270DEG, 0f), TimeSpan.FromSeconds(0.3)) .Move3DBy(new Vector3(0f, 0f, 5f), TimeSpan.FromSeconds(3.0)) .WaitFinished() //Move on front line .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_180DEG, 0f), TimeSpan.FromSeconds(0.3)) .Move3DBy(new Vector3(-5f, 0f, 0f), TimeSpan.FromSeconds(3.0)) .Scale3DTo(new Vector3(2f, 2f, 2f), TimeSpan.FromSeconds(2.0)) .WaitFinished() //Move on Left line .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_90DEG, 0f), TimeSpan.FromSeconds(0.3)) .Move3DBy(new Vector3(0f, 0f, -5f), TimeSpan.FromSeconds(3.0)) .Scale3DTo(new Vector3(1f, 1f, 1f), TimeSpan.FromSeconds(2.0)) .WaitFinished() //Move on bottom line .RotateEulerAnglesTo(new Vector3(0f, 0f, 0f), TimeSpan.FromSeconds(0.3)) .Move3DBy(new Vector3(5f, 0f, 0f), TimeSpan.FromSeconds(3.0)) .ApplyAsync(); }while (randomizer.Next(0, 100) > 70); // Show remove animation await targetObject.BuildAnimationSequence() .Move3DBy(new Vector3(1.5f, 0f, 0f), TimeSpan.FromSeconds(0.5)) .Scale3DTo(new Vector3(5f, 5f, 5f), TimeSpan.FromSeconds(0.5)) .ChangeFloatBy( () => targetObject.Opacity, (actValue) => targetObject.Opacity = actValue, -1f, TimeSpan.FromSeconds(0.5)) .ApplyAsync(); // Remove the banana from the scene finally await targetObject.Scene.ManipulateSceneAsync((manipulator) => { manipulator.Remove(targetObject); }); }
/// <summary> /// Called when the sample has to startup. /// </summary> /// <param name="targetRenderLoop">The target render loop.</param> public override async Task OnStartupAsync(RenderLoop targetRenderLoop) { targetRenderLoop.EnsureNotNull(nameof(targetRenderLoop)); // Start the device chooser m_deviceChooser = new CaptureDeviceChooser(); // Show fallback-scene if we don't have a capture device if (m_deviceChooser.DeviceCount <= 0) { await OnStartupAsync_Fallback(targetRenderLoop); return; } // Get and configure the camera Camera3DBase camera = targetRenderLoop.Camera as PerspectiveCamera3D; camera.Position = new Vector3(0f, 5f, -7f); camera.Target = new Vector3(0f, 0f, 0f); camera.UpdateCamera(); // Open the video file m_videoReader = new AsyncRealtimeVideoReader(m_deviceChooser.DeviceInfos.First()); m_videoReader.VideoReachedEnd += (sender, eArgs) => { m_videoReader.SetCurrentPosition(TimeSpan.Zero); }; // Define scene await targetRenderLoop.Scene.ManipulateSceneAsync((manipulator) => { // Create floor SampleSceneBuilder.BuildStandardFloor( manipulator, Scene.DEFAULT_LAYER_NAME); // Define texture and resource var resVideoTexture = manipulator.AddResource <VideoTextureResource>( () => new VideoTextureResource(m_videoReader)); var resVideoMaterial = manipulator.AddSimpleColoredMaterial(resVideoTexture, addToAlpha: 1f); var geoResource = manipulator.AddResource <GeometryResource>( () => new GeometryResource(new PalletType( palletMaterial: NamedOrGenericKey.Empty, contentMaterial: resVideoMaterial))); // Add the object GenericObject newObject = manipulator.AddGeneric(geoResource); newObject.RotationEuler = new Vector3(0f, EngineMath.RAD_90DEG / 2f, 0f); newObject.Scaling = new Vector3(2f, 2f, 2f); newObject.EnableShaderGeneratedBorder(); // Start pallet rotating animation newObject.BuildAnimationSequence() .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_180DEG, 0f), TimeSpan.FromSeconds(2.0)) .WaitFinished() .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_360DEG, 0f), TimeSpan.FromSeconds(2.0)) .WaitFinished() .RotateEulerAnglesTo(new Vector3(0f, 0f, 0f), TimeSpan.FromSeconds(2.0)) .WaitFinished() .CallAction(() => newObject.RotationEuler = Vector3.Zero) .ApplyAndRewind(); }); }
protected override async void OnLoad(EventArgs e) { base.OnLoad(e); // Attach the painter to the target render panel m_ctrlRenderControl.RenderLoop.ClearColor = Color4.CornflowerBlue; // Build scene graph await m_ctrlRenderControl.Scene.ManipulateSceneAsync((manipulator) => { // Define a BACKGROUND layer and configure layer IDs // => Ensures correct render order SceneLayer bgLayer = manipulator.AddLayer("BACKGROUND"); manipulator.SetLayerOrderID(bgLayer, 0); manipulator.SetLayerOrderID(Scene.DEFAULT_LAYER_NAME, 1); // Add the background texture painter to the BACKGROUND layer var resBackgroundTexture = manipulator.AddTexture( new AssemblyResourceUriBuilder( "SeeingSharp.Tutorials.Introduction04", true, "Assets/Textures/Background.png")); manipulator.Add(new FullscreenTextureObject(resBackgroundTexture), bgLayer.Name); // Create pallet geometry resource PalletType pType = new PalletType(); pType.ContentColor = Color4.GreenColor; var resPalletGeometry = manipulator.AddResource <GeometryResource>( () => new GeometryResource(pType)); // Create pallet object and add it to the scene // => The DEFAULT layer is used by default for (int loopX = 0; loopX < 11; loopX++) { for (int loopY = 0; loopY < 11; loopY++) { GenericObject palletObject = manipulator.AddGeneric(resPalletGeometry); palletObject.Color = Color4.GreenColor; palletObject.Position = new Vector3( -10f + loopX * 2f, -10f + loopY * 2f, 0f); palletObject.Tag1 = $"Pallet (X={loopX}, Y={loopY})"; palletObject.EnableShaderGeneratedBorder(); palletObject.BuildAnimationSequence() .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_180DEG, EngineMath.RAD_45DEG), TimeSpan.FromSeconds(2.0)) .WaitFinished() .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_360DEG, EngineMath.RAD_45DEG), TimeSpan.FromSeconds(2.0)) .WaitFinished() .RotateEulerAnglesTo(new Vector3(0f, 0f, 0f), TimeSpan.FromSeconds(2.0)) .WaitFinished() .CallAction(() => palletObject.RotationEuler = Vector3.Zero) .ApplyAndRewind(); } } }); // Configure camera Camera3DBase camera = m_ctrlRenderControl.Camera; camera.Position = new Vector3(0f, 0f, -25f); camera.Target = new Vector3(0f, 0f, 0f); camera.UpdateCamera(); }
/// <summary> /// Called when the sample has to startup. /// </summary> /// <param name="targetRenderLoop">The target render loop.</param> public override async Task OnStartupAsync(RenderLoop targetRenderLoop) { targetRenderLoop.EnsureNotNull(nameof(targetRenderLoop)); // Build dummy scene Scene scene = targetRenderLoop.Scene; Camera3DBase camera = targetRenderLoop.Camera as Camera3DBase; // Define resources m_starBitmap = new StandardBitmapResource( new AssemblyResourceLink( typeof(SeeingSharpSampleResources), "Bitmaps.StarColored_128x128.png")); m_startBitmapShaded = new GaussianBlurEffectResource(m_starBitmap); m_startBitmapShaded.StandardDeviation = 4f; // Define 2D overlay Action <Graphics2D> draw2DAction = (graphics) => { graphics.DrawBitmap( m_starBitmap, new Vector2(10f, 10f), 1f, BitmapInterpolationMode.Linear); graphics.DrawImage( m_startBitmapShaded, new Vector2(150f, 10f)); }; await targetRenderLoop.Scene.ManipulateSceneAsync((manipulator) => { // Add the 2D layer to the scene manipulator.AddDrawingLayer(draw2DAction); // Create floor SampleSceneBuilder.BuildStandardFloor( manipulator, Scene.DEFAULT_LAYER_NAME); // Create pallet geometry resource PalletType pType = new PalletType(); pType.ContentColor = Color4.Transparent; var resPalletGeometry = manipulator.AddResource <GeometryResource>( () => new GeometryResource(pType)); // Create pallet object GenericObject palletObject = manipulator.AddGeneric(resPalletGeometry); palletObject.Color = Color4.GreenColor; palletObject.EnableShaderGeneratedBorder(); palletObject.BuildAnimationSequence() .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_180DEG, 0f), TimeSpan.FromSeconds(2.0)) .WaitFinished() .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_360DEG, 0f), TimeSpan.FromSeconds(2.0)) .WaitFinished() .CallAction(() => palletObject.RotationEuler = Vector3.Zero) .ApplyAndRewind(); }); // Configure camera camera.Position = new Vector3(2f, 2f, 2f); camera.Target = new Vector3(0f, 0.5f, 0f); camera.UpdateCamera(); }
/// <summary> /// Called when the sample has to startup. /// </summary> /// <param name="targetRenderLoop">The target render loop.</param> public override async Task OnStartupAsync(RenderLoop targetRenderLoop) { targetRenderLoop.EnsureNotNull(nameof(targetRenderLoop)); // Build dummy scene Scene scene = targetRenderLoop.Scene; Camera3DBase camera = targetRenderLoop.Camera as Camera3DBase; // Create all objects for animation List <Vector2> starLocations = new List <Vector2>(); m_starBitmap = new StandardBitmapResource( new AssemblyResourceLink( typeof(SeeingSharpSampleResources), "Bitmaps.StarColored_128x128.png")); m_borderBrush = new SolidBrushResource(Color4.SteelBlue); Random starCreateRandomizer = new Random(); // 2D rendering is made here Custom2DDrawingLayer d2dDrawingLayer = new Custom2DDrawingLayer((graphics) => { // Draw background RectangleF d2dRectangle = new RectangleF(10, 10, 236, 236); graphics.Clear(Color4.LightBlue); // Dynamically create new stars if ((starLocations.Count < 50) && (starCreateRandomizer.Next(0, 100) <= 70)) { starLocations.Add(new Vector2( (float)starCreateRandomizer.Next(0, 256), -32f)); } // Update and draw all stars for (int loopStar = 0; loopStar < starLocations.Count; loopStar++) { Vector2 actLocation = starLocations[loopStar]; if (actLocation.Y > 270f) { starLocations.RemoveAt(loopStar); loopStar--; continue; } actLocation.Y = actLocation.Y + 4f; starLocations[loopStar] = actLocation; graphics.DrawBitmap( m_starBitmap, new RectangleF( actLocation.X - 16f, actLocation.Y - 16f, 32f, 32f), 0.6f, BitmapInterpolationMode.Linear); } // Draw a simple border graphics.DrawRectangle(graphics.ScreenBounds, m_borderBrush, 2f); }); // Build 3D scene await targetRenderLoop.Scene.ManipulateSceneAsync((manipulator) => { // Create floor SampleSceneBuilder.BuildStandardFloor( manipulator, Scene.DEFAULT_LAYER_NAME); // Define Direct2D texture resource var resD2DTexture = manipulator.AddResource <Direct2DTextureResource>( () => new Direct2DTextureResource(d2dDrawingLayer, 256, 256)); var resD2DMaterial = manipulator.AddSimpleColoredMaterial(resD2DTexture); // Create pallet geometry resource PalletType pType = new PalletType(); pType.PalletMaterial = NamedOrGenericKey.Empty; pType.ContentMaterial = resD2DMaterial; var resPalletGeometry = manipulator.AddResource <GeometryResource>( () => new GeometryResource(pType)); // Create pallet object GenericObject palletObject = manipulator.AddGeneric(resPalletGeometry); palletObject.Color = Color4.GreenColor; palletObject.EnableShaderGeneratedBorder(); palletObject.BuildAnimationSequence() .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_180DEG, 0f), TimeSpan.FromSeconds(2.0)) .WaitFinished() .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_360DEG, 0f), TimeSpan.FromSeconds(2.0)) .WaitFinished() .CallAction(() => palletObject.RotationEuler = Vector3.Zero) .ApplyAndRewind(); }); // Configure camera camera.Position = new Vector3(2f, 2f, 2f); camera.Target = new Vector3(0f, 0.5f, 0f); camera.UpdateCamera(); }