Esempio n. 1
0
        private byte[] ConvertWorld(ImportedObject obj)
        {
            var world = new NwWorld();

            {
                var texs = new List <NwTexture2D>();
                foreach (var t in obj.Textures)
                {
                    var bm = AssetConverter.ToNwTexture2D(t.SrcBitmap, t.Name);
                    texs.Add(bm);
                }

                var cubes = new List <NwCubemap>();
                cubes.Add(AssetConverter.ToNwTextureCube(new Bitmap[]
                {
                    Resources.posx2,
                    Resources.posy2,
                    Resources.posz2,
                    Resources.negx2,
                    Resources.negy2,
                    Resources.negz2,
                }, null));

                var mats = new List <NwMaterial>();
                foreach (var m in obj.Materials)
                {
                    var mat = AssetConverter.ToNwMaterial(m, m.Name, ref texs, ref cubes);
                    mats.Add(mat);
                }
                world.Texture2Ds = texs.ToArray();
                world.Cubemaps   = cubes.ToArray();
                world.Materials  = mats.ToArray();

                var meshes = new List <NwMesh>();
                foreach (var mesh in obj.Meshes)
                {
                    meshes.Add(AssetConverter.ToNwMesh(mesh));
                }
                world.Meshes = meshes.ToArray();

                var colMeshes = new List <NwColliderMesh>();
                foreach (var mesh in obj.Meshes)
                {
                    colMeshes.Add(AssetConverter.ToNwColliderMesh(mesh));
                }
                world.ColliderMeshes = colMeshes.ToArray();

                world.Environments    = new NwEnvironment[1];
                world.Environments[0] = new NwEnvironment()
                {
                    EnvMap = world.Cubemaps[0].Hash,
                };
            }
            var json = Util.SerializeJson(world);
            var comp = Util.Compress(Encoding.UTF8.GetBytes(json));

            return(comp);
        }
Esempio n. 2
0
        private NwObject ConvertObject(ImportedObject obj)
        {
            var o = new NwObject();

            {
                o.Name        = obj.Name;
                o.Description = obj.Description;
                o.Version     = obj.Version;
                o.Editor      = obj.Editor;
                o.EditorURL   = obj.EditorURL;

                var texs = new List <NwTexture2D>();
                foreach (var t in obj.Textures)
                {
                    var bm = AssetConverter.ToNwTexture2D(t.SrcBitmap, t.Name);
                    texs.Add(bm);
                }

                var cubes = new List <NwCubemap>();

                var mats = new List <NwMaterial>();
                foreach (var m in obj.Materials)
                {
                    var mat = AssetConverter.ToNwMaterial(m, m.Name, ref texs, ref cubes);
                    mats.Add(mat);
                }
                o.Texture2Ds = texs.ToArray();
                o.Cubemaps   = cubes.ToArray();
                o.Materials  = mats.ToArray();

                if (obj.Bones != null)
                {
                    var bones = new List <NwBone>();

                    foreach (var b in obj.Bones)
                    {
                        var bone = AssetConverter.ToNwBone(b);
                        bones.Add(bone);
                    }
                    o.Bones = bones.ToArray();
                }


                o.Mesh = AssetConverter.ToNwMesh(obj.Meshes[0]);

                o.CollisionShape = new NwCollisionCapsule()
                {
                    Height = 1.6f,
                    Radius = 0.3f,
                };

                o.PhysicalMaterial = new NwPhysicalMaterial();
            }
            return(o);
        }
        protected override void OnLoad()
        {
            base.OnLoad();

            SelectedStage = null;

            input       = new MenuInputResolver();
            input.Up    = Key.W;
            input.Down  = Key.S;
            input.Right = Key.D;
            input.Left  = Key.A;

            load = MMW.FindGameComponent <InitLoading>();
            if (load.State != InitLoading.LoadingState.Finished)
            {
                load.LoadCompleted += Load_LoadCompleted;
            }

            transit = new TransitControl();
            transit.LocalLocation = new Vector2(MMW.ClientSize.Width * 2.0f, 0);
            transit.Size          = new Vector2(MMW.ClientSize.Width, MMW.ClientSize.Height);
            transit.Target        = Vector2.Zero;

            tabCtr = new TabControl()
            {
                Parent        = transit,
                LocalLocation = new Vector2(100, 164),
                Size          = new Vector2((MMW.ClientSize.Width / 2) - 100 - 64, MMW.ClientSize.Height - 164 - 48),
                Tabs          = new Tab[]
                {
                    new Tab()
                    {
                        Name = "PRESET", Items = load.PresetStages,
                    },
                    new Tab()
                    {
                        Name = "FREE", Items = load.FreeStages,
                    },
                },
                Focus = true,
            };

            label = new Label()
            {
                Parent        = transit,
                Alignment     = ContentAlignment.TopCenter,
                Text          = "STAGE SELECT",
                Font          = new Font("Yu Gothic UI Light", 40.0f),
                LocalLocation = new Vector2(0.0f, 32.0f),
            };
        }
