Exemplo n.º 1
0
 protected override void OnReceivedMessage(string message, params object[] args)
 {
     if (message == "hud show")
     {
         Show();
     }
     else if (message == "hud hide")
     {
         Hide();
     }
     else if (message == "enable hotbar")
     {
         Enabled = true;
     }
     else if (message == "disable hotbar")
     {
         Enabled = false;
     }
     else if (message == "show dialog")
     {
         Enabled = false;
         Hide();
     }
     else if (message == "close dialog")
     {
         Enabled = true;
         Show();
     }
     else if (message == "set selected item index")
     {
         userData.ItemSelectIndex = MMWMath.Clamp((int)args[0], 0, userData.MaxHotbatItemCount - 1);
     }
 }
Exemplo n.º 2
0
        protected override void Update(double deltaTime)
        {
            base.Update(deltaTime);

            showtime -= deltaTime;

            var l = logs.Count - 1;

            for (var i = l; i > (l - 30) && i >= 0; i--)
            {
                logs[i].position.X = MMWMath.Lerp(logs[i].position.X, 8.0f, MMWMath.Saturate((float)deltaTime * 12.0f));
            }

            if (Input.Ctrl && Input.IsKeyDown(OpenTK.Input.Key.Down))
            {
                Scroll  -= (float)deltaTime * ScrollSpeed;
                showtime = ShowTime;
            }
            else if (Input.Ctrl && Input.IsKeyDown(OpenTK.Input.Key.Up))
            {
                Scroll  += (float)deltaTime * ScrollSpeed;
                showtime = ShowTime;
            }

            var max = logs.Sum(log => log.tex.Size.Height + Interval) + 8.0f - Size.Y;

            if (max < 0.0f)
            {
                max = 0.0f;
            }
            Scroll = MMWMath.Clamp(Scroll, 0.0f, max);
        }
Exemplo n.º 3
0
 protected override void Update(double deltaTime)
 {
     if (!completed && rate == 1.0f && asyncFunc == null)
     {
         var res = syncFunc(asyncResult);
         mes.mes = "";
         LoadCompleted(this, res);
         syncFunc  = null;
         completed = true;
     }
     else if (!completed && rate >= 0.0f && rate < 1.0f)
     {
         rate += (float)deltaTime;
         rate  = MMWMath.Clamp(rate, 0.0f, 1.0f);
         if (rate == 1.0f && asyncFunc != null)
         {
             Task.Factory.StartNew(() =>
             {
                 asyncResult = asyncFunc(mes);
                 asyncFunc   = null;
             });
         }
     }
     else if (completed && rate > 0.0f)
     {
         rate -= (float)deltaTime;
         rate  = MMWMath.Clamp(rate, 0.0f, 1.0f);
         if (rate == 0.0f)
         {
             completed = false;
             rate      = -1.0f;
         }
     }
 }
Exemplo n.º 4
0
        protected override void Draw(double deltaTime, Camera camera)
        {
            if (!Visible)
            {
                return;
            }

            var d = new Vector4(Transform.WorldPosition + new Vector3(0.0f, RenderHeight, 0.0f), 1.0f) * camera.View;

            if (d.Z > 0.0f)
            {
                return;
            }

            var vps = camera.ViewProjection * MatrixHelper.CreateScreen(MMW.RenderResolution.ToVector2());
            var v   = new Vector4(0.0f, RenderHeight, 0.0f, 1.0f) * Transform.WorldTransform * vps;
            var pos = v.Xy / v.W;

            var scale = MMWMath.Clamp(Math.Abs(2.0f / -d.Z), 0.01f, 1.0f);

            pos -= fix;
            var col = new Color4(1.0f, 1.0f, 1.0f, MMWMath.Clamp(1.0f - (-d.Z / 100.0f), 0.0f, 1.0f));

            var g = Drawer.GetGraphics();

            g.DrawString(GameObject.Name, font, Brushes.Black, pos.X + 2, pos.Y + 1);
            g.DrawString(GameObject.Name, font, brush, pos.X, pos.Y);
            Drawer.IsGraphicsUsed = true;
            //Drawer.DrawTexturePixeledAlignment(tex, ContentAlignment.TopLeft, pos.X, pos.Y, col, 0.0f, scale, 200 - (int)(-d.Z), true);
        }
Exemplo n.º 5
0
 public void PrevTab()
 {
     if (Tabs == null)
     {
         return;
     }
     TabIndex = MMWMath.Repeat(TabIndex - 1, 0, 1);
     if (Tabs[TabIndex].Items == null || Tabs[TabIndex].Items.Length == 0)
     {
         return;
     }
     SelectIndex = MMWMath.Clamp(SelectIndex, 0, Tabs[TabIndex].Items.Length - 1);
 }
Exemplo n.º 6
0
        public override void Update(Graphics g, double deltaTime)
        {
            base.Update(g, deltaTime);

            if (IsMouseOn && Input.MouseWheel != 0)
            {
                targetHeight -= Input.MouseWheel * 100.0f;
                targetHeight  = MMWMath.Clamp(targetHeight, -((panels.Count - 1) / 2) * 180.0f, 0.0f);
            }

            dummy.LocalLocation = new Vector2(dummy.LocalLocation.X, MMWMath.Lerp(dummy.LocalLocation.Y, targetHeight, (float)deltaTime * 6.0f));

            foreach (var p in panels)
            {
                p.Update(g, deltaTime);
            }
        }
