Browse Source

New "Export and Run" feature for Max2Babylon

David Catuhe 11 years ago
parent
commit
2c7559c118

BIN
Exporters/3ds Max/Max2Babylon-0.6.3.zip


+ 3 - 0
Exporters/3ds Max/Max2Babylon/2015/Max2Babylon2015.csproj

@@ -168,6 +168,9 @@
     <Compile Include="..\Tools\VNormal.cs">
       <Link>Tools\VNormal.cs</Link>
     </Compile>
+    <Compile Include="..\Tools\WebServer.cs">
+      <Link>Tools\WebServer.cs</Link>
+    </Compile>
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="Properties\Resources.Designer.cs">
       <AutoGen>True</AutoGen>

+ 3 - 1
Exporters/3ds Max/Max2Babylon/BabylonExportActionItem.cs

@@ -1,4 +1,5 @@
-using ActionItem = Autodesk.Max.Plugins.ActionItem;
+using System.Windows.Forms;
+using ActionItem = Autodesk.Max.Plugins.ActionItem;
 
 namespace Max2Babylon
 {
@@ -12,6 +13,7 @@ namespace Max2Babylon
                 form = new ExporterForm(this);
             form.Show();
             form.BringToFront();
+            form.WindowState = FormWindowState.Normal;
 
             return true;
         }

+ 21 - 1
Exporters/3ds Max/Max2Babylon/Exporter/BabylonExporter.Animation.cs

@@ -137,6 +137,16 @@ namespace Max2Babylon
                 keys.Add(generateFunc(index, keyControl));
             }
 