Esempio n. 4
0
        private NwCharacter ConvertCharacter(ImportedObject obj)
        {
            var c = new NwCharacter();

            {
                c.Name        = obj.Name;
                c.Description = obj.Description;
                c.Version     = obj.Version;
                c.Editor      = obj.Editor;
                c.EditorURL   = obj.EditorURL;

                var texs = new List <NwTexture2D>();
                foreach (var t in obj.Textures)
                {
                    var bm = AssetConverter.ToNwTexture2D(t.SrcBitmap, t.Name);
                    texs.Add(bm);
                }

                var cubes = new List <NwCubemap>();

                var mats = new List <NwMaterial>();
                foreach (var m in obj.Materials)
                {
                    var mat = AssetConverter.ToNwMaterial(m, m.Name, ref texs, ref cubes);
                    mats.Add(mat);
                }
                c.Texture2Ds = texs.ToArray();
                c.Cubemaps   = cubes.ToArray();
                c.Materials  = mats.ToArray();

                var bones = new List <NwBone>();
                foreach (var b in obj.Bones)
                {
                    var bone = AssetConverter.ToNwBone(b);
                    bones.Add(bone);
                }
                c.Bones = bones.ToArray();

                c.Mesh = AssetConverter.ToNwMesh(obj.Meshes[0]);

                c.CollisionShape = new NwCollisionCapsule()
                {
                    Height = 1.6f,
                    Radius = 0.3f,
                };

                c.Mass = 50.0f;
            }
            return(c);
        }
Esempio n. 5
0
        private byte[] ConvertCharacter(ImportedObject obj)
        {
            var ch = new NwCharacter();

            {
                ch.Name = obj.Name;

                var texs = new List <NwTexture2D>();
                foreach (var t in obj.Textures)
                {
                    var bm = AssetConverter.ToNwTexture2D(t.SrcBitmap, t.Name);
                    texs.Add(bm);
                }

                var cubes = new List <NwCubemap>();

                var mats = new List <NwMaterial>();
                foreach (var m in obj.Materials)
                {
                    var mat = AssetConverter.ToNwMaterial(m, m.Name, ref texs, ref cubes);
                    mats.Add(mat);
                }
                ch.Texture2Ds = texs.ToArray();
                ch.Cubemaps   = cubes.ToArray();
                ch.Materials  = mats.ToArray();

                var bones = new List <NwBone>();
                foreach (var b in obj.Bones)
                {
                    var bone = AssetConverter.ToNwBone(b);
                    bones.Add(bone);
                }
                ch.Bones = bones.ToArray();

                ch.Mesh = AssetConverter.ToNwMesh(obj.Meshes[0]);

                //ch.Height = 1.6f;
                //ch.WidthRadius = 0.3f;
                ch.EyePosition = new Vector3f(0.0f, 1.42f, 0.2f);
                ch.Mass        = 50.0f;
            }

            var json = Util.SerializeJson(ch);
            var comp = Util.Compress(Encoding.UTF8.GetBytes(json));

            return(comp);
        }