Exemplo n.º 7
0
        protected override void Update(double deltaTime)
        {
            var cam = MMW.MainCamera;
            var d   = cam.Transform.WorldPosition - cam.Target;

            d.Y = 0.0f;
            d.Normalize();

            var dirZ = d;

            var dirX = dirZ * Matrix3.CreateRotationY(MathHelper.PiOver2);

            var deltaDir = Vector3.Zero;

            if (Input.IsKeyDown(Key.W))
            {
                deltaDir -= dirZ;
            }
            if (Input.IsKeyDown(Key.S))
            {
                deltaDir += dirZ;
            }
            if (Input.IsKeyDown(Key.A))
            {
                deltaDir -= dirX;
            }
            if (Input.IsKeyDown(Key.D))
            {
                deltaDir += dirX;
            }

            if (deltaDir != Vector3.Zero)
            {
                deltaDir.Normalize();
                var move = deltaDir * (float)deltaTime * 6.0f;
                Velocity += move;
                var length = Velocity.Length;
                if (length > 2.5f)
                {
                    length = 2.5f;
                }
                Velocity            = Velocity.Normalized() * length;
                Transform.Position += Velocity * (float)deltaTime;
                //rb.ApplyForce(deltaDir * (float)deltaTime * 12.5f * rb.Mass * 50.0f);
                userData.TotalMoveDistance += (Velocity * (float)deltaTime).Length;

                if (CameraType == "third person")
                {
                    var dot   = -(Vector3.Dot(Transform.WorldDirectionZ, deltaDir) - 1.0f) * 0.5f * MathHelper.Pi;
                    var cross = Vector3.Cross(Transform.WorldDirectionZ, deltaDir);

                    var r = MMWMath.Clamp(dot, 0.0f, (float)deltaTime * 8.0f);

                    if (cross.Y > 0.0f)
                    {
                        Transform.Rotate.Y -= r;
                    }
                    else
                    {
                        Transform.Rotate.Y += r;
                    }
                }
            }
            else
            {
                var length = Velocity.Length;
                length -= (float)deltaTime * 5.0f;
                if (length <= 0.0f)
                {
                    Velocity = Vector3.Zero;
                }
                else
                {
                    Velocity = Velocity.Normalized() * length;
                }
                Transform.Position += Velocity * (float)deltaTime;
            }

            if (Input.IsKeyPressed(Key.Space))
            {
                var wp   = Transform.WorldPosition;
                var rays = Bullet.RayTest(wp + Vector3.UnitY * 0.1f, wp - Vector3.UnitY * 0.2f, GameObject);
                if (rays.Count > 0)
                {
                    rb.ApplyImpulse(Vector3.UnitY * 4.5f * rb.Mass);
                    userData.TotalJumpCount++;
                }
            }

            Transform.UpdatePhysicalTransform();
        }
Exemplo n.º 8
0
        protected override void Update(double deltaTime)
        {
            if (Input.MouseWheel > 0)
            {
                Distance *= 1.1f;
            }
            if (Input.MouseWheel < 0)
            {
                Distance *= 0.9f;
            }
            MMW.MainCamera.Near = Distance * 0.01f;
            MMW.MainCamera.Far  = Distance * 1000.0f;

            var delta = Vector2.Zero;

            if (Input.IsButtonDown(OpenTK.Input.MouseButton.Middle))
            {
                var d = Input.MouseDelta;
                if (d != Vector2.Zero)
                {
                    var up = Vector3.TransformVector(Vector3.UnitY, Matrix4.CreateRotationX(height));
                    up = Vector3.TransformVector(up, Matrix4.CreateRotationY(-rotate));
                    var zz = (MMW.MainCamera.Target - MMW.MainCamera.Transform.Position).Normalized();

                    Vector3 x, y;
                    y = up;
                    x = Vector3.Cross(y, zz);

                    y *= d.Y * Distance * 0.002f;
                    x *= d.X * Distance * 0.002f;

                    Target += y + x;
                }
            }
            else if (Input.IsButtonDown(OpenTK.Input.MouseButton.Right))
            {
                delta = Input.MouseDelta;
            }

            Rotate += delta.X * 0.01f;
            Height += delta.Y * 0.01f;
            Height  = MMWMath.Clamp(Height, -1.5f, 1.5f);

            rotate = MMWMath.Lerp(rotate, Rotate, (float)deltaTime * 30.0f);
            height = MMWMath.Lerp(height, Height, (float)deltaTime * 30.0f);

            Vector3 v;

            v.X = (float)(Math.Sin(rotate) * Math.Cos(height));
            v.Z = (float)(-Math.Cos(rotate) * Math.Cos(height));
            v.Y = (float)Math.Sin(height);

            v *= Distance;
            var dir = -v;

            v += Target;

            MMW.MainCamera.Transform.Position = v;
            MMW.MainCamera.Target             = Target;

            MMW.DirectionalLight.Direction = dir;
        }