+            var end = Loader.Core.AnimRange.End;
+            if (keys[keys.Count - 1].frame != end / Ticks)
+            {
+                keys.Add(new BabylonAnimationKey()
+                {
+                    frame = end / Ticks,
+                    values = keys[keys.Count - 1].values
+                });
+            }
+
             var babylonAnimation = new BabylonAnimation
             {
                 dataType = dataType,
@@ -207,13 +217,23 @@ namespace Max2Babylon
 
                 if (animationPresent)
                 {
+
+                    if (keys[keys.Count - 1].frame != end / Ticks)
+                    {
+                        keys.Add(new BabylonAnimationKey()
+                        {
+                            frame = end / Ticks,
+                            values = keys[keys.Count - 1].values
+                        });
+                    }
+
                     var babylonAnimation = new BabylonAnimation
                     {
                         dataType = dataType,
                         name = property + " animation",
                         keys = keys.ToArray(),
                         framePerSecond = Loader.Global.FrameRate,
-                        loopBehavior = BabylonAnimation.LoopBehavior.Relative,
+                        loopBehavior = BabylonAnimation.LoopBehavior.Cycle,
                         property = property
                     };
 

+ 3 - 3
Exporters/3ds Max/Max2Babylon/Exporter/BabylonExporter.Mesh.cs

@@ -340,12 +340,12 @@ namespace Max2Babylon
 
             babylonMesh.animations = animations.ToArray();
 
-            if (meshNode.GetBoolProperty("babylonjs_autoanimate"))
+            if (meshNode.GetBoolProperty("babylonjs_autoanimate", 1))
             {
                 babylonMesh.autoAnimate = true;
                 babylonMesh.autoAnimateFrom = (int)meshNode.GetFloatProperty("babylonjs_autoanimate_from");
-                babylonMesh.autoAnimateTo = (int)meshNode.GetFloatProperty("babylonjs_autoanimate_to");
-                babylonMesh.autoAnimateLoop = meshNode.GetBoolProperty("babylonjs_autoanimateloop");
+                babylonMesh.autoAnimateTo = (int)meshNode.GetFloatProperty("babylonjs_autoanimate_to", 100);
+                babylonMesh.autoAnimateLoop = meshNode.GetBoolProperty("babylonjs_autoanimateloop", 1);
             }
 
             babylonScene.MeshesList.Add(babylonMesh);

+ 17 - 1
Exporters/3ds Max/Max2Babylon/Forms/ExporterForm.Designer.cs

@@ -44,6 +44,7 @@
             this.groupBox1 = new System.Windows.Forms.GroupBox();
             this.chkAutoSave = new System.Windows.Forms.CheckBox();
             this.chkHidden = new System.Windows.Forms.CheckBox();
+            this.butExportAndRun = new System.Windows.Forms.Button();
             ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit();
             this.groupBox1.SuspendLayout();
             this.SuspendLayout();
@@ -53,7 +54,7 @@
             this.butExport.Anchor = System.Windows.Forms.AnchorStyles.Top;
             this.butExport.Enabled = false;
             this.butExport.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
-            this.butExport.Location = new System.Drawing.Point(313, 153);
+            this.butExport.Location = new System.Drawing.Point(211, 153);
             this.butExport.Name = "butExport";
             this.butExport.Size = new System.Drawing.Size(197, 27);
             this.butExport.TabIndex = 0;
@@ -212,11 +213,25 @@
             this.chkHidden.Text = "Export hidden objects";
             this.chkHidden.UseVisualStyleBackColor = true;
             // 
+            // butExportAndRun
+            // 
+            this.butExportAndRun.Anchor = System.Windows.Forms.AnchorStyles.Top;
+            this.butExportAndRun.Enabled = false;
+            this.butExportAndRun.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+            this.butExportAndRun.Location = new System.Drawing.Point(414, 153);
+            this.butExportAndRun.Name = "butExportAndRun";
+            this.butExportAndRun.Size = new System.Drawing.Size(197, 27);
+            this.butExportAndRun.TabIndex = 14;
+            this.butExportAndRun.Text = "Export && Run";
+            this.butExportAndRun.UseVisualStyleBackColor = true;
+            this.butExportAndRun.Click += new System.EventHandler(this.butExportAndRun_Click);
+            // 
             // ExporterForm
             // 
             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
             this.ClientSize = new System.Drawing.Size(823, 551);
+            this.Controls.Add(this.butExportAndRun);
             this.Controls.Add(this.groupBox1);
             this.Controls.Add(this.pictureBox2);
             this.Controls.Add(this.butCancel);
@@ -257,5 +272,6 @@
         private System.Windows.Forms.GroupBox groupBox1;
         private System.Windows.Forms.CheckBox chkHidden;
         private System.Windows.Forms.CheckBox chkAutoSave;
+        private System.Windows.Forms.Button butExportAndRun;
     }
 }

+ 28 - 0
Exporters/3ds Max/Max2Babylon/Forms/ExporterForm.cs

@@ -1,4 +1,7 @@
 using System;
+using System.Diagnostics;
+using System.IO;
+using System.Threading.Tasks;
 using System.Windows.Forms;
 
 using Color = System.Drawing.Color;
@@ -27,6 +30,8 @@ namespace Max2Babylon
             Tools.PrepareCheckBox(chkCopyTextures, Loader.Core.RootNode, "babylonjs_copytextures", 1);
             Tools.PrepareCheckBox(chkHidden, Loader.Core.RootNode, "babylonjs_exporthidden");
             Tools.PrepareCheckBox(chkAutoSave, Loader.Core.RootNode, "babylonjs_autosave", 1);
+
+            butExportAndRun.Enabled = WebServer.IsSupported;
         }
 
         private void butBrowse_Click(object sender, EventArgs e)