Esempio n. 6
0
        private void textBox_inputPath_TextChanged(object sender, EventArgs e)
        {
            button_output.Enabled = false;
            Cursor = Cursors.WaitCursor;

            var ext      = Path.GetExtension(textBox_inputPath.Text);
            var importer = importers.Find((i) => Array.Exists(i.Extensions, (ex) => ex == ext));

            if (importer == null)
            {
                textBox_desc.AppendText(string.Format("{0} を読み込める適切なインポータが存在しません\r\n\r\n", ext));
                Cursor = Cursors.Default;
                return;
            }

            textBox_desc.AppendText(string.Format("{0}を読み込み中...\r\n", textBox_inputPath.Text));

            try
            {
                obj = importer.Import(textBox_inputPath.Text, ImportType.Full)[0];
            }
            catch
            {
                textBox_desc.AppendText("読み込み中にエラーが発生しました.出力を中止します.\r\n\r\n");
                Cursor = Cursors.Default;
                return;
            }

            textBox_name.Text        = obj.Name;
            textBox_ver.Text         = obj.Version;
            textBox_author.Text      = obj.Author;
            textBox_editor.Text      = obj.Editor;
            textBox_description.Text = obj.Description;

            button_output.Enabled = true;
            Cursor = Cursors.Default;

            textBox_desc.AppendText(string.Format("準備完了.\r\n"));
        }
Esempio n. 7
0
        private byte[] ConvertObject(ImportedObject obj)
        {
            var o = new NwObject();

            {
                o.Name = obj.Name;

                var texs = new List <NwTexture2D>();
                foreach (var t in obj.Textures)
                {
                    var bm = AssetConverter.ToNwTexture2D(t.SrcBitmap, t.Name);
                    texs.Add(bm);
                }

                var cubes = new List <NwCubemap>();

                var mats = new List <NwMaterial>();
                foreach (var m in obj.Materials)
                {
                    var mat = AssetConverter.ToNwMaterial(m, m.Name, ref texs, ref cubes);
                    mats.Add(mat);
                }
                o.Texture2Ds = texs.ToArray();
                o.Cubemaps   = cubes.ToArray();
                o.Materials  = mats.ToArray();
                o.Mesh       = AssetConverter.ToNwMesh(obj.Meshes[0]);

                //o.Height = 1.6f;
                //o.WidthRadius = 0.3f;

                o.PhysicalMaterial = new NwPhysicalMaterial();
            }
            var json = Util.SerializeJson(o);
            var comp = Util.Compress(Encoding.UTF8.GetBytes(json));

            return(comp);
        }
Esempio n. 8
0
        public ImportedObject[] Import(string path, ImportType type)
        {
            ImportedObject obj = new ImportedObject()
            {
                Result = Result.Failed,
                Type   = ImportedObjectType.Motion,
                Path   = path,
            };

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

            var vmd = res.vmd;

            obj.Result   = Result.Success;
            obj.Name     = Path.GetFileNameWithoutExtension(path);
            obj.Property = new ImportedProperty()
            {
                Name = vmd.Header.ModelName
            };

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

            var anim = new Motion();

            anim.Name = obj.Name;
            var max = 0;

            // bone
            {
                var dic = new Dictionary <string, BoneMotion>();
                foreach (var m in vmd.MotionList.Motions)
                {
                    BoneMotion bm = null;
                    if (!dic.ContainsKey(m.Name))
                    {
                        dic.Add(m.Name, bm = new BoneMotion()
                        {
                            BoneName = m.Name,
                            Keys     = new List <KeyFrame <BoneMotionValue> >(),
                        });
                    }
                    bm = dic[m.Name];

                    var key = new KeyFrame <BoneMotionValue>();
                    key.FrameNo = (int)m.FrameNo;
                    if (key.FrameNo > max)
                    {
                        max = key.FrameNo;
                    }
                    key.Value = new BoneMotionValue()
                    {
                        location = m.Location.ToVec3(true) * ImportScale,
                        rotation = m.Rotation.ToQuaternion(),
                        scale    = OpenTK.Vector3.One,
                    };

                    key.Interpolate = new BezierInterpolate()
                    {
                        p1 = new OpenTK.Vector2(m.BezierX1.W, m.BezierY1.W),
                        p2 = new OpenTK.Vector2(m.BezierX2.W, m.BezierY2.W),
                    };

                    bm.Keys.Add(key);
                }
                foreach (var bm in dic.Values)
                {
                    bm.Keys.Sort((k1, k2) => { return(k1.FrameNo - k2.FrameNo); });
                }
                anim.BoneMotions = dic;
            }

            // skin
            {
                var dic = new Dictionary <string, SkinMotion>();
                foreach (var s in vmd.SkinList.Skins)
                {
                    SkinMotion sm = null;
                    if (!dic.ContainsKey(s.Name))
                    {
                        dic.Add(s.Name, sm = new SkinMotion()
                        {
                            MorphName = s.Name,
                            Keys      = new List <KeyFrame <float> >(),
                        });
                    }
                    sm = dic[s.Name];

                    var key = new KeyFrame <float>();
                    key.FrameNo = (int)s.FrameNo;
                    if (key.FrameNo > max)
                    {
                        max = key.FrameNo;
                    }
                    key.Value = s.Weight;

                    key.Interpolate = Interpolates.Smoothstep;

                    sm.Keys.Add(key);
                }
                foreach (var sm in dic.Values)
                {
                    sm.Keys.Sort((k1, k2) => { return(k1.FrameNo - k2.FrameNo); });
                }
                anim.SkinMotions = dic;
            }

            anim.FrameNoMax = max;

            obj.Motions = new Motion[] { anim };
            obj.Result  = Result.Success;
            return(new ImportedObject[] { obj });
        }
