diff --git a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/AssetObject/BruteForce/BruteForceMeshExportData.cs b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/AssetObject/BruteForce/BruteForceMeshExportData.cs index 60ee167d..86cd52db 100644 --- a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/AssetObject/BruteForce/BruteForceMeshExportData.cs +++ b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/AssetObject/BruteForce/BruteForceMeshExportData.cs @@ -8,6 +8,7 @@ namespace JanusVR { public class BruteForceMeshExportData { + public bool LightmapEnabled { get; set; } public Mesh Mesh { get; set; } public string MeshId { get; set; } public AssetObject Asset { get; set; } diff --git a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/AssetObject/BruteForce/BruteForceObjectScanner.cs b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/AssetObject/BruteForce/BruteForceObjectScanner.cs index d1e74307..b6e5e7a6 100644 --- a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/AssetObject/BruteForce/BruteForceObjectScanner.cs +++ b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/AssetObject/BruteForce/BruteForceObjectScanner.cs @@ -20,6 +20,7 @@ public class BruteForceObjectScanner : ObjectScanner private MaterialScanner materialScanner; private JanusComponentExtractor compExtractor; + private NavMeshScanner navMeshScanner; public BruteForceObjectScanner() { @@ -35,10 +36,36 @@ public override void Initialize(JanusRoom room, GameObject[] rootObjects) materialScanner = new MaterialScanner(room); compExtractor = new JanusComponentExtractor(room); + navMeshScanner = new NavMeshScanner(room); EditorUtility.DisplayProgressBar("Janus VR Exporter", "Brute force scanning for AssetObjects...", 0.0f); materialScanner.Initialize(); + navMeshScanner.Initialize(); + + AssetObject navMeshObj = navMeshScanner.GetNavMeshAsset(); + if (navMeshObj != null) + { + BruteForceMeshExportData exported = new BruteForceMeshExportData(); + exported.LightmapEnabled = false; + exported.Mesh = navMeshObj.Mesh; + + string meshId = "NavMesh"; + meshNames.Add(meshId); + + // keep our version of the data + exported.MeshId = meshId; + meshesToExport.Add(exported.Mesh, exported); + + // but also supply the data to the Janus Room so the Html can be built + exported.Asset = navMeshObj; + + navMeshObj.id = meshId; + navMeshObj.src = meshId + ".fbx"; + + room.AddAssetObject(navMeshObj); + } + for (int i = 0; i < rootObjects.Length; i++) { GameObject root = rootObjects[i]; @@ -77,14 +104,14 @@ public void RecursiveSearch(GameObject root) { MeshRenderer meshRen = (MeshRenderer)comp; MeshFilter filter = comps.FirstOrDefault(c => c is MeshFilter) as MeshFilter; - if (filter == null) + if (filter == null || !meshRen.enabled) { continue; } Mesh mesh = filter.sharedMesh; if (mesh == null || - !room.CanExportObj(comps) || + !room.CanExportObj(comps) || mesh.GetTopology(0) != MeshTopology.Triangles) { continue; @@ -103,6 +130,7 @@ public void RecursiveSearch(GameObject root) if (!meshesToExport.TryGetValue(mesh, out exp)) { exp = new BruteForceMeshExportData(); + exp.LightmapEnabled = true; exp.Mesh = mesh; // generate name string meshId = mesh.name; @@ -135,7 +163,7 @@ public void RecursiveSearch(GameObject root) compExtractor.ProcessNewRoomObject(obj, comps); // let the material scanner process this object - materialScanner.PreProcessObject(meshRen, mesh, exp.Asset, obj, true); + materialScanner.PreProcessObject(meshRen, mesh, exp.Asset, obj, true, 0); } } @@ -163,11 +191,11 @@ public static bool LightmapNeedsUVOverride(JanusRoom room) return room.LightmapType == LightmapExportType.BakedMaterial; } - public MeshData GetMeshData(Mesh mesh) + public MeshData GetMeshData(Mesh mesh, bool lightmapEnabled) { - return GetMeshData(this.room, mesh); + return GetMeshData(this.room, lightmapEnabled, mesh); } - public static MeshData GetMeshData(JanusRoom room, Mesh mesh) + public static MeshData GetMeshData(JanusRoom room, bool lightmapEnabled, Mesh mesh) { MeshData data = new MeshData(); @@ -179,6 +207,7 @@ public static MeshData GetMeshData(JanusRoom room, Mesh mesh) data.Normals = normals; data.Triangles = triangles; data.Name = mesh.name; + data.Lightmapped = lightmapEnabled; if (vertices == null || vertices.Length == 0) { @@ -190,8 +219,11 @@ public static MeshData GetMeshData(JanusRoom room, Mesh mesh) int maximum = triangles.Max(); if (normals.Length < maximum) { - Debug.LogWarning("Mesh has not enough normals - " + mesh.name, mesh); - return null; + if (mesh.name != "NavMesh")// quick and dirty hack, so it doesnt warn for the navmesh + { + Debug.LogWarning("Mesh has not enough normals - " + mesh.name + " - Ignoring normals", mesh); + } + data.Normals = null; } string meshPath = AssetDatabase.GetAssetPath(mesh); @@ -204,11 +236,11 @@ public static MeshData GetMeshData(JanusRoom room, Mesh mesh) } } - data.UV = GetMeshUVs(room, mesh); + data.UV = GetMeshUVs(room, mesh, lightmapEnabled); return data; } - public static Vector2[][] GetMeshUVs(JanusRoom room, Mesh mesh, int fakeUvSize = 0) + public static Vector2[][] GetMeshUVs(JanusRoom room, Mesh mesh, bool lightmapEnabled, int fakeUvSize = 0) { int uvLayers = LightmapNeedsUV1(room) ? 2 : 1; bool needUvOverride = LightmapNeedsUVOverride(room); @@ -250,11 +282,11 @@ public static Vector2[][] GetMeshUVs(JanusRoom room, Mesh mesh, int fakeUvSize = { array = new Vector2[fakeUvSize]; } - if (i == 1 && array == null || + if (lightmapEnabled && (i == 1 && array == null || array.Length == 0 && - room.LightmapType != LightmapExportType.None) + room.LightmapType != LightmapExportType.None)) { - Debug.LogWarning("Lightmapping is enabled but mesh has no UV1 channel - " + mesh.name + " - Tick the Generate Lightmap UVs", mesh); + Debug.LogWarning("Lightmapping is enabled but mesh " + mesh.name + " has no UV1 channel - Tick the Generate Lightmap UVs", mesh); } uvs[i] = array; } @@ -278,7 +310,7 @@ public override void ExportAssetObjects() { Mesh mesh = data.Mesh; - MeshData meshData = GetMeshData(mesh); + MeshData meshData = GetMeshData(mesh, data.LightmapEnabled); if (meshData == null) { continue; diff --git a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/AssetObject/PerLightmapID/PerLightmapIDScanner.cs b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/AssetObject/PerLightmapID/PerLightmapIDScanner.cs index 985ae469..63501b8a 100644 --- a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/AssetObject/PerLightmapID/PerLightmapIDScanner.cs +++ b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/AssetObject/PerLightmapID/PerLightmapIDScanner.cs @@ -96,6 +96,7 @@ public void RecursiveSearch(GameObject root) if (!meshesToExport.TryGetValue(lmapId, out data)) { data = new PerMaterialMeshExportData(); + data.LightmapEnabled = true; meshesToExport.Add(lmapId, data); AssetObject asset = new AssetObject(); @@ -114,6 +115,7 @@ public void RecursiveSearch(GameObject root) } PerMaterialMeshExportDataObj dObj = new PerMaterialMeshExportDataObj(); + dObj.LightmapEnabled = true; dObj.Mesh = mesh; dObj.Transform = root.transform; dObj.Renderer = meshRen; @@ -206,7 +208,7 @@ public MeshData GetMeshData(int index, PerMaterialMeshExportData data) allTriangles.Add(tri + start); } - Vector2[][] uvs = BruteForceObjectScanner.GetMeshUVs(room, mesh, vertices.Length); + Vector2[][] uvs = BruteForceObjectScanner.GetMeshUVs(room, mesh, obj.LightmapEnabled, vertices.Length); for (int j = 0; j < allUVs.Count; j++) { List uvLayer = allUVs[j]; diff --git a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/AssetObject/PerMaterial/PerMaterialMeshExportData.cs b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/AssetObject/PerMaterial/PerMaterialMeshExportData.cs index 80b1765c..1b941b07 100644 --- a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/AssetObject/PerMaterial/PerMaterialMeshExportData.cs +++ b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/AssetObject/PerMaterial/PerMaterialMeshExportData.cs @@ -8,6 +8,7 @@ namespace JanusVR { public class PerMaterialMeshExportData { + public bool LightmapEnabled { get; set; } public RoomObject Object { get; set; } public List Meshes { get; set; } public AssetObject Asset { get; set; } diff --git a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/AssetObject/PerMaterial/PerMaterialMeshExportDataObj.cs b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/AssetObject/PerMaterial/PerMaterialMeshExportDataObj.cs index ee260c3a..03467e2d 100644 --- a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/AssetObject/PerMaterial/PerMaterialMeshExportDataObj.cs +++ b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/AssetObject/PerMaterial/PerMaterialMeshExportDataObj.cs @@ -8,6 +8,8 @@ namespace JanusVR { public struct PerMaterialMeshExportDataObj { + public bool LightmapEnabled { get; set; } + public int MaterialId { get; set; } public Mesh Mesh { get; set; } public Transform Transform { get; set; } public MeshRenderer Renderer { get; set; } diff --git a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/AssetObject/PerMaterial/PerMaterialObjectScanner.cs b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/AssetObject/PerMaterial/PerMaterialObjectScanner.cs index 221c1678..356de78d 100644 --- a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/AssetObject/PerMaterial/PerMaterialObjectScanner.cs +++ b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/AssetObject/PerMaterial/PerMaterialObjectScanner.cs @@ -77,12 +77,6 @@ public void RecursiveSearch(GameObject root) continue; } - Material mat = meshRen.sharedMaterial; - if (!mat) - { - continue; - } - if (!room.ExportDynamicGameObjects && !root.isStatic) { @@ -91,35 +85,48 @@ public void RecursiveSearch(GameObject root) sceneBounds.Encapsulate(meshRen.bounds); - PerMaterialMeshExportData data; - if (!meshesToExport.TryGetValue(mat, out data)) + Material[] materials = meshRen.sharedMaterials; + + for (int j = 0; j < materials.Length; j++) { - data = new PerMaterialMeshExportData(); - meshesToExport.Add(mat, data); + Material mat = materials[j]; + if (!mat) + { + continue; + } - AssetObject asset = new AssetObject(); - data.Asset = asset; + PerMaterialMeshExportData data; + if (!meshesToExport.TryGetValue(mat, out data)) + { + data = new PerMaterialMeshExportData(); + meshesToExport.Add(mat, data); - asset.id = mat.name; - asset.src = mat.name + ".fbx"; - room.AddAssetObject(asset); + AssetObject asset = new AssetObject(); + data.Asset = asset; - RoomObject obj = new RoomObject(); - data.Object = obj; - obj.id = mat.name; - obj.SetNoUnityObj(room); + asset.id = mat.name; + asset.src = mat.name + ".fbx"; + room.AddAssetObject(asset); - room.AddRoomObject(obj); - compExtractor.ProcessNewRoomObject(obj, comps); - } + RoomObject obj = new RoomObject(); + data.Object = obj; + obj.id = mat.name; + obj.SetNoUnityObj(room); - materialScanner.PreProcessObject(meshRen, mesh, data.Asset, data.Object, false); + room.AddRoomObject(obj); + //compExtractor.ProcessNewRoomObject(obj, comps); + } + compExtractor.ProcessNewRoomObject(data.Object, comps); + + materialScanner.PreProcessObject(meshRen, mesh, data.Asset, data.Object, false, j); - PerMaterialMeshExportDataObj dObj = new PerMaterialMeshExportDataObj(); - dObj.Mesh = mesh; - dObj.Transform = root.transform; - dObj.Renderer = meshRen; - data.Meshes.Add(dObj); + PerMaterialMeshExportDataObj dObj = new PerMaterialMeshExportDataObj(); + dObj.MaterialId = j; + dObj.Mesh = mesh; + dObj.Transform = root.transform; + dObj.Renderer = meshRen; + data.Meshes.Add(dObj); + } } } @@ -170,13 +177,6 @@ public MeshData GetMeshData(Material mat, PerMaterialMeshExportData data) Debug.LogWarning("Mesh is empty " + mesh.name, mesh); return null; } - // check if we have all the data - int maximum = triangles.Max(); - if (normals.Length < maximum) - { - Debug.LogWarning("Mesh has not enough normals - " + mesh.name, mesh); - return null; - } string meshPath = AssetDatabase.GetAssetPath(mesh); if (!string.IsNullOrEmpty(meshPath)) @@ -188,54 +188,49 @@ public MeshData GetMeshData(Material mat, PerMaterialMeshExportData data) } } - int start = allVertices.Count; - Vector3 localScale = trans.localScale; - //trans.localScale = localScale * meshData.Scale; - // transform vertices and normals - for (int j = 0; j < vertices.Length; j++) + uint vStart = mesh.GetIndexStart(obj.MaterialId); + uint vEnd = vStart + mesh.GetIndexCount(obj.MaterialId); + Dictionary added = new Dictionary(); + Vector2[][] uvs = BruteForceObjectScanner.GetMeshUVs(room, mesh, obj.LightmapEnabled, vertices.Length); + + for (uint j = vStart; j < vEnd; j++) { - Vector3 vertex = vertices[j]; - Vector3 normal = normals[j]; + int tri = triangles[j]; + + int vertexIndex; + if (added.TryGetValue(tri, out vertexIndex)) + { + allTriangles.Add(vertexIndex); + continue; + } + + Vector3 vertex = vertices[tri]; + Vector3 normal = normals[tri]; + + allTriangles.Add(allVertices.Count); + added.Add(tri, allVertices.Count); + Vector3 vWorldSpace = trans.TransformPoint(vertex); Vector3 nWorldSpace = trans.TransformDirection(normal); allVertices.Add(vWorldSpace); allNormals.Add(nWorldSpace); - } - - //trans.localScale = localScale; - for (int j = 0; j < triangles.Length; j++) - { - // offset the triangle indexes - int tri = triangles[j]; - allTriangles.Add(tri + start); - } - - Vector2[][] uvs = BruteForceObjectScanner.GetMeshUVs(room, mesh, vertices.Length); - for (int j = 0; j < allUVs.Count; j++) - { - List uvLayer = allUVs[j]; - if (j == 1) + for (int k = 0; k < allUVs.Count; k++) { - // recalculate lightmap UVs - Vector4 lmap = obj.Renderer.lightmapScaleOffset; - Vector2[] uv = uvs[j]; - - for (int k = 0; k < uv.Length; k++) + List uvLayer = allUVs[k]; + Vector2[] uv = uvs[k]; + Vector2 tvert = uv[tri]; + if (k == 1) { - Vector2 tvert = uv[k]; + Vector4 lmap = obj.Renderer.lightmapScaleOffset; tvert.x *= lmap.x; tvert.y *= lmap.y; tvert.x += lmap.z; tvert.y += lmap.w; - uvLayer.Add(tvert); } - } - else - { - uvLayer.AddRange(uvs[j]); + uvLayer.Add(tvert); } } } diff --git a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/Material/MaterialScanner.cs b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/Material/MaterialScanner.cs index 26792d69..99c4d653 100644 --- a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/Material/MaterialScanner.cs +++ b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/Material/MaterialScanner.cs @@ -14,6 +14,7 @@ public class MaterialScanner private JanusRoom room; private List textureNames; private Dictionary> lightmapped; + private List colors; public MaterialScanner(JanusRoom room) { @@ -21,13 +22,14 @@ public MaterialScanner(JanusRoom room) textureNames = new List(); lightmapped = new Dictionary>(); + colors = new List(); } public void Initialize() { } - public void PreProcessObject(MeshRenderer renderer, Mesh mesh, AssetObject obj, RoomObject rObj, bool assignLightmapScale) + public void PreProcessObject(MeshRenderer renderer, Mesh mesh, AssetObject obj, RoomObject rObj, bool assignLightmapScale, int subMesh) { LightmapExportType lightmapExportType = room.LightmapType; ExportTextureFormat format = room.TextureFormat; @@ -95,76 +97,125 @@ public void PreProcessObject(MeshRenderer renderer, Mesh mesh, AssetObject obj, break; } + Material[] mats = renderer.sharedMaterials; if (lightmapExportType != LightmapExportType.BakedMaterial && room.ExportMaterials) { // search for textures/color on object - Texture2D texture = null; - Color objColor = Color.white; - - Material[] mats = renderer.sharedMaterials; - for (int j = 0; j < mats.Length; j++) + //for (int i = 0; i < mats.Length; i++) + //{ + // Material mat = mats[i]; + // if (room.TryGetMaterial(mat.name) == null) + // { + // AssetMaterial assetMat = new AssetMaterial(); + // assetMat.id = mat.name; + // room.AddAssetMaterial(assetMat); + + // Shader shader = mat.shader; + + // Texture2D diffuseTexture; + // Color? objColor; + // ExtractFromMaterial(mat, out objColor, out diffuseTexture); + + // AssetImage image = RegisterImage(diffuseTexture); + // assetMat.tex0 = image; + // assetMat.col = JanusUtil.FormatColor(objColor.Value); + + // rObj.mat_id = assetMat.id; + // } + //} + } + else + { + if (mats.Length > subMesh) { - Material mat = mats[j]; - - Vector2 sca = mat.mainTextureScale; - Vector2 off = mat.mainTextureOffset; - if (sca != Vector2.one || off != Vector2.zero) + Material mat = mats[subMesh]; + if (mat != null) { - rObj.tiling = JanusUtil.FormatVector4(new Vector4(sca.x, sca.y, off.x, off.y)); - } - - Shader shader = mat.shader; - int props = ShaderUtil.GetPropertyCount(shader); - for (int k = 0; k < props; k++) - { - string name = ShaderUtil.GetPropertyName(shader, k); - - ShaderUtil.ShaderPropertyType propType = ShaderUtil.GetPropertyType(shader, k); - if (propType == ShaderUtil.ShaderPropertyType.TexEnv) + Texture2D diffuseTexture; + Color? objColor; + ExtractFromMaterial(mat, out objColor, out diffuseTexture); + if (objColor != null) { - if (JanusGlobals.SemanticsMainTex.Contains(name.ToLower())) - { - // main texture texture - Texture matTex = mat.GetTexture(name); - if (matTex is Texture2D) - { - texture = (Texture2D)matTex; - } - } - } - else if (propType == ShaderUtil.ShaderPropertyType.Color) - { - if (JanusGlobals.SemanticsColor.Contains(name.ToLower())) - { - objColor = mat.GetColor(name); - } + rObj.col = JanusUtil.FormatColor(objColor.Value); } + + AssetImage image = RegisterImage(diffuseTexture); + rObj.image_id = image; } } + } + } + + private AssetImage RegisterImage(Texture2D texture) + { + if (!texture) + { + return null; + } - rObj.col = JanusUtil.FormatColor(objColor); + if (textureNames.Contains(texture.name)) + { + AssetImage img = room.AssetImages.FirstOrDefault(c => c.Texture == texture); + return img; + } + textureNames.Add(texture.name); + + AssetImage image = new AssetImage(); + image.Texture = texture; + image.id = texture.name; + image.src = texture.name; + room.AddAssetImage(image); + return image; + } + + private void ExtractFromMaterial(Material mat, out Color? objColor, out Texture2D diffuseTexture) + { + Shader shader = mat.shader; + + diffuseTexture = null; + objColor = null; + + int props = ShaderUtil.GetPropertyCount(shader); + for (int k = 0; k < props; k++) + { + string name = ShaderUtil.GetPropertyName(shader, k); - if (room.ExportTextures && texture != null) + ShaderUtil.ShaderPropertyType propType = ShaderUtil.GetPropertyType(shader, k); + if (propType == ShaderUtil.ShaderPropertyType.TexEnv) { - if (textureNames.Contains(texture.name)) + if (JanusGlobals.SemanticsMainTex.Contains(name.ToLower())) { - AssetImage img = room.AssetImages.FirstOrDefault(c => c.Texture == texture); - if (img != null) + // main texture texture + Texture matTex = mat.GetTexture(name); + if (matTex is Texture2D) { - rObj.image_id = img.id; + diffuseTexture = (Texture2D)matTex; } - return; } - textureNames.Add(texture.name); - - AssetImage image = new AssetImage(); - image.Texture = texture; - image.id = texture.name; - image.src = texture.name; - rObj.image_id = image.id; - room.AddAssetImage(image); } + else if (propType == ShaderUtil.ShaderPropertyType.Color) + { + if (JanusGlobals.SemanticsColor.Contains(name.ToLower())) + { + objColor = mat.GetColor(name); + } + } + } + + if (diffuseTexture == null && room.ExportMaterialColorsAsTextures && objColor.HasValue) + { + // render the color to a 2x2 texture we can show in Janus as the diffuse + diffuseTexture = new Texture2D(2, 2, TextureFormat.RGB24, false, false); + + Color objCol = objColor.Value; + diffuseTexture.SetPixels(new Color[] { objCol, objCol, objCol, objCol }); + diffuseTexture.Apply(); + + string colorName = "ExportedColor" + colors.Count; + colors.Add(colorName); + diffuseTexture.name = colorName; + objColor = null; } } diff --git a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/NavMesh.meta b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/NavMesh.meta new file mode 100644 index 00000000..e2150d03 --- /dev/null +++ b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/NavMesh.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: efefe5e91f286034084242123b3e036f +folderAsset: yes +timeCreated: 1502133476 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/NavMesh/NavMeshScanner.cs b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/NavMesh/NavMeshScanner.cs new file mode 100644 index 00000000..0ab1d05d --- /dev/null +++ b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/NavMesh/NavMeshScanner.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using UnityEditor; +using UnityEngine; +using UnityEngine.AI; +using UObject = UnityEngine.Object; + +namespace JanusVR +{ + public class NavMeshScanner + { + //private JanusRoom room; + + public NavMeshScanner(JanusRoom room) + { + //this.room = room; + } + + public void Initialize() + { + } + + public AssetObject GetNavMeshAsset() + { + NavMeshTriangulation triangles = NavMesh.CalculateTriangulation(); + Mesh mesh = new Mesh(); + mesh.vertices = triangles.vertices; + mesh.triangles = triangles.indices; + mesh.UploadMeshData(false); + mesh.name = "NavMesh"; + + AssetObject obj = new AssetObject(); + obj.Mesh = mesh; + + return obj; + } + } +} \ No newline at end of file diff --git a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/NavMesh/NavMeshScanner.cs.meta b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/NavMesh/NavMeshScanner.cs.meta new file mode 100644 index 00000000..6cad754e --- /dev/null +++ b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Assets/NavMesh/NavMeshScanner.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 66d557c517d9d234785bdfa2fdc7f44c +timeCreated: 1502133476 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Content/Mesh/FBX/FbxExporter.cs b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Content/Mesh/FBX/FbxExporter.cs index aa436791..2e5d3b5f 100644 --- a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Content/Mesh/FBX/FbxExporter.cs +++ b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Content/Mesh/FBX/FbxExporter.cs @@ -48,10 +48,13 @@ public override void ExportMesh(MeshData mesh, string exportPath, MeshExportPara Vector3 v = vertices[i]; vertices[i] = new Vector3(-v.x, v.y, v.z); } - for (int i = 0; i < normals.Length; i++) + if (normals != null) { - Vector3 v = normals[i]; - normals[i] = new Vector3(-v.x, v.y, v.z); + for (int i = 0; i < normals.Length; i++) + { + Vector3 v = normals[i]; + normals[i] = new Vector3(-v.x, v.y, v.z); + } } // change triangles order @@ -67,21 +70,24 @@ public override void ExportMesh(MeshData mesh, string exportPath, MeshExportPara } } + FbxExporterInterop.EnableDefaultMaterial(mesh.Name + "Material"); for (int i = 0; i < vertices.Length; i++) { Vector3 v = vertices[i]; nvertices[i] = new FbxVector3(v.x, v.y, v.z); } - for (int i = 0; i < normals.Length; i++) + FbxExporterInterop.AddVertices(nvertices, nvertices.Length); + + if (normals != null) { - Vector3 v = normals[i]; - nnormals[i] = new FbxVector3(v.x, v.y, v.z); + for (int i = 0; i < normals.Length; i++) + { + Vector3 v = normals[i]; + nnormals[i] = new FbxVector3(v.x, v.y, v.z); + } + FbxExporterInterop.AddNormals(nnormals, nnormals.Length); } - FbxExporterInterop.EnableDefaultMaterial(mesh.Name + "Material"); - FbxExporterInterop.AddVertices(nvertices, nvertices.Length); - FbxExporterInterop.AddNormals(nnormals, nnormals.Length); - for (int i = 0; i < uvs.Length; i++) { Vector2[] uv = uvs[i]; diff --git a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Content/Mesh/MeshData.cs b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Content/Mesh/MeshData.cs index dd207c7e..19c802b7 100644 --- a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Content/Mesh/MeshData.cs +++ b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Content/Mesh/MeshData.cs @@ -8,6 +8,7 @@ namespace JanusVR { public class MeshData { + public bool Lightmapped { get; set; } public string Name { get; set; } public Vector3[] Vertices { get; set; } public Vector3[] Normals { get; set; } diff --git a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Data/Asset/AssetMaterial.cs b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Data/Asset/AssetMaterial.cs new file mode 100644 index 00000000..42e85520 --- /dev/null +++ b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Data/Asset/AssetMaterial.cs @@ -0,0 +1,38 @@ +//using System; +//using System.Collections.Generic; +//using System.Linq; +//using System.Text; +//using System.Xml.Serialization; +//using UnityEngine; + +//namespace JanusVR +//{ +// [XmlRoot("AssetMaterial", Namespace = "", IsNullable = false)] +// public class AssetMaterial : JanusAsset +// { +// [XmlAttribute("col")] +// public string col { get; set; } +// [XmlAttribute("tex")] +// public string tex { get; set; } +// [XmlAttribute("tex0")] +// public string tex0 { get; set; } +// [XmlAttribute("tex1")] +// public string tex1 { get; set; } +// [XmlAttribute("tex2")] +// public string tex2 { get; set; } +// [XmlAttribute("tex3")] +// public string tex3 { get; set; } +// [XmlAttribute("tex4")] +// public string tex4 { get; set; } +// [XmlAttribute("tex5")] +// public string tex5 { get; set; } +// [XmlAttribute("tex6")] +// public string tex6 { get; set; } +// [XmlAttribute("tex7")] +// public string tex7 { get; set; } +// [XmlAttribute("tex8")] +// public string tex8 { get; set; } +// [XmlAttribute("tex9")] +// public string tex9 { get; set; } +// } +//} \ No newline at end of file diff --git a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Data/Asset/AssetMaterial.cs.meta b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Data/Asset/AssetMaterial.cs.meta new file mode 100644 index 00000000..ebb95515 --- /dev/null +++ b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Data/Asset/AssetMaterial.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 660a296dccf8e9741a06b82ffd9e6e30 +timeCreated: 1502491549 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Data/Asset/FireBoxAssets.cs b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Data/Asset/FireBoxAssets.cs index 8a0b3140..87c68db5 100644 --- a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Data/Asset/FireBoxAssets.cs +++ b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Data/Asset/FireBoxAssets.cs @@ -11,6 +11,7 @@ public class FireBoxAssets { [XmlElement(typeof(AssetImage))] [XmlElement(typeof(AssetObject))] + //[XmlElement(typeof(AssetMaterial))] public JanusAsset[] Assets { get; set; } } } \ No newline at end of file diff --git a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Data/Asset/JanusAsset.cs b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Data/Asset/JanusAsset.cs index 007228ff..4de6b3a6 100644 --- a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Data/Asset/JanusAsset.cs +++ b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Data/Asset/JanusAsset.cs @@ -15,6 +15,8 @@ public class JanusAsset [XmlAttribute("id")] public string id { get; set; } + + public override string ToString() { return string.Format("src: {0}, id: {1}", src, id); diff --git a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Data/JanusRoom.cs b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Data/JanusRoom.cs index 6d75589a..962d744b 100644 --- a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Data/JanusRoom.cs +++ b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Data/JanusRoom.cs @@ -15,6 +15,7 @@ public class JanusRoom public List AllAssets { get; private set; } public List AssetObjects { get; private set; } public List AssetImages { get; private set; } + //public List AssetMaterials { get; private set; }// experimental // runtime data public List RoomObjects { get; private set; } @@ -53,6 +54,9 @@ public class JanusRoom public int EnvironmentProbeIrradResolution { get; set; } public ReflectionProbe EnvironmentProbeOverride { get; set; } public bool UseEulerRotations { get; set; } + public bool ExportNavigationMesh { get; set; } + public bool ExportMaterialColorsAsTextures { get; set; } + public AssetImage SkyboxFront { get; set; } public AssetImage SkyboxBack { get; set; } @@ -78,6 +82,7 @@ public JanusRoom() AllAssets = new List(); AssetObjects = new List(); AssetImages = new List(); + //AssetMaterials = new List(); RoomElements = new List(); RoomObjects = new List(); @@ -91,6 +96,11 @@ public JanusRoom() probeExporter = new ProbeExporter(); } + //public AssetMaterial TryGetMaterial(string id) + //{ + // return AssetMaterials.FirstOrDefault(c => c.id == id); + //} + public AssetImage GetTexture(string id) { return AssetImages.First(c => c.id == id); @@ -105,6 +115,12 @@ public bool CanExportObj(Component[] comps) return !comps.Any(c => (c is JanusVREntryPortal) || (c is JanusVRLink)); } + //public void AddAssetMaterial(AssetMaterial assetMat) + //{ + // AllAssets.Add(assetMat); + // AssetMaterials.Add(assetMat); + //} + public void AddAssetObject(AssetObject assetObj) { AllAssets.Add(assetObj); diff --git a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Data/Room/RoomObject.cs b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Data/Room/RoomObject.cs index 0069e052..4f6cbe7b 100644 --- a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Data/Room/RoomObject.cs +++ b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Data/Room/RoomObject.cs @@ -55,6 +55,8 @@ public GameObject UnityObj public string tiling { get; set; } [XmlAttribute] public string collision_id { get; set; } + [XmlAttribute] + public string mat_id { get; set; } public void SetNoUnityObj(JanusRoom room) { diff --git a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Util/JanusUtil.cs b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Util/JanusUtil.cs index 9f2ef61d..6453b77d 100644 --- a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Util/JanusUtil.cs +++ b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Util/JanusUtil.cs @@ -129,7 +129,12 @@ public static string FormatFloat(float value, int decimalPlaces) public static string FormatColor(Color v) { - return v.r.ToString(format2Cases, c) + " " + v.g.ToString(format2Cases, c) + " " + v.b.ToString(format2Cases, c); + string rgb = v.r.ToString(format2Cases, c) + " " + v.g.ToString(format2Cases, c) + " " + v.b.ToString(format2Cases, c); + if (v.a < 1.0f) + { + return rgb + " " + v.a.ToString(format2Cases, c); + } + return rgb; } public static string FormatVector3(Vector3 v) @@ -162,6 +167,6 @@ public static void GetJanusVectors(Quaternion rot, zDir = JanusUtil.ConvertDirection(rot * Vector3.forward); } - + } } diff --git a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Util/UnityUtil.cs b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Util/UnityUtil.cs index 8dfb8997..2365f462 100644 --- a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Util/UnityUtil.cs +++ b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Util/UnityUtil.cs @@ -45,6 +45,16 @@ public static string GetLightmapsFolder() return Path.Combine(scenePath, GetSceneName()); } + public static bool HasActiveScene() + { +#if UNITY_5_3_OR_NEWER + Scene current = SceneManager.GetActiveScene(); + return !string.IsNullOrEmpty(current.name); +#else + return !string.IsNullOrEmpty(EditorApplication.currentScene); +#endif + } + public static string GetScenePath() { #if UNITY_5_3_OR_NEWER diff --git a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Windows/JanusVRExporterWindow.cs b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Windows/JanusVRExporterWindow.cs index 24937851..56422b47 100644 --- a/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Windows/JanusVRExporterWindow.cs +++ b/unity/Project/JanusExporter/Assets/JanusExporter/Codebase/Editor/Windows/JanusVRExporterWindow.cs @@ -56,6 +56,9 @@ public static JanusVRExporterWindow Instance [SerializeField] private bool textureForceReExport; + [SerializeField] + private bool exportMaterialColorsAsTextures; + /// /// The quality to export all textures /// @@ -92,6 +95,12 @@ public static JanusVRExporterWindow Instance [SerializeField] private int maxLightMapResolution; + /// + /// The maximum resolution a lightmap atlas can have + /// + [SerializeField] + private bool exportNavigationMesh; + /// /// How many f-stops we will change the image by /// @@ -181,11 +190,12 @@ private void ResetParameters() defaultQuality = 70; exportTextures = true; - exportMaterials = true; + //exportMaterials = true; exportSkyboxResolution = 1024; exportInactiveObjects = false; exportDynamicGameObjects = true; textureForceReExport = false; + exportNavigationMesh = true; lightmapExportType = LightmapExportType.Packed; lightmapTextureFormat = LightmapTextureFormat.EXR; @@ -210,6 +220,8 @@ private void ResetParameters() scrollPos = Vector2.zero; meshScrollPos = Vector2.zero; + + exportMaterialColorsAsTextures = true; } public static bool NeedsLDRConversion(LightmapTextureFormat format) @@ -356,12 +368,14 @@ private void OnGUI() { defaultQuality = EditorGUILayout.IntSlider("Exported Textures Quality", defaultQuality, 0, 100); } + exportMaterialColorsAsTextures = EditorGUILayout.Toggle("Export Material Color as 2x2 Texture", exportMaterialColorsAsTextures); // Scene GUILayout.Label("Scene", EditorStyles.boldLabel); exportInactiveObjects = EditorGUILayout.Toggle("Export Inactive Objects", exportInactiveObjects); exportDynamicGameObjects = EditorGUILayout.Toggle("Export Dynamic Objects", exportDynamicGameObjects); + exportNavigationMesh = EditorGUILayout.Toggle("Export Navigation Mesh", exportNavigationMesh); exportTextures = EditorGUILayout.Toggle("Export Textures", exportTextures); exportMaterials = EditorGUILayout.Toggle("Export Materials", exportMaterials); @@ -422,48 +436,51 @@ private void OnGUI() maxLightMapResolution = Math.Max(4, EditorGUILayout.IntField("Max Lightmap Resolution", maxLightMapResolution)); } - if (NeedsLDRConversion(lightmapTextureFormat)) + if (UnityUtil.HasActiveScene()) // this needs an active scene, as we load lightmaps { - float newFStop = EditorGUILayout.Slider("Lightmap Relative F-Stops", lightmapRelFStops, -5, 5); - bool update = false; - if (Math.Abs(newFStop - lightmapRelFStops) > 0.0001f) - { - lightmapRelFStops = newFStop; - update = true; - } - - lightmapExposureVisible = EditorGUILayout.Foldout(lightmapExposureVisible, "Preview Exposure"); - if (lightmapExposureVisible) + if (NeedsLDRConversion(lightmapTextureFormat)) { - if (update || !builtLightmapExposure) + float newFStop = EditorGUILayout.Slider("Lightmap Relative F-Stops", lightmapRelFStops, -5, 5); + bool update = false; + if (Math.Abs(newFStop - lightmapRelFStops) > 0.0001f) { - builtLightmapExposure = MaterialScanner.ProcessExposure(0, lightmapRelFStops); + lightmapRelFStops = newFStop; + update = true; } - if (builtLightmapExposure) + lightmapExposureVisible = EditorGUILayout.Foldout(lightmapExposureVisible, "Preview Exposure"); + if (lightmapExposureVisible) { - Texture2D preview = JanusResources.TempRenderTexture; - int texSize = (int)(showArea.width * 0.4); - Rect tex = GUILayoutUtility.GetRect(texSize, texSize + 30); - - GUI.Label(new Rect(tex.x + 20, tex.y + 5, texSize, texSize), "Lightmap Preview"); - GUI.DrawTexture(new Rect(tex.x + 20, tex.y + 30, texSize, texSize), preview); - - //if (previewWindow) - //{ - // previewWindow.Tex = preview; - // previewWindow.Repaint(); - //} - - //if (GUI.Button(new Rect(tex.x + texSize - 60, tex.y, 80, 20), "Preview")) - //{ - // previewWindow = EditorWindow.GetWindow(); - // previewWindow.Show(); - //} - } - else - { - GUILayout.Label("No Lightmap Preview"); + if (update || !builtLightmapExposure) + { + builtLightmapExposure = MaterialScanner.ProcessExposure(0, lightmapRelFStops); + } + + if (builtLightmapExposure) + { + Texture2D preview = JanusResources.TempRenderTexture; + int texSize = (int)(showArea.width * 0.4); + Rect tex = GUILayoutUtility.GetRect(texSize, texSize + 30); + + GUI.Label(new Rect(tex.x + 20, tex.y + 5, texSize, texSize), "Lightmap Preview"); + GUI.DrawTexture(new Rect(tex.x + 20, tex.y + 30, texSize, texSize), preview); + + //if (previewWindow) + //{ + // previewWindow.Tex = preview; + // previewWindow.Repaint(); + //} + + //if (GUI.Button(new Rect(tex.x + texSize - 60, tex.y, 80, 20), "Preview")) + //{ + // previewWindow = EditorWindow.GetWindow(); + // previewWindow.Show(); + //} + } + else + { + GUILayout.Label("No Lightmap Preview"); + } } } } @@ -538,7 +555,13 @@ private void OnGUI() { if (lightmapExportType == LightmapExportType.Unpacked) { - Debug.LogError("Unpacked is unsupported right now."); + Debug.LogError("Unpacked is unsupported right now.", this); + return; + } + + if (!UnityUtil.HasActiveScene()) + { + Debug.LogError("You need an active scene to be able to export!", this); return; } @@ -580,11 +603,12 @@ private void CopyParametersToRoom() { room.IgnoreInactiveObjects = !exportInactiveObjects; room.ExportDynamicGameObjects = exportDynamicGameObjects; + room.ExportNavigationMesh = exportNavigationMesh; room.EnvironmentProbeExport = environmentProbeExport; room.EnvironmentProbeIrradResolution = environmentProbeIrradResolution; room.EnvironmentProbeRadResolution = environmentProbeRadResolution; room.EnvironmentProbeOverride = environmentProbeOverride; - room.ExportMaterials = exportMaterials; + //room.ExportMaterials = exportMaterials; room.ExportTextures = exportTextures; room.LightmapRelFStops = lightmapRelFStops; room.LightmapMaxResolution = maxLightMapResolution; @@ -598,6 +622,7 @@ private void CopyParametersToRoom() room.TextureForceReExport = textureForceReExport; room.UniformScale = uniformScale; room.UseEulerRotations = useEulerRotations; + room.ExportMaterialColorsAsTextures = exportMaterialColorsAsTextures; } } } \ No newline at end of file diff --git a/unity/Project/JanusExporter/Assets/JanusExporter/JanusGlobals.cs b/unity/Project/JanusExporter/Assets/JanusExporter/JanusGlobals.cs index 2c83643c..5259d975 100644 --- a/unity/Project/JanusExporter/Assets/JanusExporter/JanusGlobals.cs +++ b/unity/Project/JanusExporter/Assets/JanusExporter/JanusGlobals.cs @@ -18,7 +18,7 @@ public static class JanusGlobals /// private static List objects = new List(); - public const decimal Version = 2.13M; + public const decimal Version = 2.14M; /// /// Decimal cases used by default when exporting position/scale/rotation values diff --git a/unity/Project/JanusExporter/JanusExporter.Editor.csproj b/unity/Project/JanusExporter/JanusExporter.Editor.csproj index 6d9da3c1..a29ac481 100644 --- a/unity/Project/JanusExporter/JanusExporter.Editor.csproj +++ b/unity/Project/JanusExporter/JanusExporter.Editor.csproj @@ -109,6 +109,9 @@ Library\UnityAssemblies\UnityEditor.Android.Extensions.dll + + Library\UnityAssemblies\UnityEditor.PS4.Extensions.dll + Library\UnityAssemblies\UnityEditor.WebGL.Extensions.dll @@ -155,6 +158,7 @@ + diff --git a/unity/Project/JanusExporter/JanusExporter.sln b/unity/Project/JanusExporter/JanusExporter.sln index 8ec895df..119ec331 100644 --- a/unity/Project/JanusExporter/JanusExporter.sln +++ b/unity/Project/JanusExporter/JanusExporter.sln @@ -1,6 +1,6 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2015 +# Visual Studio 2017 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JanusExporter", "JanusExporter.csproj", "{6ED893AD-ABE4-74D5-4468-11838B81D1E7}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JanusExporter.Editor", "JanusExporter.Editor.csproj", "{398EE5F4-84B0-4D75-EA62-C590149F4466}" diff --git a/unreal/JanusExporter/Source/JanusExporter/Private/JanusExporterWindow.cpp b/unreal/JanusExporter/Source/JanusExporter/Private/JanusExporterWindow.cpp index 1d48d273..70a383b9 100644 --- a/unreal/JanusExporter/Source/JanusExporter/Private/JanusExporterWindow.cpp +++ b/unreal/JanusExporter/Source/JanusExporter/Private/JanusExporterWindow.cpp @@ -24,7 +24,6 @@ #include "Runtime/Engine/Public/HitProxies.h" #include "Runtime/Engine/Public/MaterialShared.h" #include "Developer/MaterialUtilities/Public/MaterialUtilities.h" - #include "Editor/UnrealEd/Private/StaticLightingSystem/StaticLightingPrivate.h" #include "LightMap.h" #include "Engine/MapBuildDataRegistry.h" @@ -42,10 +41,9 @@ THIRD_PARTY_INCLUDES_START #include "ThirdParty/openexr/Deploy/include/ImfStdIO.h" #include "ThirdParty/openexr/Deploy/include/ImfChannelList.h" #include "ThirdParty/openexr/Deploy/include/ImfRgbaFile.h" -#include +#include "ThirdParty/FBX/2016.1.1/include/fbxsdk.h" THIRD_PARTY_INCLUDES_END - #define LOCTEXT_NAMESPACE "JanusExporter" #define NO_CUSTOM_SOURCE 1 // remove this if you have the fixed source code that exports materials @@ -54,6 +52,8 @@ THIRD_PARTY_INCLUDES_END #include "Editor/UnrealEd/Private/FbxExporter.h" #undef private +//#define LEGACYDIR 1 + struct LightmappedObjects { TArray Actors; @@ -974,6 +974,11 @@ FReply SJanusExporterWindow::DoExport() { FStaticMeshComponentLODInfo* LODInfo = &Component->LODData[0]; const FMeshMapBuildData* MeshMapBuildData = Component->GetMeshMapBuildData(Component->LODData[0]); + if (MeshMapBuildData == NULL) + { + continue; + } + FLightMap* LightMap = MeshMapBuildData->LightMap; if (LightMap != NULL) @@ -1074,11 +1079,7 @@ FReply SJanusExporterWindow::DoExport() Index.Append("scale=\""); Index.Append(FString::SanitizeFloat(Sca.X) + " " + FString::SanitizeFloat(Sca.Y) + " " + FString::SanitizeFloat(Sca.Z) + "\" "); - /*Index.Append("rotation=\""); - FVector RotEuler = Rot.Euler(); - RotEuler = FVector(RotEuler.X, RotEuler.Z, RotEuler.Y); - Index.Append(FString::SanitizeFloat(RotEuler.X) + " " + FString::SanitizeFloat(RotEuler.Y) + " " + FString::SanitizeFloat(RotEuler.Z) + "\" ");*/ - +#ifdef LEGACYDIR Index.Append("xdir=\""); Index.Append(FString::SanitizeFloat(XDir.X) + " " + FString::SanitizeFloat(XDir.Y) + " " + FString::SanitizeFloat(XDir.Z) + "\" "); @@ -1087,7 +1088,12 @@ FReply SJanusExporterWindow::DoExport() Index.Append("zdir=\""); Index.Append(FString::SanitizeFloat(ZDir.X) + " " + FString::SanitizeFloat(ZDir.Y) + " " + FString::SanitizeFloat(ZDir.Z) + "\" "); - +#else + Index.Append("rotation=\""); + FVector RotEuler = Rot.Euler(); + RotEuler = FVector(RotEuler.X, 180 - RotEuler.Z, RotEuler.Y); + Index.Append(FString::SanitizeFloat(RotEuler.X) + " " + FString::SanitizeFloat(RotEuler.Y) + " " + FString::SanitizeFloat(RotEuler.Z) + "\" "); +#endif Index.Append("/>"); }