Exemplo n.º 9
0
        public ImportedObject[] Import(string path, ImportType type)
        {
            ImportedObject obj = new ImportedObject()
            {
                Result = Result.Failed,
                Type   = ImportedObjectType.Model,
                Path   = path,
            };

            PmxImportResult res;
            {
                var importer = new PmxModelImporter.PmxModelImporter();
                res = importer.Import(path, type == ImportType.Full);
                if (res == null || res.result != PmxImportResult.Result.Success)
                {
                    return(new ImportedObject[] { obj });
                }
            }

            var pmx = res.pmx;

            obj.Result      = Result.Success;
            obj.Name        = pmx.ModelInfo.ModelName;
            obj.Version     = pmx.Header.Version.ToString();
            obj.Description = pmx.ModelInfo.Comment;

            if (type == ImportType.OverviewOnly)
            {
                obj.Result = Result.Success;
                return(new ImportedObject[] { obj });
            }

            // texture
            var textures = new Texture2D[pmx.TextureList.TextureNum];

            for (var i = 0; i < pmx.TextureList.TextureNum; i++)
            {
                var texname = pmx.TextureList.Textures[i];
                if (string.IsNullOrEmpty(texname))
                {
                    continue;
                }

                var texPath = Path.GetDirectoryName(path) + "\\" + texname;

                if (!File.Exists(texPath))
                {
                    continue;
                }

                Texture2D difMap = null;
                Bitmap    bitmap = null;
                try
                {
                    bitmap = (Bitmap)Image.FromFile(texPath);
                }
                catch
                {
                    var ext = Path.GetExtension(texPath).ToLower();
                    if (ext == ".tga")
                    {
                        using (FileStream fs = new FileStream(texPath, FileMode.Open))
                        {
                            using (BinaryReader br = new BinaryReader(fs))
                            {
                                var tga = new TgaLib.TgaImage(br);
                                bitmap = tga.GetBitmap().ToBitmap(PixelFormat.Format32bppArgb);
                            }
                        }
                    }
                }
                difMap           = new Texture2D(bitmap, Path.GetFileNameWithoutExtension(texPath), false);
                difMap.UseMipmap = true;
                difMap.WrapMode  = OpenTK.Graphics.OpenGL4.TextureWrapMode.Repeat;
                difMap.MinFilter = OpenTK.Graphics.OpenGL4.TextureMinFilter.LinearMipmapLinear;
                textures[i]      = difMap;
            }
            obj.Textures = textures;

            // material
            var materials = new List <Material>();
            var colliders = new List <int>();

            for (var i = 0; i < pmx.MaterialList.MaterialNum; i++)
            {
                var mat = pmx.MaterialList.Materials[i];

                // 当たり判定用マテリアル
                if (mat.Name.Contains("collider"))
                {
                    colliders.Add(i);
                }

                var m = new Material(mat.Name);
                m.AddParam("albedo", "Albedo", mat.Diffuse.ToColor4());
                //m.AddParam("specular", "Specular", mat.Specular.ToColor4());
                //m.AddParam("shininess", "Shininess", mat.SpecularPower);
                m.AddParam("emissive", "Emissive", new Color4(0, 0, 0, 0));
                //m.AddParam("ambient", "Ambient", mat.Ambient.ToColor4());

                m.AddParam("roughness", "Roughness", 1.0f - MMWMath.Clamp(mat.SpecularPower / 32.0f, 0.0f, 1.0f));
                m.AddParam("metallic", "Metallic", mat.SpecularPower > 14.0f ? 1.0f : 0.0f);
                m.AddParam("reflectance", "Reflectance", 0.0f);
                //m.AddParam("f0", "F0", (mat.Specular + new Vector3(0.15f, 0.15f, 0.15f)).ToColor4());
                //m.AddParam("f0", "F0", mat.Specular.ToColor4());

                if (mat.AlbedoMapIndex != -1)
                {
                    m.AddParam("albedoMap", "AlbedoMap", textures[mat.AlbedoMapIndex]);
                }
                else
                {
                    m.AddParam <Texture2D>("albedoMap", "AlbedoMap", null);
                }
                m.AddParam <Texture2D>("specularMap", "SpecularMap", null);
                m.AddParam <Texture2D>("normalMap", "NormalMap", null);
                m.AddParam <Texture2D>("physicalMap", "PhysicalMap", null);

                materials.Add(m);
            }
            obj.Materials = materials.ToArray();

            // mesh
            var mesh        = new Mesh(pmx.ModelInfo.ModelName);
            var collideMesh = new Mesh("collider");
            {
                mesh.Vertices    = new OpenTK.Vector3[pmx.VertexList.VertexNum];
                mesh.UVs         = new OpenTK.Vector2[pmx.VertexList.VertexNum];
                mesh.Normals     = new OpenTK.Vector3[pmx.VertexList.VertexNum];
                mesh.BoneWeights = new BoneWeight[pmx.VertexList.VertexNum];

                // 追加UV
                for (var i = 0; i < pmx.Header.AddUVCound; i++)
                {
                    if (i == 0)
                    {
                        mesh.UV1s = new OpenTK.Vector4[pmx.VertexList.VertexNum];
                    }
                    if (i == 1)
                    {
                        mesh.UV2s = new OpenTK.Vector4[pmx.VertexList.VertexNum];
                    }
                    if (i == 2)
                    {
                        mesh.UV3s = new OpenTK.Vector4[pmx.VertexList.VertexNum];
                    }
                    if (i == 3)
                    {
                        mesh.UV4s = new OpenTK.Vector4[pmx.VertexList.VertexNum];
                    }
                }

                for (var i = 0; i < pmx.VertexList.VertexNum; i++)
                {
                    var vert = pmx.VertexList.Vertices[i];
                    var v    = vert.Position.ToVec3(true) * ImportScale;
                    mesh.Vertices[i] = v;
                    mesh.UVs[i]      = vert.UV.ToVec2();
                    mesh.Normals[i]  = vert.Normal.ToVec3(true);

                    for (var j = 0; j < pmx.Header.AddUVCound; j++)
                    {
                        if (j == 0)
                        {
                            mesh.UV1s[i] = vert.UV1.ToVec4();
                        }
                        if (j == 1)
                        {
                            mesh.UV2s[i] = vert.UV2.ToVec4();
                        }
                        if (j == 2)
                        {
                            mesh.UV3s[i] = vert.UV3.ToVec4();
                        }
                        if (j == 3)
                        {
                            mesh.UV4s[i] = vert.UV4.ToVec4();
                        }
                    }

                    mesh.BoneWeights[i].boneIndex0 = vert.BoneIndex0;
                    mesh.BoneWeights[i].boneIndex1 = vert.BoneIndex1;
                    mesh.BoneWeights[i].boneIndex2 = vert.BoneIndex2;
                    mesh.BoneWeights[i].boneIndex3 = vert.BoneIndex3;
                    mesh.BoneWeights[i].weight0    = vert.Weight0;
                    mesh.BoneWeights[i].weight1    = vert.Weight1;
                    mesh.BoneWeights[i].weight2    = vert.Weight2;
                    mesh.BoneWeights[i].weight3    = vert.Weight3;
                }
                collideMesh.Vertices = mesh.Vertices;

                var offset = 0;
                for (var i = 0; i < pmx.MaterialList.MaterialNum; i++)
                {
                    var mat     = pmx.MaterialList.Materials[i];
                    var indices = new int[mat.FaceVertNum];
                    for (var j = 0; j < mat.FaceVertNum / 3; j++)
                    {
                        indices[j * 3 + 0] = pmx.FaceList.Faces[offset++];
                        indices[j * 3 + 1] = pmx.FaceList.Faces[offset++];
                        indices[j * 3 + 2] = pmx.FaceList.Faces[offset++];
                    }
                    if (mat.FaceVertNum > 0)
                    {
                        if (colliders.Exists((c) => c == i))
                        {
                            collideMesh.SetIndices(i, indices, OpenTK.Graphics.OpenGL4.BeginMode.Triangles);
                        }
                        else
                        {
                            mesh.SetIndices(i, indices, OpenTK.Graphics.OpenGL4.BeginMode.Triangles);
                        }
                    }
                }
            }
            var meshes = new List <Mesh>();

            meshes.Add(mesh);
            if (collideMesh.SubMeshCount > 0)
            {
                meshes.Add(collideMesh);
            }
            obj.Meshes = meshes.ToArray();

            // bone
            if (pmx.BoneList != null && pmx.BoneList.BoneNum > 0)
            {
                obj.Bones = CreateBones(pmx.BoneList.Bones);
                BindBones(obj.Bones, pmx.BoneList.Bones);
            }

            // morphs
            var morphs = new List <Morph>();
            // 頂点モーフ
            var vs = CreateVertexMorphs(pmx.MorphList.VertexList);

            if (vs != null)
            {
                morphs.AddRange(vs);
            }
            // ボーンモーフ
            var bs = CreateBoneMorphs(pmx.MorphList.BoneList);

            if (bs != null)
            {
                morphs.AddRange(bs);
            }

            obj.Morphs = morphs.ToArray();

            return(new ImportedObject[] { obj });
        }