@@ -39,6 +44,11 @@ namespace Max2Babylon
 
         private async void butExport_Click(object sender, EventArgs e)
         {
+            await DoExport();
+        }
+
+        private async Task<bool> DoExport()
+        {
             Tools.UpdateCheckBox(chkManifest, Loader.Core.RootNode, "babylonjs_generatemanifest");
             Tools.UpdateCheckBox(chkCopyTextures, Loader.Core.RootNode, "babylonjs_copytextures");
             Tools.UpdateCheckBox(chkHidden, Loader.Core.RootNode, "babylonjs_exporthidden");
@@ -102,6 +112,7 @@ namespace Max2Babylon
             butExport.Enabled = false;
             butCancel.Enabled = true;
 
+            bool success = true;
             try
             {
                 exporter.AutoSave3dsMaxFile = chkAutoSave.Checked;
@@ -112,6 +123,7 @@ namespace Max2Babylon
             catch (OperationCanceledException)
             {
                 progressBar.Value = 0;
+                success = false;
             }
             catch (Exception ex)
             {
@@ -119,12 +131,15 @@ namespace Max2Babylon
 
                 currentNode.EnsureVisible();
                 progressBar.Value = 0;
+                success = false;
             }
 
             butCancel.Enabled = false;
             butExport.Enabled = true;
 
             BringToFront();
+
+            return success;
         }
 
         private TreeNode CreateTreeNode(int rank, string text, Color color)
@@ -187,5 +202,18 @@ namespace Max2Babylon
         {
             Loader.Global.EnableAccelerators();
         }
+
+        private async void butExportAndRun_Click(object sender, EventArgs e)
+        {
+            if (await DoExport())
+            {
+                WebServer.SceneFilename = Path.GetFileName(txtFilename.Text);
+                WebServer.SceneFolder = Path.GetDirectoryName(txtFilename.Text);
+
+                Process.Start("http://localhost:" + WebServer.Port);
+
+                WindowState = FormWindowState.Minimized;
+            }
+        }
     }
 }

+ 2 - 2
Exporters/3ds Max/Max2Babylon/Forms/ObjectPropertiesForm.cs

@@ -48,8 +48,8 @@ namespace Max2Babylon
             Tools.PrepareCheckBox(chkShowBoundingBox, objects, "babylonjs_showboundingbox");
             Tools.PrepareCheckBox(chkShowSubMeshesBoundingBox, objects, "babylonjs_showsubmeshesboundingbox");
 
-            Tools.PrepareCheckBox(chkAutoAnimate, objects, "babylonjs_autoanimate");
-            Tools.PrepareCheckBox(chkLoop, objects, "babylonjs_autoanimateloop");
+            Tools.PrepareCheckBox(chkAutoAnimate, objects, "babylonjs_autoanimate", 1);
+            Tools.PrepareCheckBox(chkLoop, objects, "babylonjs_autoanimateloop", 1);
             Tools.PrepareNumericUpDown(nupFrom, objects, "babylonjs_autoanimate_from");
             Tools.PrepareNumericUpDown(nupTo, objects, "babylonjs_autoanimate_to", 100.0f);
         }

+ 2 - 1
Exporters/3ds Max/Max2Babylon/Max2Babylon.csproj

@@ -125,7 +125,8 @@
     <Compile Include="Forms\Vector3Control.Designer.cs">
       <DependentUpon>Vector3Control.cs</DependentUpon>
     </Compile>
-    <Compile Include="Tools\VNormal.cs" />
+    <Compile Include="Tools\VNormal.cs" /> 
+    <Compile Include="Tools\WebServer.cs" />
   </ItemGroup>
   <ItemGroup>
     <Content Include="Refs\Autodesk.Max.dll" />

+ 11 - 3
Exporters/3ds Max/Max2Babylon/Tools/Tools.cs

@@ -462,10 +462,18 @@ namespace Max2Babylon
             }
             else
             {
-                if (!state && checkBox.CheckState == CheckState.Checked ||
-                    state && checkBox.CheckState == CheckState.Unchecked)
+                if (checkBox.ThreeState)
                 {
-                    checkBox.CheckState = CheckState.Indeterminate;
+                    if (!state && checkBox.CheckState == CheckState.Checked ||
+                        state && checkBox.CheckState == CheckState.Unchecked)
+                    {
+                        checkBox.CheckState = CheckState.Indeterminate;
+                        return true;
+                    }
+                }
+                else
+                {
+                    checkBox.CheckState = state ? CheckState.Checked : CheckState.Unchecked;
                     return true;
                 }
             }