Esempio 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 });
        }
Esempio 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 });
        }
Esempio n. 11
0
        private NwMotion[] ConvertMotion(ImportedObject obj)
        {
            var mos = new List <NwMotion>();

            if (obj.Motions == null)
            {
                obj.Motions = new Motion[0];
            }

            foreach (var mo in obj.Motions)
            {
                var m = new NwMotion();
                m.Name = mo.Name;

                m.BoneMotion = new Dictionary <string, NwBoneMotion>();
                if (mo.BoneMotions != null)
                {
                    foreach (var bm in mo.BoneMotions)
                    {
                        var bmv = new NwBoneMotion();
                        bmv.BoneName = bm.Value.BoneName;
                        bmv.Keys     = new List <NwBoneMotionValue>();
                        foreach (var k in bm.Value.Keys)
                        {
                            var v = new NwBoneMotionValue();
                            v.FrameNo  = k.FrameNo;
                            v.Location = k.Value.location.ToVec3f();
                            v.Rotation = new Vector4f(k.Value.rotation.X, k.Value.rotation.Y, k.Value.rotation.Z, k.Value.rotation.W);
                            v.Scale    = k.Value.scale.ToVec3f();

                            v.Interpolate = ConvertInterpolate(k.Interpolate);

                            bmv.Keys.Add(v);
                        }

                        m.BoneMotion.Add(bmv.BoneName, bmv);
                    }
                }

                m.MorphMotion = new Dictionary <string, NwMorphMotion>();
                if (mo.SkinMotions != null)
                {
                    foreach (var sm in mo.SkinMotions)
                    {
                        var mmv = new NwMorphMotion();
                        mmv.MorphName = sm.Value.MorphName;
                        mmv.Keys      = new List <NwMorphMotionValue>();
                        foreach (var k in sm.Value.Keys)
                        {
                            var v = new NwMorphMotionValue();
                            v.FrameNo     = k.FrameNo;
                            v.Rate        = k.Value;
                            v.Interpolate = ConvertInterpolate(k.Interpolate);

                            mmv.Keys.Add(v);
                        }

                        m.MorphMotion.Add(mmv.MorphName, mmv);
                    }
                }

                mos.Add(m);
            }

            return(mos.ToArray());
        }
