Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Nightly #12

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public class BruteForceObjectScanner : ObjectScanner

private MaterialScanner materialScanner;
private JanusComponentExtractor compExtractor;
private NavMeshScanner navMeshScanner;

public BruteForceObjectScanner()
{
Expand All @@ -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];
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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);
}
}

Expand Down Expand Up @@ -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();

Expand All @@ -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)
{
Expand All @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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;
}
Expand All @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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;
Expand Down Expand Up @@ -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<Vector2> uvLayer = allUVs[j];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ namespace JanusVR
{
public class PerMaterialMeshExportData
{
public bool LightmapEnabled { get; set; }
public RoomObject Object { get; set; }
public List<PerMaterialMeshExportDataObj> Meshes { get; set; }
public AssetObject Asset { get; set; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,12 +77,6 @@ public void RecursiveSearch(GameObject root)
continue;
}

Material mat = meshRen.sharedMaterial;
if (!mat)
{
continue;
}

if (!room.ExportDynamicGameObjects &&
!root.isStatic)
{
Expand All @@ -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);
}
}
}

Expand Down Expand Up @@ -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))
Expand All @@ -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<int, int> added = new Dictionary<int, int>();
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<Vector2> 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<Vector2> 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);
}
}
}
Expand Down
Loading