Browse Source

Add a copy of animated Model and import it with GPU Animation Importer (#2)

Nikos Kastellanos 8 years ago
parent
commit
208a7c2b2d

+ 42 - 11
Samples/Animation/Game1.cs

@@ -8,13 +8,23 @@ using tainicom.Aether.Animation;
 
 
 namespace Samples.Animation
 namespace Samples.Animation
 {
 {
+    enum DrawMode : int
+    {
+        CPU,
+        GPU,
+    }
+
     public class Game1 : Microsoft.Xna.Framework.Game
     public class Game1 : Microsoft.Xna.Framework.Game
     {
     {
         GraphicsDeviceManager graphics;
         GraphicsDeviceManager graphics;
         SpriteBatch spriteBatch;
         SpriteBatch spriteBatch;
         SpriteFont font;
         SpriteFont font;
-        Model _model;
+        Model _model_CPU;
+        Model _model_GPU;
         Animations _animations;
         Animations _animations;
+        DrawMode drawMode = DrawMode.CPU;
+
+        KeyboardState prevKeyboardState;
 
 
         public Game1()
         public Game1()
         {
         {
@@ -32,9 +42,10 @@ namespace Samples.Animation
             spriteBatch = new SpriteBatch(GraphicsDevice);
             spriteBatch = new SpriteBatch(GraphicsDevice);
             font = Content.Load<SpriteFont>("font");
             font = Content.Load<SpriteFont>("font");
             
             
-            _model = Content.Load<Model>("Dude/dude");
+            _model_CPU = Content.Load<Model>("Dude/dude");
+            _model_GPU = Content.Load<Model>("Dude/dude_GPU");
 
 
-            _animations = _model.GetAnimations();
+            _animations = _model_CPU.GetAnimations(); // Animation Data are the same between the two models
             var clip = _animations.Clips["Take 001"];
             var clip = _animations.Clips["Take 001"];
             _animations.SetClip(clip);
             _animations.SetClip(clip);
         }
         }
@@ -45,10 +56,21 @@ namespace Samples.Animation
 
 
         protected override void Update(GameTime gameTime)
         protected override void Update(GameTime gameTime)
         {
         {
+            var keyboardState = Keyboard.GetState();
+            var gamePadState = GamePad.GetState(PlayerIndex.One);
+
             // Allows the game to exit
             // Allows the game to exit
-            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
+            if (keyboardState.IsKeyDown(Keys.Escape) || gamePadState.Buttons.Back == ButtonState.Pressed)
                 this.Exit();
                 this.Exit();
 
 
+            if ((keyboardState.IsKeyDown(Keys.Space) && prevKeyboardState.IsKeyUp(Keys.Space)) || gamePadState.Buttons.A == ButtonState.Pressed)
+            {
+                int drawModesCount = Enum.GetValues(drawMode.GetType()).Length;
+                drawMode = (DrawMode)(((int)drawMode + 1) % drawModesCount);
+            }
+
+            prevKeyboardState = keyboardState;
+
             _animations.Update(gameTime.ElapsedGameTime, true, Matrix.Identity);
             _animations.Update(gameTime.ElapsedGameTime, true, Matrix.Identity);
 
 
             base.Update(gameTime);
             base.Update(gameTime);
@@ -77,7 +99,11 @@ namespace Samples.Animation
             GraphicsDevice.DepthStencilState = DepthStencilState.Default;
             GraphicsDevice.DepthStencilState = DepthStencilState.Default;
             GraphicsDevice.SamplerStates[0] = SamplerState.LinearWrap;
             GraphicsDevice.SamplerStates[0] = SamplerState.LinearWrap;
 
 
-            var m = _model;
+            Model m = _model_CPU;
+            if (drawMode == DrawMode.CPU)
+                m = _model_CPU;
+            else if (drawMode == DrawMode.GPU)
+                m = _model_GPU;
 
 
             float aspectRatio = graphics.GraphicsDevice.Viewport.AspectRatio;
             float aspectRatio = graphics.GraphicsDevice.Viewport.AspectRatio;
             Matrix[] transforms = new Matrix[m.Bones.Count];
             Matrix[] transforms = new Matrix[m.Bones.Count];
@@ -94,12 +120,17 @@ namespace Samples.Animation
             {
             {
                 foreach (var part in mesh.MeshParts)
                 foreach (var part in mesh.MeshParts)
                 {
                 {
-                    ((BasicEffect)part.Effect).SpecularColor = Vector3.Zero;
+                    if (drawMode == DrawMode.CPU)
+                        ((BasicEffect)part.Effect).SpecularColor = Vector3.Zero;
+                    else if (drawMode == DrawMode.GPU)
+                        ((SkinnedEffect)part.Effect).SpecularColor = Vector3.Zero;                        
                     ConfigureEffectMatrices((IEffectMatrices)part.Effect, Matrix.Identity, view, projection);
                     ConfigureEffectMatrices((IEffectMatrices)part.Effect, Matrix.Identity, view, projection);
                     ConfigureEffectLighting((IEffectLights)part.Effect);
                     ConfigureEffectLighting((IEffectLights)part.Effect);
-
-                    // animate vertices on CPU
-                    part.UpdateVertices(_animations.AnimationTransforms);
+                    
+                    if (drawMode == DrawMode.CPU)
+                        part.UpdateVertices(_animations.AnimationTransforms); // animate vertices on CPU
+                    else if (drawMode == DrawMode.GPU)
+                        ((SkinnedEffect)part.Effect).SetBoneTransforms(_animations.AnimationTransforms);// animate vertices on GPU
                 }
                 }
                 mesh.Draw();
                 mesh.Draw();
             }
             }
@@ -117,13 +148,13 @@ namespace Samples.Animation
             }
             }
 
 
             spriteBatch.Begin();
             spriteBatch.Begin();
+            spriteBatch.DrawString(font, "Draw Mode: " + drawMode, new Vector2(32, 32), Color.White);
             spriteBatch.DrawString(font, msec.ToString("#0.000",CultureInfo.InvariantCulture) + "ms", new Vector2(32, GraphicsDevice.Viewport.Height - 130), Color.White);
             spriteBatch.DrawString(font, msec.ToString("#0.000",CultureInfo.InvariantCulture) + "ms", new Vector2(32, GraphicsDevice.Viewport.Height - 130), Color.White);
             spriteBatch.DrawString(font, avg.ToString("#0.000",CultureInfo.InvariantCulture) + "ms (avg)", new Vector2(32, GraphicsDevice.Viewport.Height - 100), Color.White);
             spriteBatch.DrawString(font, avg.ToString("#0.000",CultureInfo.InvariantCulture) + "ms (avg)", new Vector2(32, GraphicsDevice.Viewport.Height - 100), Color.White);
             spriteBatch.DrawString(font, msecMin.ToString("#0.000",CultureInfo.InvariantCulture) + "ms (min)", new Vector2(32, GraphicsDevice.Viewport.Height - 70), Color.White);
             spriteBatch.DrawString(font, msecMin.ToString("#0.000",CultureInfo.InvariantCulture) + "ms (min)", new Vector2(32, GraphicsDevice.Viewport.Height - 70), Color.White);
             spriteBatch.DrawString(font, msecMax.ToString("#0.000",CultureInfo.InvariantCulture) + "ms (max)", new Vector2(32, GraphicsDevice.Viewport.Height - 40), Color.White);
             spriteBatch.DrawString(font, msecMax.ToString("#0.000",CultureInfo.InvariantCulture) + "ms (max)", new Vector2(32, GraphicsDevice.Viewport.Height - 40), Color.White);
             spriteBatch.End();
             spriteBatch.End();
-
-
+            
             base.Draw(gameTime);
             base.Draw(gameTime);
         }
         }
 
 

+ 3 - 0
Samples/AnimationContent/Content.mgcb

@@ -25,6 +25,9 @@
 #begin Dude/dude.xnb
 #begin Dude/dude.xnb
 /copy:Dude/dude.xnb
 /copy:Dude/dude.xnb
 
 
+#begin Dude/dude_GPU.xnb
+/copy:Dude/dude_GPU.xnb
+
 #begin Dude/head_0.xnb
 #begin Dude/head_0.xnb
 /copy:Dude/head_0.xnb
 /copy:Dude/head_0.xnb
 
 

File diff suppressed because it is too large
+ 510 - 0
Samples/AnimationContent/Dude/dude_GPU.fbx


BIN
Samples/AnimationContent/Dude/dude_GPU.xnb


+ 7 - 0
Samples/AnimationContent/Samples.AnimationContent.contentproj

@@ -51,6 +51,13 @@
       <Name>GraphicsImporters.WINDOWS.XNA</Name>
       <Name>GraphicsImporters.WINDOWS.XNA</Name>
     </ProjectReference>
     </ProjectReference>
   </ItemGroup>
   </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Dude\dude_GPU.fbx">
+      <Name>dude_GPU</Name>
+      <Importer>FbxImporter</Importer>
+      <Processor>GpuAnimatedModelProcessor</Processor>
+    </Compile>
+  </ItemGroup>
   <Import Project="$(MSBuildExtensionsPath)\Microsoft\XNA Game Studio\$(XnaFrameworkVersion)\Microsoft.Xna.GameStudio.ContentPipeline.targets" />
   <Import Project="$(MSBuildExtensionsPath)\Microsoft\XNA Game Studio\$(XnaFrameworkVersion)\Microsoft.Xna.GameStudio.ContentPipeline.targets" />
   <!--  To modify your build process, add your task inside one of the targets below and uncomment it. 
   <!--  To modify your build process, add your task inside one of the targets below and uncomment it. 
        Other similar extension points exist, see Microsoft.Common.targets.
        Other similar extension points exist, see Microsoft.Common.targets.

Some files were not shown because too many files changed in this diff