Exemplo n.º 10
0
        public ImportedObject[] Import(string path, ImportType type)
        {
            var obj = new ImportedObject()
            {
                Result = Result.Failed,
                Type   = ImportedObjectType.Model,
                Path   = path,
            };

            var importer = new MqoModelImporter.MqoModelImporter();
            var res      = importer.Import(path, type == ImportType.Full);

            if (res == null || res.result != MqoModelImporter.MqoImportResult.Result.Success)
            {
                return(new ImportedObject[] { obj });
            }

            var mqo = res.mqo;

            obj.Name    = Path.GetFileNameWithoutExtension(path);
            obj.Version = mqo.Version.ToString();

            if (type == ImportType.OverviewOnly)
            {
                obj.Result = Result.Success;
                return(new ImportedObject[] { obj });
            }

            #region Material
            // material
            var materials    = new List <Material>();
            var textures     = new List <Texture2D>();
            var texturePaths = new List <string>();
            foreach (var m in mqo.Materials)
            {
                var mat = new Material(m.Name);

                mat.AddParam("albedo", "Albedo", new OpenTK.Graphics.Color4(m.Color.R * m.Diffuse, m.Color.G * m.Diffuse, m.Color.B * m.Diffuse, m.Color.A));
                //mat.AddParam("specular", "Specular", new OpenTK.Graphics.Color4(m.Specular, m.Specular, m.Specular, 1.0f));
                //mat.AddParam("shininess", "Shininess", m.SpecularPower);
                //mat.AddParam("reflect", "Reflect", m.Reflect);
                //mat.AddParam("refract", "Refract", m.Refract);
                //mat.AddParam("ambient", "Ambient", new OpenTK.Graphics.Color4(m.Ambient, m.Ambient, m.Ambient, 1.0f));
                mat.AddParam("emissive", "Emissive", new OpenTK.Graphics.Color4(m.Emissive, m.Emissive, m.Emissive, 0.0f));

                mat.AddParam("roughness", "Roughness", 1.0f - MMWMath.Clamp(m.SpecularPower / 32.0f, 0.0f, 1.0f));
                mat.AddParam("metallic", "Metallic", m.SpecularPower > 14.0f ? 1.0f : 0.0f);
                mat.AddParam("reflectance", "Reflectance", m.Reflect);
                //m.AddParam("f0", "F0", (mat.SpecularColor + new Vector3(0.15f, 0.15f, 0.15f)).ToColor4());
                //mat.AddParam("f0", "F0", new OpenTK.Graphics.Color4(m.Specular, m.Specular, m.Specular, 1.0f));

                Texture2D difMap = null;
                if (!string.IsNullOrEmpty(m.TextureFullpath) && File.Exists(m.TextureFullpath))
                {
                    var index = texturePaths.IndexOf(m.TextureFullpath);
                    if (index == -1)
                    {
                        var bitmap = (Bitmap)Image.FromFile(m.TextureFullpath);
                        difMap           = new Texture2D(bitmap, Path.GetFileNameWithoutExtension(m.TextureFullpath));
                        difMap.UseMipmap = true;
                        difMap.WrapMode  = OpenTK.Graphics.OpenGL4.TextureWrapMode.Repeat;
                        difMap.MinFilter = OpenTK.Graphics.OpenGL4.TextureMinFilter.LinearMipmapLinear;
                        textures.Add(difMap);
                        texturePaths.Add(m.TextureFullpath);
                    }
                    else
                    {
                        difMap = textures[index];
                    }
                    mat.AddParam("albedoMap", "AlbedoMap", difMap);
                }
                else
                {
                    mat.AddParam <Texture2D>("albedoMap", "AlbedoMap", null);
                }
                mat.AddParam <Texture2D>("specularMap", "SpecularMap", null);
                mat.AddParam <Texture2D>("normalMap", "NormalMap", null);
                mat.AddParam <Texture2D>("physicalMap", "PhysicalMap", null);

                Texture2D bumpMap = null;
                if (!string.IsNullOrEmpty(m.BumpMapFullpath) && File.Exists(m.BumpMapFullpath))
                {
                    var index = texturePaths.IndexOf(m.BumpMapFullpath);
                    if (index == -1)
                    {
                        var bitmap = (Bitmap)Image.FromFile(m.BumpMapFullpath);
                        bumpMap          = new Texture2D(bitmap, Path.GetFileNameWithoutExtension(m.BumpMapFullpath));
                        bumpMap.WrapMode = OpenTK.Graphics.OpenGL4.TextureWrapMode.Repeat;
                        textures.Add(difMap);
                        texturePaths.Add(m.BumpMapFullpath);
                    }
                    else
                    {
                        difMap = textures[index];
                    }
                    mat.AddParam("bumpMap", "BumpMap", bumpMap);
                }


                Texture2D alphaMap = null;
                if (!string.IsNullOrEmpty(m.AlphaMapFullpath) && File.Exists(m.AlphaMapFullpath))
                {
                    var index = texturePaths.IndexOf(m.AlphaMapFullpath);
                    if (index == -1)
                    {
                        var bitmap = (Bitmap)Image.FromFile(m.AlphaMapFullpath);
                        alphaMap          = new Texture2D(bitmap, Path.GetFileNameWithoutExtension(m.AlphaMapFullpath));
                        alphaMap.WrapMode = OpenTK.Graphics.OpenGL4.TextureWrapMode.Repeat;
                        textures.Add(difMap);
                        texturePaths.Add(m.AlphaMapFullpath);
                    }
                    else
                    {
                        alphaMap = textures[index];
                    }
                    mat.AddParam("alphaMap", "AlphaMap", alphaMap);
                }

                materials.Add(mat);
            }
            obj.Materials = materials.ToArray();
            obj.Textures  = textures.ToArray();
            #endregion

            if (!CombineMeshes)
            {
                // mesh
                var meshes = new List <Mesh>();
                foreach (var o in mqo.Objects)
                {
                    // vertices
                    var vertices = new List <OpenTK.Vector3>();
                    for (int i = 0; i < o.Vertices.Length; i++)
                    {
                        vertices.Add(new OpenTK.Vector3(o.Vertices[i].X, o.Vertices[i].Y, o.Vertices[i].Z));
                    }

                    // indices
                    var matNum      = mqo.Materials.Length;
                    var indicesList = new List <int> [matNum];
                    var subs        = new List <SubMesh>();

                    // init
                    for (int i = 0; i < matNum; i++)
                    {
                        indicesList[i] = new List <int>();
                        subs.Add(new SubMesh());
                        subs[i].materialIndex = i;
                        subs[i].mode          = BeginMode.Triangles;
                    }

                    // uvs
                    var uvs = new List <OpenTK.Vector2>();
                    for (int i = 0; i < o.Vertices.Length; i++)
                    {
                        uvs.Add(new OpenTK.Vector2(-1.0f, -1.0f));
                    }

                    // face
                    foreach (var face in o.Faces)
                    {
                        var matIndex = face.MaterialIndex;
                        var offset   = indicesList[matIndex].Count;

                        indicesList[matIndex].Add(face.Indices[0]);
                        indicesList[matIndex].Add(face.Indices[1]);
                        indicesList[matIndex].Add(face.Indices[2]);

                        if (face.UVs != null)
                        {
                            for (var i = 0; i < 3; i++)
                            {
                                var faceIndex = face.Indices[i];
                                var newUV     = new OpenTK.Vector2(face.UVs[i].X, face.UVs[i].Y);
                                if (CombineTextures)
                                {
                                    while (newUV.X < 0.0f)
                                    {
                                        newUV.X += 1.0f;
                                    }
                                    while (newUV.Y < 0.0f)
                                    {
                                        newUV.Y += 1.0f;
                                    }
                                    while (newUV.X >= 1.0f)
                                    {
                                        newUV.X -= 1.0f;
                                    }
                                    while (newUV.Y >= 1.0f)
                                    {
                                        newUV.Y -= 1.0f;
                                    }
                                }
                                if (uvs[faceIndex].X == -1.0f && uvs[faceIndex].Y == -1.0f)
                                {
                                    uvs[faceIndex] = newUV;
                                }
                                else
                                {
                                    // UVがかぶったら新しい頂点を追加
                                    var newIndex = vertices.Count;
                                    vertices.Add(vertices[faceIndex]);
                                    indicesList[matIndex][offset + i] = newIndex;
                                    uvs.Add(newUV);
                                }
                            }
                        }
                    }

                    for (int i = 0; i < matNum; i++)
                    {
                        subs[i].indices = indicesList[i].ToArray();
                    }

                    subs.RemoveAll((s) => s.indices.Length == 0);

                    var mesh = new Mesh(o.Name)
                    {
                        Vertices = vertices.ToArray(),
                        UVs      = uvs.ToArray(),
                    };

                    mesh.subMeshes = subs;
                    meshes.Add(mesh);
                }
                obj.Meshes = meshes.ToArray();
            }
            else
            {
                // mesh
                var meshes = new List <Mesh>();
                // vertices
                var vertices = new List <OpenTK.Vector3>();
                var uvs      = new List <OpenTK.Vector2>();
                foreach (var o in mqo.Objects)
                {
                    var vertexOffset = vertices.Count;
                    for (int i = 0; i < o.Vertices.Length; i++)
                    {
                        vertices.Add(new OpenTK.Vector3(o.Vertices[i].X, o.Vertices[i].Y, o.Vertices[i].Z));
                        uvs.Add(new OpenTK.Vector2(-1.0f, -1.0f));
                    }

                    // indices
                    var matNum      = mqo.Materials.Length;
                    var indicesList = new List <int> [matNum];
                    var subs        = new List <SubMesh>();

                    // init
                    for (int i = 0; i < matNum; i++)
                    {
                        indicesList[i] = new List <int>();
                        subs.Add(new SubMesh());
                        subs[i].materialIndex = i;
                        subs[i].mode          = BeginMode.Triangles;
                    }

                    // face
                    foreach (var face in o.Faces)
                    {
                        var matIndex = face.MaterialIndex;
                        var offset   = indicesList[matIndex].Count;

                        indicesList[matIndex].Add(vertexOffset + face.Indices[0]);
                        indicesList[matIndex].Add(vertexOffset + face.Indices[1]);
                        indicesList[matIndex].Add(vertexOffset + face.Indices[2]);

                        if (face.UVs != null)
                        {
                            for (var i = 0; i < 3; i++)
                            {
                                var faceIndex = vertexOffset + face.Indices[i];
                                var newUV     = new OpenTK.Vector2(face.UVs[i].X, face.UVs[i].Y);
                                if (CombineTextures)
                                {
                                    while (newUV.X < 0.0f)
                                    {
                                        newUV.X += 1.0f;
                                    }
                                    while (newUV.Y < 0.0f)
                                    {
                                        newUV.Y += 1.0f;
                                    }
                                    while (newUV.X >= 1.0f)
                                    {
                                        newUV.X -= 1.0f;
                                    }
                                    while (newUV.Y >= 1.0f)
                                    {
                                        newUV.Y -= 1.0f;
                                    }
                                }
                                if (uvs[faceIndex].X == -1.0f && uvs[faceIndex].Y == -1.0f)
                                {
                                    uvs[faceIndex] = newUV;
                                }
                                else
                                {
                                    // UVがかぶったら新しい頂点を追加
                                    var newIndex = vertices.Count;
                                    vertices.Add(vertices[faceIndex]);
                                    indicesList[matIndex][offset + i] = newIndex;
                                    uvs.Add(newUV);
                                }
                            }
                        }
                    }

                    for (int i = 0; i < matNum; i++)
                    {
                        subs[i].indices = indicesList[i].ToArray();
                    }

                    subs.RemoveAll((s) => s.indices.Length == 0);

                    var m = new Mesh(o.Name)
                    {
                        Vertices = vertices.ToArray(),
                        UVs      = uvs.ToArray(),
                    };

                    m.subMeshes = subs;
                    meshes.Add(m);
                }
                obj.Meshes = meshes.ToArray();

                // メッシュを一つにまとめる
                {
                    var mesh = new Mesh(obj.Name);
                    mesh.Vertices = vertices.ToArray();
                    mesh.UVs      = uvs.ToArray();
                    var indicesList = new List <int> [materials.Count];
                    for (var i = 0; i < materials.Count; i++)
                    {
                        indicesList[i] = new List <int>();
                    }

                    foreach (var m in obj.Meshes)
                    {
                        foreach (var sub in m.subMeshes)
                        {
                            indicesList[sub.materialIndex].AddRange(sub.indices);
                        }
                    }

                    for (var i = 0; i < indicesList.Length; i++)
                    {
                        if (indicesList[i].Count == 0)
                        {
                            continue;
                        }
                        mesh.SetIndices(i, indicesList[i].ToArray(), BeginMode.Triangles);
                    }

                    obj.Meshes = new Mesh[] { mesh };
                }
            }

            // テクスチャを一つにまとめる
            if (CombineTextures)
            {
                var gridCount = 1;
                while (gridCount * gridCount < textures.Count)
                {
                    gridCount++;
                }

                var bitmaps = new Bitmap[textures.Count];
                for (var i = 0; i < bitmaps.Length; i++)
                {
                    bitmaps[i] = textures[i].SrcBitmap;
                }

                var bitmap = BitmapHelper.CombineBitmaps(bitmaps, gridCount);
                obj.Textures = new Texture2D[] { new Texture2D(bitmap)
                                                 {
                                                     WrapMode = TextureWrapMode.Repeat,
                                                 } };

                // 全メッシュのUVを補正する
                foreach (var mesh in obj.Meshes)
                {
                    foreach (var sub in mesh.subMeshes)
                    {
                        var mat = materials[sub.materialIndex];
                        if (!mat.HasParam <Texture2D>("albedoMap"))
                        {
                            continue;
                        }
                        var tex      = mat.GetParam <Texture2D>("albedoMap");
                        var texIndex = textures.IndexOf(tex);
                        var x        = texIndex % gridCount;
                        var y        = texIndex / gridCount;

                        foreach (var index in sub.indices)
                        {
                            var uv = mesh.UVs[index] / gridCount;
                            uv += (new OpenTK.Vector2(x, y) / gridCount);
                            mesh.UVs[index] = uv;
                        }
                    }
                }

                foreach (var mat in obj.Materials)
                {
                    if (mat.HasParam <Texture2D>("albedoMap"))
                    {
                        mat.SetParam("albedoMap", obj.Textures[0]);
                    }
                }
            }

            // マテリアルを一つにまとめる
            if (CombineMaterials)
            {
                // パラメータが被っているマテリアルを1つにまとめる
                var mats       = new List <Material>();
                var indexTable = new int[materials.Count];
                for (var i = 0; i < materials.Count; i++)
                {
                    var diffuse = materials[i].GetParam <OpenTK.Graphics.Color4>("albedo");
                    //var specular = materials[i].GetParam<OpenTK.Graphics.Color4>("specular");
                    //var shininess = materials[i].GetParam<float>("shininess");
                    //var reflect = materials[i].GetParam<float>("reflect");
                    //var refract = materials[i].GetParam<float>("refract");
                    //var ambient = materials[i].GetParam<float>("ambient");
                    var emissive = materials[i].GetParam <float>("emissive");
                    var difMap   = materials[i].GetParam <Texture2D>("albedoMap");
                    var alphaMap = materials[i].GetParam <Texture2D>("alphaMap");
                    var bumpMap  = materials[i].GetParam <Texture2D>("bumpMap");

                    var m = mats.Find((mat) =>
                    {
                        bool same = true;
                        same      = same && diffuse == mat.GetParam <OpenTK.Graphics.Color4>("albedo");
                        //same = same && specular == mat.GetParam<OpenTK.Graphics.Color4>("specular");
                        //same = same && shininess == mat.GetParam<float>("shininess");
                        //same = same && reflect == mat.GetParam<float>("reflect");
                        //same = same && refract == mat.GetParam<float>("refract");
                        //same = same && ambient == mat.GetParam<float>("ambient");
                        same = same && emissive == mat.GetParam <float>("emissive");
                        if (difMap == null)
                        {
                            same = same && mat.GetParam <Texture2D>("albedoMap") == null;
                        }
                        else
                        {
                            same = same && difMap == mat.GetParam <Texture2D>("albedoMap");
                        }
                        if (alphaMap == null)
                        {
                            same = same && mat.GetParam <Texture2D>("alphaMap") == null;
                        }
                        else
                        {
                            same = same && alphaMap == mat.GetParam <Texture2D>("alphaMap");
                        }
                        if (bumpMap == null)
                        {
                            same = same && mat.GetParam <Texture2D>("bumpMap") == null;
                        }
                        else
                        {
                            same = same && bumpMap == mat.GetParam <Texture2D>("bumpMap");
                        }

                        return(same);
                    });

                    if (m != null)
                    {
                        indexTable[i] = mats.IndexOf(m);
                    }
                    else
                    {
                        mats.Add(materials[i]);
                        indexTable[i] = mats.Count - 1;
                    }
                }

                foreach (var mesh in obj.Meshes)
                {
                    foreach (var sub in mesh.subMeshes)
                    {
                        sub.materialIndex = indexTable[sub.materialIndex];
                    }
                }

                obj.Materials = mats.ToArray();
            }

            if (CombineMeshes && CombineMaterials)
            {
                var indices = new List <int> [materials.Count];
                foreach (var sub in obj.Meshes[0].subMeshes)
                {
                    if (indices[sub.materialIndex] == null)
                    {
                        indices[sub.materialIndex] = new List <int>();
                    }
                    indices[sub.materialIndex].AddRange(sub.indices);
                }

                obj.Meshes[0].subMeshes.Clear();

                for (var i = 0; i < materials.Count; i++)
                {
                    if (indices[i] == null)
                    {
                        continue;
                    }
                    obj.Meshes[0].SetIndices(i, indices[i].ToArray(), BeginMode.Triangles);
                }
            }

            return(new ImportedObject[] { obj });
        }
        protected override void Update(double deltaTime)
        {
            base.Update(deltaTime);

            var cam     = MMW.MainCamera;
            var prevPos = cam.Transform.Position;

            if (CameraType == "third person")
            {
                GameObject.GetComponent <MeshRenderer>().Visible = true;
                MMW.MainCamera.FoV = 1.2f;
                var center = Target != null ? Target.WorldPosition : Vector3.Zero;

                targetRot    -= Input.MouseDelta.X * 0.005f;
                targetHeight += Input.MouseDelta.Y * 0.005f;
                targetHeight  = MMWMath.Clamp(targetHeight, -MathHelper.PiOver6, MathHelper.PiOver2 - 0.3f);

                rot    = MMWMath.Lerp(rot, targetRot, (float)deltaTime * 16.0f);
                height = MMWMath.Lerp(height, targetHeight, (float)deltaTime * 16.0f);
                Vector3.Lerp(ref target, ref center, (float)deltaTime * 6.0f, out target);

                var y = Math.Sin(height);
                var x = Math.Cos(height) * Math.Sin(rot);
                var z = Math.Cos(height) * Math.Cos(rot);

                var dx = (float)Math.Sin(MMW.TotalElapsedTime * 0.5);
                var dy = (float)Math.Cos(MMW.TotalElapsedTime * 0.7);
                var dz = (float)Math.Cos(MMW.TotalElapsedTime * 0.3);

                var pos = new Vector3((float)x, (float)y, (float)z) * Distance;
                pos += target;

                var rays = Physics.Bullet.RayTest(target, Vector3.Lerp(target, pos, 1.1f), GameObject);
                if (rays.Count > 0)
                {
                    var l   = rays.Min(r => r.Rate);
                    var ray = rays.Find(r => r.Rate == l);
                    if (ray != null)
                    {
                        pos = Vector3.Lerp(target, ray.Position, 0.9f);
                    }
                }

                var nx = Noise.Fbm((float)MMW.TotalElapsedTime * 0.15f * NoiseSpeed, 3) * 0.01f;
                var ny = Noise.Fbm((float)MMW.TotalElapsedTime * 0.1f * NoiseSpeed, 4) * 0.01f;
                var nz = Noise.Fbm((float)MMW.TotalElapsedTime * 0.05f * NoiseSpeed, 5) * 0.01f;
                var rt = new Vector3(nx, ny, nz) * NoiseIntensity * 7.0f;
                var rp = new Vector3(ny, nz, nx) * NoiseIntensity * 4.0f;

                cam.Up                 = Matrix3.CreateRotationZ(nx * NoiseIntensity * 2.0f) * Vector3.UnitY;
                cam.Target             = target + rt;
                cam.Transform.Position = pos + rp;
            }
            else if (CameraType == "first person")
            {
                GameObject.GetComponent <MeshRenderer>().Visible = false;
                MMW.MainCamera.FoV  = 1.4f;
                Transform.Rotate.Y += Input.MouseDelta.X * 0.005f;

                var t = new Vector4(pi.Character.EyePosition, 1.0f) * Transform.WorldTransform;
                cam.Transform.Position = t.Xyz;

                fpHeight -= Input.MouseDelta.Y * 0.005f;
                fpHeight  = MMWMath.Clamp(fpHeight, -MathHelper.PiOver2 + 0.1f, MathHelper.PiOver2 - 0.1f);
                var dir = ct.WorldDirectionZ;
                dir   *= (float)Math.Cos(fpHeight);
                dir.Y += (float)Math.Sin(fpHeight);

                var target = dir + t.Xyz;
                Vector3.Lerp(ref nowDir, ref target, (float)deltaTime * 30.0f, out nowDir);
                cam.Target = nowDir;
            }
        }