Esempio n. 12
0
        protected override void OnLoad()
        {
            base.OnLoad();

            MMW.FindGameComponent <BackgroundScript>().Trans(new Color4(222, 216, 148, 255), 0.25);

            SelectedPlayer = null;

            input       = new MenuInputResolver();
            input.Up    = Key.W;
            input.Down  = Key.S;
            input.Right = Key.D;
            input.Left  = Key.A;

            transit = new TransitControl();
            transit.LocalLocation = new Vector2(MMW.ClientSize.Width * 2.0f, 0);
            transit.Size          = new Vector2(MMW.ClientSize.Width, MMW.ClientSize.Height);
            transit.Target        = Vector2.Zero;

            load = MMW.FindGameComponent <InitLoading>();

            tabCtr = new TabControl()
            {
                Parent        = transit,
                LocalLocation = new Vector2(100, 164),
                Size          = new Vector2((MMW.ClientSize.Width / 2) - 100 - 64, MMW.ClientSize.Height - 164 - 48),
                Tabs          = new Tab[]
                {
                    new Tab()
                    {
                        Name = "PRESET", Items = load.PresetCharacters,
                    },
                    new Tab()
                    {
                        Name = "FREE", Items = load.FreeCharacters,
                    },
                },
                Focus = true,
            };

            label = new Label()
            {
                Parent        = transit,
                Alignment     = ContentAlignment.TopCenter,
                Text          = "PLAYER SELECT",
                Font          = new Font("Yu Gothic UI Light", 40.0f),
                LocalLocation = new Vector2(0.0f, 32.0f),
            };

            MMW.MainCamera.GameObject.Transform.Position = new Vector3(0.6f, 1.1f, -1.7f);
            //MMW.MainCamera.GameObject.Transform.Position = new Vector3(0.3f, 1.4f, -0.6f);
            MMW.MainCamera.ShadowMapping = false;

            MMW.GlobalAmbient = new Color4(0.8f, 0.8f, 0.8f, 0.0f);
            //MMW.DirectionalLight.Transform.Rotate.Y = (float)Math.PI;
            MMW.DirectionalLight.Transform.Rotate = new Vector3(-MathHelper.PiOver3, 0.0f, 0.0f);
            MMW.DirectionalLight.Intensity        = 1.0f;
            MMW.IBLIntensity = 0.0f;


            if (load.State != InitLoading.LoadingState.Finished)
            {
                load.LoadCompleted += Load_LoadCompleted;
            }
        }
