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); }
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), }; }
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); }
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); }
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")); }
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); }
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 }); }
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 }); }
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 }); }
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()); }
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; } }
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(); } }
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 }); }
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 }); }