Exemplo n.º 12
0
        public ImportedObject[] Import(string path, ImportType type)
        {
            ImportedObject obj = new ImportedObject()
            {
                Result = Result.Failed,
                Type   = ImportedObjectType.Model,
                Path   = path,
            };

            PmdImportResult res;
            {
                var importer = new PmdModelImporter.PmdModelImporter();
                res = importer.Import(path, type == ImportType.Full);
                if (res == null || res.result != PmdImportResult.Result.Success)
                {
                    return(new ImportedObject[] { obj });
                }
            }

            var pmd = res.pmd;

            obj.Result      = Result.Success;
            obj.Name        = pmd.Header.Name;
            obj.Version     = pmd.Header.Version.ToString();
            obj.Description = pmd.Header.Comment;

            if (type == ImportType.OverviewOnly)
            {
                obj.Result = Result.Success;
                return(new ImportedObject[] { obj });
            }

            // texture
            var texturePathes = new List <string>();
            var textures      = new List <Texture2D>();

            // material
            var materials = new List <Material>();

            for (var i = 0; i < pmd.MaterialList.MaterialNum; i++)
            {
                var mat = pmd.MaterialList.Materials[i];
                var m   = new Material();
                m.AddParam("albedo", "Albedo", mat.DiffuseColor.ToColor4(mat.Alpha));
                //m.AddParam("specular", "Specular", mat.SpecularColor.ToColor4());
                //m.AddParam("shininess", "Shininess", mat.SpecularPower);
                m.AddParam("emissive", "Emissive", new Color4(0, 0, 0, 0));
                // m.AddParam("ambient", "Ambient", mat.AmbientColor.ToColor4());

                m.AddParam("roughness", "Roughness", 1.0f - MMWMath.Clamp(mat.SpecularPower / 32.0f, 0.0f, 1.0f));
                m.AddParam("metallic", "Metallic", mat.SpecularPower > 14.0f ? 1.0f : 0.0f);
                m.AddParam("reflectance", "Reflectance", 0.0f);
                //m.AddParam("f0", "F0", (mat.SpecularColor + new Vector3(0.15f, 0.15f, 0.15f)).ToColor4());
                //m.AddParam("f0", "F0", mat.SpecularColor.ToColor4());

                if (!string.IsNullOrEmpty(mat.TextureFileName))
                {
                    mat.TextureFileName = Path.GetDirectoryName(path) + "\\" + mat.TextureFileName;

                    if (File.Exists(mat.TextureFileName))
                    {
                        Texture2D difMap = null;
                        var       index  = texturePathes.IndexOf(mat.TextureFileName);
                        if (index == -1)
                        {
                            Bitmap bitmap = null;
                            try
                            {
                                bitmap = (Bitmap)Image.FromFile(mat.TextureFileName);
                            }
                            catch
                            {
                                var ext = Path.GetExtension(mat.TextureFileName).ToLower();
                                if (ext == ".tga")
                                {
                                    using (FileStream fs = new FileStream(mat.TextureFileName, FileMode.Open))
                                    {
                                        using (BinaryReader br = new BinaryReader(fs))
                                        {
                                            var tga = new TgaLib.TgaImage(br);
                                            bitmap = tga.GetBitmap().ToBitmap(PixelFormat.Format32bppPArgb);
                                        }
                                    }
                                }
                            }
                            difMap           = new Texture2D(bitmap, Path.GetFileNameWithoutExtension(mat.TextureFileName), false);
                            difMap.UseMipmap = true;
                            difMap.WrapMode  = OpenTK.Graphics.OpenGL4.TextureWrapMode.Repeat;
                            difMap.MinFilter = OpenTK.Graphics.OpenGL4.TextureMinFilter.LinearMipmapLinear;
                            textures.Add(difMap);
                            texturePathes.Add(mat.TextureFileName);
                        }
                        else
                        {
                            difMap = textures[index];
                        }
                        m.AddParam("albedoMap", "AlbedoMap", difMap);
                    }
                }
                else
                {
                    m.AddParam <Texture2D>("albedoMap", "AlbedoMap", null);
                }
                m.AddParam <Texture2D>("specularMap", "SpecularMap", null);
                m.AddParam <Texture2D>("normalMap", "NormalMap", null);
                m.AddParam <Texture2D>("physicalMap", "PhysicalMap", null);

                materials.Add(m);
            }
            obj.Materials = materials.ToArray();
            obj.Textures  = textures.ToArray();

            // mesh
            var mesh = new Mesh(pmd.Header.Name);

            {
                mesh.Vertices    = new OpenTK.Vector3[pmd.VertexList.VertexNum];
                mesh.UVs         = new OpenTK.Vector2[pmd.VertexList.VertexNum];
                mesh.Normals     = new OpenTK.Vector3[pmd.VertexList.VertexNum];
                mesh.BoneWeights = new BoneWeight[pmd.VertexList.VertexNum];

                for (var i = 0; i < pmd.VertexList.VertexNum; i++)
                {
                    var vert = pmd.VertexList.Vertices[i];
                    var v    = vert.Position.ToVec3() * ImportScale;
                    mesh.Vertices[i]               = v;
                    mesh.Vertices[i].Z            *= -1.0f;
                    mesh.UVs[i]                    = vert.UV.ToVec2();
                    mesh.Normals[i]                = vert.Normal.ToVec3();
                    mesh.Normals[i].Z             *= -1.0f;
                    mesh.BoneWeights[i].boneIndex0 = vert.BoneIndex0;
                    mesh.BoneWeights[i].boneIndex1 = vert.BoneIndex1;
                    if (mesh.BoneWeights[i].boneIndex1 == 0)
                    {
                        mesh.BoneWeights[i].boneIndex1 = -1;
                    }
                    mesh.BoneWeights[i].boneIndex2 = -1;
                    mesh.BoneWeights[i].boneIndex3 = -1;
                    mesh.BoneWeights[i].weight0    = 1.0f - vert.Weight;
                    mesh.BoneWeights[i].weight1    = vert.Weight;
                }

                var offset = 0;
                for (var i = 0; i < pmd.MaterialList.MaterialNum; i++)
                {
                    var mat     = pmd.MaterialList.Materials[i];
                    var indices = new int[mat.FaceVertNum];
                    for (var j = 0; j < mat.FaceVertNum / 3; j++)
                    {
                        indices[j * 3 + 0] = pmd.FaceList.Indices[offset++];
                        indices[j * 3 + 1] = pmd.FaceList.Indices[offset++];
                        indices[j * 3 + 2] = pmd.FaceList.Indices[offset++];
                    }
                    if (mat.FaceVertNum > 0)
                    {
                        mesh.SetIndices(i, indices, OpenTK.Graphics.OpenGL4.BeginMode.Triangles);
                    }
                }
            }
            obj.Meshes = new Mesh[] { mesh };

            // bone
            if (pmd.BoneList != null && pmd.BoneList.BoneNum > 0)
            {
                obj.Bones = CreateBones(pmd.BoneList.Bones);
                BindBones(obj.Bones, pmd.BoneList.Bones, pmd.IKList.IKs);
            }

            // morph
            if (pmd.MorphList != null && pmd.MorphList.MorphNum > 0)
            {
                obj.Morphs = new Morph[pmd.MorphList.MorphNum];

                for (var i = 0; i < pmd.MorphList.MorphNum; i++)
                {
                    obj.Morphs[i] = new Morph();

                    var m = pmd.MorphList.Morphs[i];

                    obj.Morphs[i].Name     = m.Name;
                    obj.Morphs[i].Vertices = new VertexMorph[m.SkinVertCount];
                    for (var j = 0; j < m.SkinVertCount; j++)
                    {
                        obj.Morphs[i].Vertices[j]        = new VertexMorph();
                        obj.Morphs[i].Vertices[j].Index  = (int)m.Data[j].Index;
                        obj.Morphs[i].Vertices[j].Offset = m.Data[j].Offset.ToVec3(true) * ImportScale;
                    }
                }
            }

            return(new ImportedObject[] { obj });
        }