Esempio n. 13
0
        protected override void Update(double deltaTime)
        {
            base.Update(deltaTime);

            transition += (trans ? -1.0f : 1.0f) * (float)deltaTime * 5.0f;
            transition  = MMWMath.Saturate(transition);

            transit.Update(deltaTime);

            if (AcceptInput && !trans)
            {
                input.Update(deltaTime);

                var prev = tabCtr.SelectedObject;

                if (input.IsRight)
                {
                    tabCtr.NextTab();
                    if (prev != tabCtr.SelectedObject)
                    {
                        MMW.DestroyGameObject(player);
                        player = null;
                    }
                }
                else if (input.IsLeft)
                {
                    tabCtr.PrevTab();
                    if (prev != tabCtr.SelectedObject)
                    {
                        MMW.DestroyGameObject(player);
                        player = null;
                    }
                }
                else if (input.IsDown)
                {
                    tabCtr.NextSelect();
                    if (prev != tabCtr.SelectedObject)
                    {
                        MMW.DestroyGameObject(player);
                        player = null;
                    }
                }
                else if (input.IsUp)
                {
                    tabCtr.PrevSelect();
                    if (prev != tabCtr.SelectedObject)
                    {
                        MMW.DestroyGameObject(player);
                        player = null;
                    }
                }
                else if (input.IsBack)
                {
                    if (player != null)
                    {
                        MMW.DestroyGameObject(player);
                    }
                    trans          = true;
                    transit.Target = new Vector2(-MMW.ClientSize.Width * 2.0f, 0.0f);
                    GameObject.AddComponent <TitleScript>();
                }
                else if (input.IsSelect && player != null)
                {
                    MMW.DestroyGameObject(player);
                    SelectedPlayer = (ImportedObject)tabCtr.SelectedObject;
                    MMW.GetAsset <GameData>().Player = SelectedPlayer;
                    trans          = true;
                    transit.Target = new Vector2(-MMW.ClientSize.Width * 2.0f, 0.0f);
                    GameObject.AddComponent <StageSelectScript>();
                }
            }

            if (trans && transition < 0.01f)
            {
                Destroy();
            }

            if (player == null && tabCtr.SelectedObject != null)
            {
                var path = ((ImportedObject)tabCtr.SelectedObject).Path;

                var go = GameObjectFactory.CreateMeshObject(path, MMW.GetAsset <GameData>().SkinShader);
                //go.Layer = 1;
                go.Transform.Rotate.Y = -2.8f;
                go.UpdateAction      += (s, e) =>
                {
                    //go.Transform.Rotate.Y += (float)e.deltaTime * 0.5f;
                };

                // Test: モーションを取得
                var motions = Array.FindAll(load.PresetObjects, o => o.Type == ImportedObjectType.Motion && o.Property != null);
                if (motions.Length > 0)
                {
                    var animator = go.AddComponent <ComputeAnimator>();
                    var mr       = go.GetComponent <MeshRenderer>();
                    animator.Bones = mr.Bones;
                    foreach (var m in motions)
                    {
                        var impo = MMW.GetSupportedImporter(m.Path);
                        var mo   = impo.Import(m.Path, Importers.ImportType.Full)[0];
                        animator.AddMotion(mo.Name, mo.Motions[0]);
                    }
                    //animator.SetRate("secret", 1.0f);
                    animator.SetRate("nekomimi_mikuv2", 1.0f);
                    animator.Frame = 0.0f;
                    go.AddComponent <AnimationController>();
                    //go.UpdateAction += (se, e) =>
                    //{
                    //animator.Frame = MMWMath.Repeat(animator.Frame + ((float)e.deltaTime * 30.0f), 0.0f, 5000.0f);
                    //if (Input.IsKeyDown(Key.Right)) animator.AddRate("nekomimi_mikuv2", (float)e.deltaTime, 0.0f, 1.0f);
                    //if (Input.IsKeyDown(Key.Left)) animator.AddRate("nekomimi_mikuv2", -(float)e.deltaTime, 0.0f, 1.0f);
                    //if (Input.IsKeyDown(Key.Right)) go.Transform.Rotate.Y += (float)e.deltaTime;
                    //if (Input.IsKeyDown(Key.Left)) go.Transform.Rotate.Y -= (float)e.deltaTime;
                    //};
                }

                MMW.RegistGameObject(go);
                player = go;
            }
        }
        protected override void Update(double deltaTime)
        {
            base.Update(deltaTime);

            transition += (trans ? -1.0f : 1.0f) * (float)deltaTime * 5.0f;
            transition  = MMWMath.Saturate(transition);

            transit.Update(deltaTime);

            if (AcceptInput && !trans)
            {
                input.Update(deltaTime);

                if (input.IsRight)
                {
                    tabCtr.NextTab();
                }
                else if (input.IsLeft)
                {
                    tabCtr.PrevTab();
                }
                else if (input.IsDown)
                {
                    tabCtr.NextSelect();
                }
                else if (input.IsUp)
                {
                    tabCtr.PrevSelect();
                }
                else if (input.IsBack)
                {
                    trans          = true;
                    transit.Target = new Vector2(-MMW.ClientSize.Width * 2.0f, 0.0f);
                    GameObject.AddComponent <PlayerSelectScript>();
                }
                else if (input.IsSelect && tabCtr.SelectedObject != null)
                {
                    SelectedStage = (ImportedObject)tabCtr.SelectedObject;
                    MMW.GetAsset <GameData>().Stage = SelectedStage;
                    trans          = true;
                    transit.Target = new Vector2(-MMW.ClientSize.Width * 2.0f, 0.0f);
                    var loadScript = MMW.FindGameComponent <LoadingScript>();
                    loadScript.StartLoading(null, (args) =>
                    {
                        var data = MMW.GetAsset <GameData>();

                        // プレイヤ
                        var player = GameObjectFactory.CreateMeshObject(data.Player.Path, data.SkinShader);
                        //player.Layer = 20;
                        player.AddComponent <SetNameScript>();
                        player.Tags.Add("player");

                        var motions = Array.FindAll(load.PresetObjects, o => o.Type == ImportedObjectType.Motion && o.Property != null);
                        if (motions.Length > 0)
                        {
                            var animator   = player.AddComponent <ComputeAnimator>();
                            var mr         = player.GetComponent <MeshRenderer>();
                            animator.Bones = mr.Bones;
                            foreach (var m in motions)
                            {
                                var impo = MMW.GetSupportedImporter(m.Path);
                                var mo   = impo.Import(m.Path, Importers.ImportType.Full)[0];
                                animator.AddMotion(mo.Name, mo.Motions[0]);
                            }
                            animator.SetRate("nekomimi_mikuv2", 1.0f);
                            player.AddComponent <AnimationController>();
                        }

                        // テストライト
                        {
                            var pl       = player.AddComponent <PointLight>();
                            pl.Intensity = 1.0f;
                            pl.Radius    = 4.0f;
                            pl.Color     = Color4.White;
                        }

                        {
                            var c                    = player.AddComponent <CapsuleCollider>(0.3f, 1.0f);
                            c.Position.Y             = 0.8f;
                            var rb                   = player.AddComponent <RigidBody>();
                            rb.Mass                  = 50.0f;
                            rb.FreezeRotation        = true;
                            rb.DisableDeactivation   = true;
                            rb.LinearDamping         = 0.3f;
                            rb.LinearVelocityLimitXZ = 2.0f;
                            rb.Friction              = 0.95f;
                            player.UpdateAction     += (s, ev) =>
                            {
                                player.Transform.Rotate.Y         += Input.MouseDelta.X * 0.0025f;
                                MMW.MainCamera.Transform.Rotate.X += Input.MouseDelta.Y * 0.0025f;
                                MMW.MainCamera.Transform.Rotate.X  = MathHelper.Clamp(MMW.MainCamera.Transform.Rotate.X, -1.0f, 1.0f);

                                var front = player.Transform.WorldDirectionZ;
                                var left  = player.Transform.WorldDirectionX;
                                var speed = (float)ev.deltaTime * 2.0f;

                                var deltaDir = Vector3.Zero;
                                if (Input.IsKeyDown(Key.W))
                                {
                                    deltaDir += front;
                                }
                                if (Input.IsKeyDown(Key.S))
                                {
                                    deltaDir -= front;
                                }
                                if (Input.IsKeyDown(Key.A))
                                {
                                    deltaDir += left;
                                }
                                if (Input.IsKeyDown(Key.D))
                                {
                                    deltaDir -= left;
                                }

                                if (deltaDir != Vector3.Zero)
                                {
                                    deltaDir.Normalize();
                                    //rb.ApplyImpulse(deltaDir * speed * 80.0f);
                                    player.Transform.Position += deltaDir * speed;
                                }
                                if (Input.IsKeyPressed(Key.Space))
                                {
                                    rb.ApplyImpulse(Vector3.UnitY * 36.0f);
                                }

                                player.Transform.UpdatePhysicalTransform();

                                var cam = MMW.MainCamera;
                                var pos = cam.Transform.WorldPosition;
                                //var vel = (cam.Transform.Position - prevPos) * (float)deltaTime;
                                var dirv = cam.Transform.WorldDirectionZ;
                                var ori  = new float[] { dirv.X, dirv.Y, dirv.Z, cam.Up.X, cam.Up.Y, cam.Up.Z };
                                AL.Listener(OpenTK.Audio.OpenAL.ALListener3f.Position, ref pos);
                                //AL.Listener(OpenTK.Audio.OpenAL.ALListener3f.Velocity, ref vel);
                                AL.Listener(OpenTK.Audio.OpenAL.ALListenerfv.Orientation, ref ori);
                            };

                            MMW.MainCamera.ShadowMapping            = true;
                            MMW.MainCamera.Transform.Parent         = player.Transform;
                            MMW.MainCamera.GameObject.UpdateAction += (s, ev) =>
                            {
                                if (Input.IsKeyDown(Key.ShiftLeft))
                                {
                                    MMW.MainCamera.Transform.Position = new Vector3(-0.5f, 1.5f, -0.5f);
                                }
                                else
                                {
                                    MMW.MainCamera.Transform.Position = new Vector3(0.0f, 1.5f, -1.3f);
                                }

                                //MMW.DirectionalLight.Transform.Rotate.Y += (float)ev.deltaTime * 0.01f;
                            };
                        }

                        // ステージ
                        var stage = GameObjectFactory.CreateStage(data.Stage.Path, data.Shader);
                        stage.Tags.Add("stage");
                        {
                            var sCol      = stage.GetComponent <PhysicalGameComponent>();
                            sCol.Collide += SCol_Collide;
                        }

                        MMW.RegistGameObject(player);
                        MMW.RegistGameObject(stage);

                        for (var i = 0; i < 1; i++)
                        {
                            var tsts = GameObjectFactory.CreateMeshObject(data.Player.Path, data.SkinShader);
                            tsts.Tags.Add("test");
                            //tsts.Layer = 20;
                            tsts.AddComponent <SetNameScript>();
                            tsts.Transform.Position.Z = (i + 1) * 1.0f;
                            var c                  = tsts.AddComponent <CapsuleCollider>(0.3f, 1.0f);
                            c.Position.Y           = 0.8f;
                            var rb                 = tsts.AddComponent <RigidBody>();
                            rb.Mass                = 50.0f;
                            rb.FreezeRotation      = true;
                            rb.DisableDeactivation = true;
                            rb.LinearDamping       = 0.3f;

                            var animator   = tsts.AddComponent <ComputeAnimator>();
                            var mr         = tsts.GetComponent <MeshRenderer>();
                            animator.Bones = mr.Bones;
                            foreach (var m in motions)
                            {
                                var impo = MMW.GetSupportedImporter(m.Path);
                                var mo   = impo.Import(m.Path, Importers.ImportType.Full)[0];
                                animator.AddMotion(mo.Name, mo.Motions[0]);
                            }
                            animator.SetRate("nekomimi_mikuv2", 1.0f);
                            var s    = i + 1;
                            var ac   = tsts.AddComponent <AnimationController>();
                            ac.Speed = i * 0.25;

                            var sound = new Sound("C:/Users/yoshihiro/Downloads/dbg2.wav");
                            sound.Load();
                            var sc = tsts.AddComponent <SoundController>();
                            sc.Sounds.Add("test", sound);
                            sc.Play("test", 1.0f);

                            tsts.UpdateAction += (se, e) =>
                            {
                                tsts.Transform.Position = new Vector3((float)Math.Sin(MMW.TotalElapsedTime * 4.0) * 4.0f, 0.0f, (float)Math.Cos(MMW.TotalElapsedTime * 4.0) * 4.0f);
                            };

                            MMW.RegistGameObject(tsts);
                        }

                        var effs = MMW.MainCamera.GameObject.GetComponents <ImageEffect>();
                        foreach (var eff in effs)
                        {
                            eff.Enabled = true;
                        }

                        MMW.GlobalAmbient = new Color4(0.2f, 0.18f, 0.16f, 0.0f);
                        MMW.DirectionalLight.Intensity = 6.0f;
                        MMW.IBLIntensity = 0.0f;

                        return(true);
                    });
                    loadScript.LoadCompleted += Load_LoadCompleted;
                }
            }

            if (trans && transition < 0.01f)
            {
                Destroy();
            }
        }