+ 152 - 0
Exporters/3ds Max/Max2Babylon/Tools/WebServer.cs

@@ -0,0 +1,152 @@
+using System;
+using System.IO;
+using System.Net;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Max2Babylon
+{
+    public static class WebServer
+    {
+        private static readonly HttpListener listener;
+        private static Task runningTask;
+
+        const string HtmlResponseText = @"
+<!doctype html>
+<html>
+
+<head>
+    <title>Babylon.js</title>
+    <script type='text/javascript' src='http://www.babylonjs.com/cannon.js'></script>
+    <script type='text/javascript' src='http://www.babylonjs.com/babylon.js'></script>
+    <style type='text/css'>
+        html,
+        body,
+        div,
+        canvas {
+            width: 100%;
+            height: 100%;
+            padding: 0;
+            margin: 0;
+            overflow: hidden;
+        }
+    </style>
+</head>
+
+<body>
+    <canvas id='canvas'></canvas>
+    <script type='text/javascript'>
+        var canvas = document.getElementById('canvas');
+        var engine = new BABYLON.Engine(canvas, true);
+
+        BABYLON.SceneLoader.Load('', '###SCENE###', engine, function (newScene) {
+            newScene.executeWhenReady(function () {
+                newScene.activeCamera.attachControl(canvas);
+
+                engine.runRenderLoop(function() {
+                    newScene.render();
+                });
+
+                window.addEventListener('resize', function () {
+                    engine.resize();
+                });
+            });
+        });
+    </script>
+</body>
+</html>";
+
+        public const int Port = 45478;
+
+        public static bool IsSupported { get; private set; }
+
+        static WebServer()
+        {
+            listener = new HttpListener();
+
+            if (!HttpListener.IsSupported)
+            {
+                IsSupported = false;
+                return;
+            }
+
+            try
+            {
+                listener.Prefixes.Add("http://localhost:" + Port + "/");
+                listener.Start();
+            }
+            catch 
+            {
+                IsSupported = false;
+                return;
+            }
+
+            runningTask = Task.Run(() => Listen());
+
+            IsSupported = true;
+        }
+
+        public static string SceneFilename { get; set; }
+        public static string SceneFolder { get; set; }
+
+        static void Listen()
+        {
+            try
+            {
+                while (listener.IsListening)
+                {
+                    var context = listener.GetContext();
+                    var request = context.Request;
+                    var url = request.Url;
+
+                    if (string.IsNullOrEmpty(url.PathAndQuery) || url.PathAndQuery == "/")
+                    {
+                        var responseText = HtmlResponseText.Replace("###SCENE###", SceneFilename);
+                        WriteResponse(context, responseText);
+                    }
+                    else
+                    {
+                        try
+                        {
+                            var buffer = File.ReadAllBytes(Path.Combine(SceneFolder, url.PathAndQuery.Substring(1)));
+                            WriteResponse(context, buffer);
+                        }
+                        catch
+                        {
+                            context.Response.StatusCode = 404;
+                            context.Response.Close();
+                        }
+                    }
+
+                }
+            }
+            catch
+            {
+            }
+        }
+
+        static void WriteResponse(HttpListenerContext context, string s)
+        {
+            WriteResponse(context.Response, s);
+        }
+
+        static void WriteResponse(HttpListenerContext context, byte[] buffer)
+        {
+            WriteResponse(context.Response, buffer);
+        }
+
+        static void WriteResponse(HttpListenerResponse response, string s)
+        {
+            byte[] buffer = Encoding.UTF8.GetBytes(s);
+            WriteResponse(response, buffer);
+        }
+
+        static void WriteResponse(HttpListenerResponse response, byte[] buffer)
+        {
+            response.ContentLength64 = buffer.Length;
+            Stream output = response.OutputStream;
+            output.Write(buffer, 0, buffer.Length);
+            output.Close();
+        }
+    }
+}