Exemplo n.º 13
0
        private void SetControlParameters(NwObject obj)
        {
            // textures
            textures.AddRange(obj.Texture2Ds);

            // general
            textBox_name.Text    = obj.Name;
            textBox_version.Text = obj.Version;
            textBox_desc.Text    = obj.Description;
            textBox_editor.Text  = obj.Editor;
            textBox_url.Text     = obj.EditorURL;
            textBox_tags.Text    = obj.Tags;

            if (obj.Thumbnail != null)
            {
                pictureBox_thumbnail.Image = Util.ToBitmap(obj.Thumbnail.Image);
            }
            else
            {
                pictureBox_thumbnail.Image = null;
            }

            // item
            comboBox_itemType.SelectedItem   = obj.ItemType;
            numericUpDown_price.Value        = MMWMath.Clamp((int)obj.ItemPrice, 0, 1000);
            checkBox_itemConsume.Checked     = obj.ItemConsume;
            numericUpDown_maxStack.Value     = MMWMath.Clamp(obj.MaxStack, 1, 99);
            checkBox_itemSync.Checked        = obj.Sync;
            checkBox_itemPurchasable.Checked = obj.Purchasable;

            // materials
            listBox_material.DisplayMember = "Name";
            foreach (var mat in obj.Materials)
            {
                listBox_material.Items.Add(mat);
            }
            listBox_material.SelectedIndex = 0;

            // physics
            if (obj.CollisionShape is NwCollisionCapsule)
            {
                radioButton_capsule.Checked = true;
            }
            else if (obj.CollisionShape is NwCollisionCylinder)
            {
                radioButton_cylinder.Checked = true;
            }
            else if (obj.CollisionShape is NwCollisionBox)
            {
                radioButton_box.Checked = true;
            }
            else if (obj.CollisionShape is NwCollisionSphere)
            {
                radioButton_sphere.Checked = true;
            }
            else if (obj.CollisionShape is NwCollisionMesh)
            {
                radioButton_mesh.Checked = true;
            }
            checkBox_isRigidBody.Checked = obj.PhysicalMaterial.IsRigidBody;
            if (obj.PhysicalMaterial.IsRigidBody)
            {
                numericUpDown_mass.Value             = (decimal)obj.PhysicalMaterial.Mass;
                checkBox_freezePosition.Checked      = obj.PhysicalMaterial.FreezePosition;
                checkBox_freezeRotation.Checked      = obj.PhysicalMaterial.FreezeRotation;
                checkBox_kinematic.Checked           = obj.PhysicalMaterial.Kinematic;
                checkBox_disableDeactivation.Checked = obj.PhysicalMaterial.DisableDeactivation;

                slider_friction.Value        = obj.PhysicalMaterial.Friction;
                slider_rollingFriction.Value = obj.PhysicalMaterial.RollingFriction;
                slider_restitution.Value     = obj.PhysicalMaterial.Restitution;
                slider_linearDamping.Value   = obj.PhysicalMaterial.LinearDamping;
                slider_angulerDamping.Value  = obj.PhysicalMaterial.AngulerDamping;
            }

            // motions
            foreach (var m in obj.Motions)
            {
                var i = dataGridView_motion.Rows.Add(m.Key, m.Name);
                dataGridView_motion.Rows[i].Tag = m;
            }

            // morphs

            // sounds
            foreach (var s in obj.Sounds)
            {
                var i   = dataGridView_sound.Rows.Add();
                var row = dataGridView_sound.Rows[i];
                row.Cells[0].Value = s.Name;

                var path = System.Environment.CurrentDirectory + "/tempsound_" + Util.CreateHash();
                File.WriteAllBytes(path, s.Data);
                var afd     = new AudioFileReader(path);
                var waveOut = new WaveOut();
                waveOut.Init(afd);

                row.Tag = new Tuple <AudioFileReader, WaveOut, byte[], string>(afd, waveOut, s.Data, s.Format);
            }

            // scripts
            foreach (var s in obj.Scripts)
            {
                var asm  = Assembly.Load(s.Assembly);
                var type = asm.GetExportedTypes().Where(t => t.IsSubclassOf(typeof(GameObjectScript))).ToArray()[0];
                var inst = asm.CreateInstance(type.FullName) as GameObjectScript;

                listBox_scripts.Items.Add(new ScriptInfo()
                {
                    Assembly = s.Assembly,
                    Script   = inst,
                });
            }

            // property
            var idx = 0;

            foreach (var p in obj.Properties)
            {
                idx = dataGridView_property.Rows.Add(1);
                dataGridView_property[0, idx].Value = p.Key;
                dataGridView_property[1, idx].Value = p.Value;
            }
        }