Esempio n. 15
0
        public ImportedObject[] Import(string path, ImportType type)
        {
            string json = null;

            try
            {
                json = File.ReadAllText(path);
            }
            catch
            {
                return(new ImportedObject[]
                {
                    new ImportedObject()
                    {
                        Result = Result.InvalidPath,
                        Path = path,
                    }
                });
            }

            /*
             * var ext = Path.GetExtension(path);
             * if (ext == ".mwce" || ext == ".mwse" || ext == ".mwoe")
             * {
             *  var setting = Resources.SettingsPath;
             *  init(setting, 0, 0, -1);
             *
             *  var key = new string('\0', 32);
             *  getpass(setting, key);
             *
             *  try
             *  {
             *      json = Encrypter.Decrypt(json, key);
             *  }
             *  catch
             *  {
             *      return new ImportedObject[]
             *      {
             *          new ImportedObject()
             *          {
             *              Result = Result.InvalidData,
             *              Path = path,
             *          }
             *      };
             *  }
             * }*/

            ImportedObject obj = null;

            if (type == ImportType.Full)
            {
                obj = Util.DeserializeJson <ImportedObject>(json);

                if (obj.Materials != null)
                {
                    foreach (var m in obj.Materials)
                    {
                        foreach (var p in m.tex2DParams.Values)
                        {
                            if (p.tag == null)
                            {
                                continue;
                            }
                            if ((int)p.tag == -1)
                            {
                                continue;
                            }
                            p.value = obj.Textures[(int)p.tag];
                        }
                    }
                }

                obj.Result = Result.Success;
                obj.Path   = path;
            }
            else if (type == ImportType.OverviewOnly)
            {
                var o = Util.DeserializeJson <ImportedOverviewObject>(json);
                obj = new ImportedObject()
                {
                    Author        = o.Author,
                    AuthorURL     = o.AuthorURL,
                    Description   = o.Description,
                    Editor        = o.Editor,
                    EditorURL     = o.EditorURL,
                    ExportVersion = o.ExportVersion,
                    MagicNumber   = o.MagicNumber,
                    Name          = o.Name,
                    Path          = path,
                    Result        = Result.Success,
                    Type          = o.Type,
                    Version       = o.Version,
                };
            }

            return(new ImportedObject[] { obj });
        }
Esempio n. 16
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 });
        }