From deae73470e376f299900ffd471fd64f4dc002417 Mon Sep 17 00:00:00 2001 From: Robert Adams Date: Mon, 11 Feb 2019 15:21:49 -0800 Subject: [PATCH] Include MesherizerR.cs in CommonEntites as it is not included inthe libOpenMetaverse dll used in OpenSimulator. --- CommonEntities/CommonEntities.csproj | 6 +- CommonEntities/MeshmerizerR.cs | 880 +++++++++++++++++++++++++++ convoar/Resources/BuildDate.txt | 2 +- convoar/Resources/GitCommit.txt | 2 +- dist/CommonEntities.dll | Bin 66048 -> 76288 bytes dist/convoar.exe | Bin 94208 -> 94208 bytes dist/convoar.pdb | Bin 134656 -> 134656 bytes prebuild-CommonEntities.xml | 10 +- prebuild-CommonEntitiesUtil.xml | 38 ++ 9 files changed, 926 insertions(+), 12 deletions(-) create mode 100644 CommonEntities/MeshmerizerR.cs create mode 100755 prebuild-CommonEntitiesUtil.xml diff --git a/CommonEntities/CommonEntities.csproj b/CommonEntities/CommonEntities.csproj index 2ebd7ae..cfc2f5c 100755 --- a/CommonEntities/CommonEntities.csproj +++ b/CommonEntities/CommonEntities.csproj @@ -40,9 +40,6 @@ ..\libs\OpenMetaverse.dll - - ..\libs\OpenMetaverse.Rendering.Meshmerizer.dll - ..\libs\OpenMetaverse.StructuredData.dll @@ -116,6 +113,7 @@ + @@ -131,4 +129,4 @@ - + \ No newline at end of file diff --git a/CommonEntities/MeshmerizerR.cs b/CommonEntities/MeshmerizerR.cs new file mode 100644 index 0000000..55818ba --- /dev/null +++ b/CommonEntities/MeshmerizerR.cs @@ -0,0 +1,880 @@ +/* Copyright (c) 2008 Robert Adams + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * The name of the copyright holder may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/* + * Portions of this code are: + * Copyright (c) Contributors, http://idealistviewer.org + * The basic logic of the extrusion code is based on the Idealist viewer code. + * The Idealist viewer is licensed under the three clause BSD license. + */ +/* + * MeshmerizerR class implments OpenMetaverse.Rendering.IRendering interface + * using PrimMesher (http://forge.opensimulator.org/projects/primmesher). + */ + +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Compression; +using System.Drawing; +using System.Text; +using OMV = OpenMetaverse; +using OpenMetaverse.StructuredData; +using OMVR = OpenMetaverse.Rendering; + +namespace OpenMetaverse.Rendering +{ + /// + /// Meshing code based on the Idealist Viewer (20081213). + /// + [RendererName("MeshmerizerR")] + public class MeshmerizerR : OMVR.IRendering + { + /// + /// Generates a basic mesh structure from a primitive + /// A 'SimpleMesh' is just the prim's overall shape with no material information. + /// + /// Primitive to generate the mesh from + /// Level of detail to generate the mesh at + /// The generated mesh or null on failure + public OMVR.SimpleMesh GenerateSimpleMesh(OMV.Primitive prim, OMVR.DetailLevel lod) + { + PrimMesher.PrimMesh newPrim = GeneratePrimMesh(prim, lod, false); + if (newPrim == null) + return null; + + SimpleMesh mesh = new SimpleMesh(); + mesh.Path = new Path(); + mesh.Prim = prim; + mesh.Profile = new Profile(); + mesh.Vertices = new List(newPrim.coords.Count); + for (int i = 0; i < newPrim.coords.Count; i++) + { + PrimMesher.Coord c = newPrim.coords[i]; + mesh.Vertices.Add(new Vertex { Position = new Vector3(c.X, c.Y, c.Z) }); + } + + mesh.Indices = new List(newPrim.faces.Count * 3); + for (int i = 0; i < newPrim.faces.Count; i++) + { + PrimMesher.Face face = newPrim.faces[i]; + mesh.Indices.Add((ushort)face.v1); + mesh.Indices.Add((ushort)face.v2); + mesh.Indices.Add((ushort)face.v3); + } + + return mesh; + } + + /// + /// Generates a basic mesh structure from a sculpted primitive. + /// 'SimpleMesh's have a single mesh and no faces or material information. + /// + /// Sculpted primitive to generate the mesh from + /// Sculpt texture + /// Level of detail to generate the mesh at + /// The generated mesh or null on failure + public OMVR.SimpleMesh GenerateSimpleSculptMesh(OMV.Primitive prim, System.Drawing.Bitmap sculptTexture, OMVR.DetailLevel lod) + { + OMVR.FacetedMesh faceted = GenerateFacetedSculptMesh(prim, sculptTexture, lod); + + if (faceted != null && faceted.Faces.Count == 1) + { + Face face = faceted.Faces[0]; + + SimpleMesh mesh = new SimpleMesh(); + mesh.Indices = face.Indices; + mesh.Vertices = face.Vertices; + mesh.Path = faceted.Path; + mesh.Prim = prim; + mesh.Profile = faceted.Profile; + mesh.Vertices = face.Vertices; + + return mesh; + } + + return null; + } + + /// + /// Create a faceted mesh from prim shape parameters. + /// Generates a a series of faces, each face containing a mesh and + /// material metadata. + /// A prim will turn into multiple faces with each being independent + /// meshes and each having different material information. + /// + /// Primitive to generate the mesh from + /// Level of detail to generate the mesh at + /// The generated mesh + public OMVR.FacetedMesh GenerateFacetedMesh(OMV.Primitive prim, OMVR.DetailLevel lod) + { + bool isSphere = ((OMV.ProfileCurve)(prim.PrimData.profileCurve & 0x07) == OMV.ProfileCurve.HalfCircle); + PrimMesher.PrimMesh newPrim = GeneratePrimMesh(prim, lod, true); + if (newPrim == null) + return null; + + // copy the vertex information into OMVR.IRendering structures + OMVR.FacetedMesh omvrmesh = new OMVR.FacetedMesh(); + omvrmesh.Faces = new List(); + omvrmesh.Prim = prim; + omvrmesh.Profile = new OMVR.Profile(); + omvrmesh.Profile.Faces = new List(); + omvrmesh.Profile.Positions = new List(); + omvrmesh.Path = new OMVR.Path(); + omvrmesh.Path.Points = new List(); + var indexer = newPrim.GetVertexIndexer(); + + for (int i = 0; i < indexer.numPrimFaces; i++) + { + OMVR.Face oface = new OMVR.Face(); + oface.Vertices = new List(); + oface.Indices = new List(); + oface.TextureFace = prim.Textures.GetFace((uint)i); + + for (int j = 0; j < indexer.viewerVertices[i].Count; j++) + { + var vert = new OMVR.Vertex(); + var m = indexer.viewerVertices[i][j]; + vert.Position = new Vector3(m.v.X, m.v.Y, m.v.Z); + vert.Normal = new Vector3(m.n.X, m.n.Y, m.n.Z); + vert.TexCoord = new OMV.Vector2(m.uv.U, 1.0f - m.uv.V); + oface.Vertices.Add(vert); + } + + for (int j = 0; j < indexer.viewerPolygons[i].Count; j++) + { + var p = indexer.viewerPolygons[i][j]; + // Skip "degenerate faces" where the same vertex appears twice in the same tri + if (p.v1 == p.v2 || p.v1 == p.v2 || p.v2 == p.v3) continue; + oface.Indices.Add((ushort)p.v1); + oface.Indices.Add((ushort)p.v2); + oface.Indices.Add((ushort)p.v3); + } + + omvrmesh.Faces.Add(oface); + } + + return omvrmesh; + } + + /// + /// Create a sculpty faceted mesh. The actual scuplt texture is fetched and passed to this + /// routine since all the context for finding teh texture is elsewhere. + /// + /// The faceted mesh or null if can't do it + public OMVR.FacetedMesh GenerateFacetedSculptMesh(OMV.Primitive prim, System.Drawing.Bitmap scupltTexture, OMVR.DetailLevel lod) + { + PrimMesher.SculptMesh.SculptType smSculptType; + switch (prim.Sculpt.Type) + { + case OpenMetaverse.SculptType.Cylinder: + smSculptType = PrimMesher.SculptMesh.SculptType.cylinder; + break; + case OpenMetaverse.SculptType.Plane: + smSculptType = PrimMesher.SculptMesh.SculptType.plane; + break; + case OpenMetaverse.SculptType.Sphere: + smSculptType = PrimMesher.SculptMesh.SculptType.sphere; + break; + case OpenMetaverse.SculptType.Torus: + smSculptType = PrimMesher.SculptMesh.SculptType.torus; + break; + default: + smSculptType = PrimMesher.SculptMesh.SculptType.plane; + break; + } + // The lod for sculpties is the resolution of the texture passed. + // The first guess is 1:1 then lower resolutions after that + // int mesherLod = (int)Math.Sqrt(scupltTexture.Width * scupltTexture.Height); + int mesherLod = 32; // number used in Idealist viewer + switch (lod) + { + case OMVR.DetailLevel.Highest: + break; + case OMVR.DetailLevel.High: + break; + case OMVR.DetailLevel.Medium: + mesherLod /= 2; + break; + case OMVR.DetailLevel.Low: + mesherLod /= 4; + break; + } + PrimMesher.SculptMesh newMesh = + new PrimMesher.SculptMesh(scupltTexture, smSculptType, mesherLod, true, prim.Sculpt.Mirror, prim.Sculpt.Invert); + + int numPrimFaces = 1; // a scuplty has only one face + + // copy the vertex information into OMVR.IRendering structures + OMVR.FacetedMesh omvrmesh = new OMVR.FacetedMesh(); + omvrmesh.Faces = new List(); + omvrmesh.Prim = prim; + omvrmesh.Profile = new OMVR.Profile(); + omvrmesh.Profile.Faces = new List(); + omvrmesh.Profile.Positions = new List(); + omvrmesh.Path = new OMVR.Path(); + omvrmesh.Path.Points = new List(); + + Dictionary vertexAccount = new Dictionary(); + + + for (int ii = 0; ii < numPrimFaces; ii++) + { + vertexAccount.Clear(); + OMVR.Face oface = new OMVR.Face(); + oface.Vertices = new List(); + oface.Indices = new List(); + oface.TextureFace = prim.Textures.GetFace((uint)ii); + int faceVertices = newMesh.coords.Count; + OMVR.Vertex vert; + + for (int j = 0; j < faceVertices; j++) + { + vert = new OMVR.Vertex(); + vert.Position = new Vector3(newMesh.coords[j].X, newMesh.coords[j].Y, newMesh.coords[j].Z); + vert.Normal = new Vector3(newMesh.normals[j].X, newMesh.normals[j].Y, newMesh.normals[j].Z); + vert.TexCoord = new Vector2(newMesh.uvs[j].U, newMesh.uvs[j].V); + oface.Vertices.Add(vert); + } + + for (int j = 0; j < newMesh.faces.Count; j++) + { + oface.Indices.Add((ushort)newMesh.faces[j].v1); + oface.Indices.Add((ushort)newMesh.faces[j].v2); + oface.Indices.Add((ushort)newMesh.faces[j].v3); + } + + if (faceVertices > 0) + { + oface.TextureFace = prim.Textures.FaceTextures[ii]; + if (oface.TextureFace == null) + { + oface.TextureFace = prim.Textures.DefaultTexture; + } + oface.ID = ii; + omvrmesh.Faces.Add(oface); + } + } + + return omvrmesh; + } + + /// + /// Apply texture coordinate modifications from a + /// to a list of vertices + /// + /// Vertex list to modify texture coordinates for + /// Center-point of the face + /// Face texture parameters + public void TransformTexCoords(List vertices, OMV.Vector3 center, OMV.Primitive.TextureEntryFace teFace, Vector3 primScale) + { + // compute trig stuff up front + float cosineAngle = (float)Math.Cos(teFace.Rotation); + float sinAngle = (float)Math.Sin(teFace.Rotation); + + for (int ii = 0; ii < vertices.Count; ii++) + { + // tex coord comes to us as a number between zero and one + // transform about the center of the texture + OMVR.Vertex vert = vertices[ii]; + + // aply planar tranforms to the UV first if applicable + if (teFace.TexMapType == MappingType.Planar) + { + Vector3 binormal; + float d = Vector3.Dot(vert.Normal, Vector3.UnitX); + if (d >= 0.5f || d <= -0.5f) + { + binormal = Vector3.UnitY; + if (vert.Normal.X < 0f) binormal *= -1; + } + else + { + binormal = Vector3.UnitX; + if (vert.Normal.Y > 0f) binormal *= -1; + } + Vector3 tangent = binormal % vert.Normal; + Vector3 scaledPos = vert.Position * primScale; + vert.TexCoord.X = 1f + (Vector3.Dot(binormal, scaledPos) * 2f - 0.5f); + vert.TexCoord.Y = -(Vector3.Dot(tangent, scaledPos) * 2f - 0.5f); + } + + float repeatU = teFace.RepeatU; + float repeatV = teFace.RepeatV; + float tX = vert.TexCoord.X - 0.5f; + float tY = vert.TexCoord.Y - 0.5f; + + vert.TexCoord.X = (tX * cosineAngle + tY * sinAngle) * repeatU + teFace.OffsetU + 0.5f; + vert.TexCoord.Y = (-tX * sinAngle + tY * cosineAngle) * repeatV + teFace.OffsetV + 0.5f; + vertices[ii] = vert; + } + return; + } + + // The mesh reader code is organized so it can be used in several different ways: + // + // 1. Fetch the highest detail displayable mesh as a FacetedMesh: + // var facetedMesh = GenerateFacetedMeshMesh(prim, meshData); + // 2. Get the header, examine the submeshes available, and extract the part + // desired (good if getting a different LOD of mesh): + // OSDMap meshParts = UnpackMesh(meshData); + // if (meshParts.ContainsKey("medium_lod")) + // var facetedMesh = MeshSubMeshAsFacetedMesh(prim, meshParts["medium_lod"]): + // 3. Get a simple mesh from one of the submeshes (good if just getting a physics version): + // OSDMap meshParts = UnpackMesh(meshData); + // OMV.Mesh flatMesh = MeshSubMeshAsSimpleMesh(prim, meshParts["physics_mesh"]); + // + // "physics_convex" is specially formatted so there is another routine to unpack + // that section: + // OSDMap meshParts = UnpackMesh(meshData); + // if (meshParts.ContainsKey("physics_convex")) + // OSMap hullPieces = MeshSubMeshAsConvexHulls(prim, meshParts["physics_convex"]): + // + // LL mesh format detailed at http://wiki.secondlife.com/wiki/Mesh/Mesh_Asset_Format + + /// + /// Create a mesh faceted mesh from the compressed mesh data. + /// This returns the highest LOD renderable version of the mesh. + /// + /// The actual mesh data is fetched and passed to this + /// routine since all the context for finding the data is elsewhere. + /// + /// The faceted mesh or null if can't do it + public OMVR.FacetedMesh GenerateFacetedMeshMesh(OMV.Primitive prim, byte[] meshData) + { + OMVR.FacetedMesh ret = null; + OSDMap meshParts = UnpackMesh(meshData); + if (meshParts != null) + { + byte[] meshBytes = null; + string[] decreasingLOD = new string[] { "high_lod", "medium_lod", "low_lod", "lowest_lod" }; + foreach (string partName in decreasingLOD) + { + if (meshParts.ContainsKey(partName)) + { + meshBytes = meshParts[partName]; + break; + } + } + if (meshBytes != null) + { + ret = MeshSubMeshAsFacetedMesh(prim, meshBytes); + } + + } + return ret; + } + + // A version of GenerateFacetedMeshMesh that takes LOD spec so it's similar in calling convention of + // the other Generate* methods. + public OMVR.FacetedMesh GenerateFacetedMeshMesh(OMV.Primitive prim, byte[] meshData, OMVR.DetailLevel lod) { + OMVR.FacetedMesh ret = null; + string partName = null; + switch (lod) + { + case OMVR.DetailLevel.Highest: + partName = "high_lod"; break; + case OMVR.DetailLevel.High: + partName = "medium_lod"; break; + case OMVR.DetailLevel.Medium: + partName = "low_lod"; break; + case OMVR.DetailLevel.Low: + partName = "lowest_lod"; break; + } + if (partName != null) + { + OSDMap meshParts = UnpackMesh(meshData); + if (meshParts != null) + { + if (meshParts.ContainsKey(partName)) + { + byte[] meshBytes = meshParts[partName]; + if (meshBytes != null) + { + ret = MeshSubMeshAsFacetedMesh(prim, meshBytes); + } + } + } + } + return ret; + } + + // Convert a compressed submesh buffer into a FacetedMesh. + public OMVR.FacetedMesh MeshSubMeshAsFacetedMesh(OMV.Primitive prim, byte[] compressedMeshData) + { + OMVR.FacetedMesh ret = null; + OSD meshOSD = Helpers.DecompressOSD(compressedMeshData); + + if (meshOSD != null) + { + OSDArray meshFaces = meshOSD as OSDArray; + if (meshFaces != null) + { + ret = new FacetedMesh(); + ret.Faces = new List(); + for (int faceIndex = 0; faceIndex < meshFaces.Count; faceIndex++) + { + AddSubMesh(prim, faceIndex, meshFaces[faceIndex], ref ret); + } + } + } + return ret; + } + + + // Convert a compressed submesh buffer into a SimpleMesh. + public OMVR.SimpleMesh MeshSubMeshAsSimpleMesh(OMV.Primitive prim, byte[] compressedMeshData) + { + OMVR.SimpleMesh ret = null; + OSD meshOSD = Helpers.DecompressOSD(compressedMeshData); + + if (meshOSD != null) + { + OSDArray meshFaces = meshOSD as OSDArray; + if (meshOSD != null) + { + ret = new SimpleMesh(); + foreach (OSD subMesh in meshFaces) + { + AddSubMesh(subMesh, ref ret); + } + } + } + return ret; + } + + public List> MeshSubMeshAsConvexHulls(OMV.Primitive prim, byte[] compressedMeshData) + { + List> hulls = new List>(); + try { + OSD convexBlockOsd = Helpers.DecompressOSD(compressedMeshData); + + if (convexBlockOsd != null && convexBlockOsd is OSDMap) { + OSDMap convexBlock = convexBlockOsd as OSDMap; + + Vector3 min = new Vector3(-0.5f, -0.5f, -0.5f); + if (convexBlock.ContainsKey("Min")) min = convexBlock["Min"].AsVector3(); + Vector3 max = new Vector3(0.5f, 0.5f, 0.5f); + if (convexBlock.ContainsKey("Max")) max = convexBlock["Max"].AsVector3(); + + List boundingHull = null; + + if (convexBlock.ContainsKey("BoundingVerts")) { + byte[] boundingVertsBytes = convexBlock["BoundingVerts"].AsBinary(); + boundingHull = new List(); + for (int i = 0; i < boundingVertsBytes.Length;) { + ushort uX = Utils.BytesToUInt16(boundingVertsBytes, i); i += 2; + ushort uY = Utils.BytesToUInt16(boundingVertsBytes, i); i += 2; + ushort uZ = Utils.BytesToUInt16(boundingVertsBytes, i); i += 2; + + Vector3 pos = new Vector3( + Utils.UInt16ToFloat(uX, min.X, max.X), + Utils.UInt16ToFloat(uY, min.Y, max.Y), + Utils.UInt16ToFloat(uZ, min.Z, max.Z) + ); + + boundingHull.Add(pos); + } + + List mBoundingHull = boundingHull; + } + + if (convexBlock.ContainsKey("HullList")) { + byte[] hullList = convexBlock["HullList"].AsBinary(); + + byte[] posBytes = convexBlock["Positions"].AsBinary(); + + int posNdx = 0; + + foreach (byte cnt in hullList) { + int count = cnt == 0 ? 256 : cnt; + List hull = new List(); + + for (int i = 0; i < count; i++) { + ushort uX = Utils.BytesToUInt16(posBytes, posNdx); posNdx += 2; + ushort uY = Utils.BytesToUInt16(posBytes, posNdx); posNdx += 2; + ushort uZ = Utils.BytesToUInt16(posBytes, posNdx); posNdx += 2; + + Vector3 pos = new Vector3( + Utils.UInt16ToFloat(uX, min.X, max.X), + Utils.UInt16ToFloat(uY, min.Y, max.Y), + Utils.UInt16ToFloat(uZ, min.Z, max.Z) + ); + + hull.Add(pos); + } + + hulls.Add(hull); + } + } + } + } + catch (Exception e) { + // Logger.Log.WarnFormat("{0} exception decoding convex block: {1}", LogHeader, e); + } + return hulls; + } + + // Add the submesh to the passed SimpleMesh + private void AddSubMesh(OSD subMeshOsd, ref OMVR.SimpleMesh holdingMesh) { + if (subMeshOsd != null && subMeshOsd is OSDMap) + { + OSDMap subMeshMap = subMeshOsd as OSDMap; + // As per http://wiki.secondlife.com/wiki/Mesh/Mesh_Asset_Format, some Mesh Level + // of Detail Blocks (maps) contain just a NoGeometry key to signal there is no + // geometry for this submesh. + if (subMeshMap.ContainsKey("NoGeometry") && ((OSDBoolean)subMeshMap["NoGeometry"])) + return; + + holdingMesh.Vertices.AddRange(CollectVertices(subMeshMap)); + holdingMesh.Indices.AddRange(CollectIndices(subMeshMap)); + } + } + + // Add the submesh to the passed FacetedMesh as a new face. + private void AddSubMesh(OMV.Primitive prim, int faceIndex, OSD subMeshOsd, ref OMVR.FacetedMesh holdingMesh) { + if (subMeshOsd != null && subMeshOsd is OSDMap) + { + OSDMap subMesh = subMeshOsd as OSDMap; + + // As per http://wiki.secondlife.com/wiki/Mesh/Mesh_Asset_Format, some Mesh Level + // of Detail Blocks (maps) contain just a NoGeometry key to signal there is no + // geometry for this submesh. + if (subMesh.ContainsKey("NoGeometry") && ((OSDBoolean)subMesh["NoGeometry"])) + return; + + Face oface = new Face(); + oface.ID = faceIndex; + oface.Vertices = new List(); + oface.Indices = new List(); + oface.TextureFace = prim.Textures.GetFace((uint)faceIndex); + + OSDMap subMeshMap = (OSDMap)subMeshOsd; + + oface.Vertices = CollectVertices(subMeshMap); + oface.Indices = CollectIndices(subMeshMap); + + holdingMesh.Faces.Add(oface); + } + } + + private List CollectVertices(OSDMap subMeshMap) + { + List vertices = new List(); + + Vector3 posMax; + Vector3 posMin; + + // If PositionDomain is not specified, the default is from -0.5 to 0.5 + if (subMeshMap.ContainsKey("PositionDomain")) + { + posMax = ((OSDMap)subMeshMap["PositionDomain"])["Max"]; + posMin = ((OSDMap)subMeshMap["PositionDomain"])["Min"]; + } + else + { + posMax = new Vector3(0.5f, 0.5f, 0.5f); + posMin = new Vector3(-0.5f, -0.5f, -0.5f); + } + + // Vertex positions + byte[] posBytes = subMeshMap["Position"]; + + // Normals + byte[] norBytes = null; + if (subMeshMap.ContainsKey("Normal")) + { + norBytes = subMeshMap["Normal"]; + } + + // UV texture map + Vector2 texPosMax = Vector2.Zero; + Vector2 texPosMin = Vector2.Zero; + byte[] texBytes = null; + if (subMeshMap.ContainsKey("TexCoord0")) + { + texBytes = subMeshMap["TexCoord0"]; + texPosMax = ((OSDMap)subMeshMap["TexCoord0Domain"])["Max"]; + texPosMin = ((OSDMap)subMeshMap["TexCoord0Domain"])["Min"]; + } + + // Extract the vertex position data + // If present normals and texture coordinates too + for (int i = 0; i < posBytes.Length; i += 6) + { + ushort uX = Utils.BytesToUInt16(posBytes, i); + ushort uY = Utils.BytesToUInt16(posBytes, i + 2); + ushort uZ = Utils.BytesToUInt16(posBytes, i + 4); + + Vertex vx = new Vertex(); + + vx.Position = new Vector3( + Utils.UInt16ToFloat(uX, posMin.X, posMax.X), + Utils.UInt16ToFloat(uY, posMin.Y, posMax.Y), + Utils.UInt16ToFloat(uZ, posMin.Z, posMax.Z)); + + if (norBytes != null && norBytes.Length >= i + 4) + { + ushort nX = Utils.BytesToUInt16(norBytes, i); + ushort nY = Utils.BytesToUInt16(norBytes, i + 2); + ushort nZ = Utils.BytesToUInt16(norBytes, i + 4); + + vx.Normal = new Vector3( + Utils.UInt16ToFloat(nX, posMin.X, posMax.X), + Utils.UInt16ToFloat(nY, posMin.Y, posMax.Y), + Utils.UInt16ToFloat(nZ, posMin.Z, posMax.Z)); + } + + var vertexIndexOffset = vertices.Count * 4; + + if (texBytes != null && texBytes.Length >= vertexIndexOffset + 4) + { + ushort tX = Utils.BytesToUInt16(texBytes, vertexIndexOffset); + ushort tY = Utils.BytesToUInt16(texBytes, vertexIndexOffset + 2); + + vx.TexCoord = new Vector2( + Utils.UInt16ToFloat(tX, texPosMin.X, texPosMax.X), + Utils.UInt16ToFloat(tY, texPosMin.Y, texPosMax.Y)); + } + + vertices. Add(vx); + } + return vertices; + } + + private List CollectIndices(OSDMap subMeshMap) + { + List indices = new List(); + + byte[] triangleBytes = subMeshMap["TriangleList"]; + for (int i = 0; i < triangleBytes.Length; i += 6) + { + ushort v1 = (ushort)(Utils.BytesToUInt16(triangleBytes, i)); + indices.Add(v1); + ushort v2 = (ushort)(Utils.BytesToUInt16(triangleBytes, i + 2)); + indices.Add(v2); + ushort v3 = (ushort)(Utils.BytesToUInt16(triangleBytes, i + 4)); + indices.Add(v3); + } + return indices; + } + + /// + /// Decodes mesh asset. + /// OSDMap of all of the submeshes in the mesh. The value of the submesh name + /// is the uncompressed data for that mesh. + /// The OSDMap is made up of the asset_header section (which includes a lot of stuff) + /// plus each of the submeshes unpacked into compressed byte arrays. + /// + public OSDMap UnpackMesh(byte[] assetData) + { + OSDMap meshData = new OSDMap(); + try + { + using (MemoryStream data = new MemoryStream(assetData)) + { + OSDMap header = (OSDMap)OSDParser.DeserializeLLSDBinary(data); + meshData["asset_header"] = header; + long start = data.Position; + + foreach(string partName in header.Keys) + { + if (header[partName].Type != OSDType.Map) + { + meshData[partName] = header[partName]; + continue; + } + + OSDMap partInfo = (OSDMap)header[partName]; + if (partInfo["offset"] < 0 || partInfo["size"] == 0) + { + meshData[partName] = partInfo; + continue; + } + + byte[] part = new byte[partInfo["size"]]; + Buffer.BlockCopy(assetData, partInfo["offset"] + (int)start, part, 0, part.Length); + meshData[partName] = part; + // meshData[partName] = Helpers.ZDecompressOSD(part); // Do decompression at unpack time + } + } + } + catch (Exception ex) + { + Logger.Log("Failed to decode mesh asset", Helpers.LogLevel.Error, ex); + meshData = null; + } + return meshData; + } + + // Local routine to create a mesh from prim parameters. + // Collects parameters and calls PrimMesher to create all the faces of the prim. + private PrimMesher.PrimMesh GeneratePrimMesh(Primitive prim, DetailLevel lod, bool viewerMode) + { + OMV.Primitive.ConstructionData primData = prim.PrimData; + int sides = 4; + int hollowsides = 4; + + float profileBegin = primData.ProfileBegin; + float profileEnd = primData.ProfileEnd; + + bool isSphere = false; + + if ((OMV.ProfileCurve)(primData.profileCurve & 0x07) == OMV.ProfileCurve.Circle) + { + switch (lod) + { + case OMVR.DetailLevel.Low: + sides = 6; + break; + case OMVR.DetailLevel.Medium: + sides = 12; + break; + default: + sides = 24; + break; + } + } + else if ((OMV.ProfileCurve)(primData.profileCurve & 0x07) == OMV.ProfileCurve.EqualTriangle) + sides = 3; + else if ((OMV.ProfileCurve)(primData.profileCurve & 0x07) == OMV.ProfileCurve.HalfCircle) + { + // half circle, prim is a sphere + isSphere = true; + switch (lod) + { + case OMVR.DetailLevel.Low: + sides = 6; + break; + case OMVR.DetailLevel.Medium: + sides = 12; + break; + default: + sides = 24; + break; + } + profileBegin = 0.5f * profileBegin + 0.5f; + profileEnd = 0.5f * profileEnd + 0.5f; + } + + if ((OMV.HoleType)primData.ProfileHole == OMV.HoleType.Same) + hollowsides = sides; + else if ((OMV.HoleType)primData.ProfileHole == OMV.HoleType.Circle) + { + switch (lod) + { + case OMVR.DetailLevel.Low: + hollowsides = 6; + break; + case OMVR.DetailLevel.Medium: + hollowsides = 12; + break; + default: + hollowsides = 24; + break; + } + } + else if ((OMV.HoleType)primData.ProfileHole == OMV.HoleType.Triangle) + hollowsides = 3; + + PrimMesher.PrimMesh newPrim = new PrimMesher.PrimMesh(sides, profileBegin, profileEnd, (float)primData.ProfileHollow, hollowsides); + newPrim.viewerMode = viewerMode; + newPrim.sphereMode = isSphere; + newPrim.holeSizeX = primData.PathScaleX; + newPrim.holeSizeY = primData.PathScaleY; + newPrim.pathCutBegin = primData.PathBegin; + newPrim.pathCutEnd = primData.PathEnd; + newPrim.topShearX = primData.PathShearX; + newPrim.topShearY = primData.PathShearY; + newPrim.radius = primData.PathRadiusOffset; + newPrim.revolutions = primData.PathRevolutions; + newPrim.skew = primData.PathSkew; + switch (lod) + { + case OMVR.DetailLevel.Low: + newPrim.stepsPerRevolution = 6; + break; + case OMVR.DetailLevel.Medium: + newPrim.stepsPerRevolution = 12; + break; + default: + newPrim.stepsPerRevolution = 24; + break; + } + + if ((primData.PathCurve == OMV.PathCurve.Line) || (primData.PathCurve == OMV.PathCurve.Flexible)) + { + newPrim.taperX = 1.0f - primData.PathScaleX; + newPrim.taperY = 1.0f - primData.PathScaleY; + newPrim.twistBegin = (int)(180 * primData.PathTwistBegin); + newPrim.twistEnd = (int)(180 * primData.PathTwist); + newPrim.ExtrudeLinear(); + } + else + { + newPrim.taperX = primData.PathTaperX; + newPrim.taperY = primData.PathTaperY; + newPrim.twistBegin = (int)(360 * primData.PathTwistBegin); + newPrim.twistEnd = (int)(360 * primData.PathTwist); + newPrim.ExtrudeCircular(); + } + + return newPrim; + } + + /// + /// Method for generating mesh Face from a heightmap + /// + /// Two dimension array of floats containing height information + /// Starting value for X + /// Max value for X + /// Starting value for Y + /// Max value of Y + /// + public OMVR.Face TerrainMesh(float[,] zMap, float xBegin, float xEnd, float yBegin, float yEnd) + { + PrimMesher.SculptMesh newMesh = new PrimMesher.SculptMesh(zMap, xBegin, xEnd, yBegin, yEnd, true); + OMVR.Face terrain = new OMVR.Face(); + int faceVertices = newMesh.coords.Count; + terrain.Vertices = new List(faceVertices); + terrain.Indices = new List(newMesh.faces.Count * 3); + + for (int j = 0; j < faceVertices; j++) + { + var vert = new OMVR.Vertex(); + vert.Position = new Vector3(newMesh.coords[j].X, newMesh.coords[j].Y, newMesh.coords[j].Z); + vert.Normal = new Vector3(newMesh.normals[j].X, newMesh.normals[j].Y, newMesh.normals[j].Z); + vert.TexCoord = new Vector2(newMesh.uvs[j].U, newMesh.uvs[j].V); + terrain.Vertices.Add(vert); + } + + for (int j = 0; j < newMesh.faces.Count; j++) + { + terrain.Indices.Add((ushort)newMesh.faces[j].v1); + terrain.Indices.Add((ushort)newMesh.faces[j].v2); + terrain.Indices.Add((ushort)newMesh.faces[j].v3); + } + + return terrain; + } + } +} diff --git a/convoar/Resources/BuildDate.txt b/convoar/Resources/BuildDate.txt index 0425a18..fd8884c 100755 --- a/convoar/Resources/BuildDate.txt +++ b/convoar/Resources/BuildDate.txt @@ -1 +1 @@ -Mon 02/11/2019 11:34:38.74 +Mon 02/11/2019 15:20:51.21 diff --git a/convoar/Resources/GitCommit.txt b/convoar/Resources/GitCommit.txt index d1d7224..73bbb04 100755 --- a/convoar/Resources/GitCommit.txt +++ b/convoar/Resources/GitCommit.txt @@ -1 +1 @@ -6cf931986cffe44415001496d5fd867851d884cc +24d85970604af3e9b64456b3b0a6765b1b2b25d4 diff --git a/dist/CommonEntities.dll b/dist/CommonEntities.dll index 36b5252d20d40117202361e3181e9abe75b81722..9abbcda49877b125b7f458328720e5d15b6693d4 100755 GIT binary patch literal 76288 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

9y5qx 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 gB$#){Ijgp`pD_IYbg~fvh+n`l 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
yrRNW(aRe7MnxBNSNsow z*9hDM5W621@HeLFYw$p*524>&_zH{Dd;l2%H*Qg4Ixeqh`j{qlnv8+JE-l7SuN(%y z(65wJ18nAG_cHv;J+{`w7w@$p#VF6KR#L>@fRIanshL(v9tt4#HhURIuw^h%22hrr z{?bGGEOiu`xEh~r_>gC5&5DHI13U}tO?+%|H3_v_--V#K(#406#d;2FSz1vbu4u7= zxN1XO(cpE;i5rt5{hnKPqLdS4Y9@=&oFg;$7Dw{@hSXCW9YSdbFJll#2Oy4iF2oPb zfJ;F{sV#`8P&SCDGPnHMn+XveRCJbMmBjZoDsZH<@h7_+;da z33%AB3;73gjvLUYZ=e2s`}ae{3;f>#ZGd^et1*vtARS!`d`5eG@v?;plGySWA$}+Z z?~oZ{Gj?@UUG+hSj3143E9eSzQ1!?*a~=uf55rnHto$0U+YjOwr9b@`B-M^F%fD+3 zhlmh9b@)WUL(uZ?vdy*fQJ(+b2%1N#EFMI-|1tZqE;t!~-(j@VpCJwoompmx9SkQ1 zZ!OIg+slaG9vo3UtvQmt6ETCh%5aI z3Or&=$*uVwaeU>i`Gy$i^msku+{mr@e(|vL!+=K|olE@F9A8xgh1)+d;urqFhXKFn zaDNyu#5aYcXP*GUvx8*q%?^UUFsHVf_zy-2R&(xUd4vzoBblu%`4-w06`OqCvLf+F z;H9V`+y%l@CeFyY7k1_XH^ly^y-J)=yl;get_ra>C&Bj|^vk!WR_|L;CaS_@&&%K# z;w`qSvtU7iU))^qVW3R(tEq(LFQ7$Fi+QE=t9tV=*uG}mz`RbaUJ5_pTcyPlBSCRM zDZxz)*XB-)c*Gnx`C+nSLBR`REjH0*;@Uj&gX$vvS5*?ckm04i%7`KAU?Kj;hN>Om zUZTiT87UK;`2?ScQ0^&k-06tzr5X%U_&*0}W@w)ro@IW!5^qTyEVoT1K?t$XM z9KyF&znC8t|L}Uts>IWQeJhH@NqN+FBL6G2=px4u_-aOJbL9(Sr-x#^8Zq;N_zaH) zk2n(1RVA)RsRP7yC0mQ?L_f5eBEAI6N*W1@ScUOeUvgJ@GgAtv*`QqbMg1r^d18`9 zl`?f=#a-ow@ZvXnD6gM~%6ah%DMYn9i1OoXpD17Ou5u54d#-`0?e4qE{h%5J4x_}r z1$ULd391iM2QgJn6w1AY8k+I@N|JisM^t~D2UFfpxkL@Zx3P%&JIXbSq4@3tQMH^m z9B*t_ftux~ya_n_rMv~jca@LEdGchYK8aA?M64YsFRzHGDPks5hca~pes6{HnweTC zTA2E^oFtctMNIXL5_O_DfvF4FmQHb+P|?1}G25*YCyBF}`p%-xWlF_tM|po`YL}IF zvCuFL?{o>V4tbX`MRQcMI8|K1R0&o?>%RG0W zbfO*+&oPDY1@)+SfvHxewuqOQ!jBvy?{V=mQ~fX$n#GgiRgrDcR`ELLeZu9oi8q-_ zGPPa2ZIk>T@h<1d`gVx-gbF+T0jv^W$@@(G6A!F6#VZy?Uldw}?@7JS<*M1A?}(3? zl0N$o-*95jbKXbdb4jt!z7k(DbvEaHjd_tIpXR(@#J5a6$$7tu@0pTbawtFAtad9u zao#^!(x?2&lx#y(`8QL~u$QoqRj3A3fOsiYRHkl1-Z~Lebf$K*U-~HqQ#ek7Kl>{# z#fx&6Rg>g?iih*2vgBaJ$CSh8y zM4!sOxrX?vd;s99<--6sm5&3ARL%taTiM*)N|sl|7GGPgEL+KCE3L8vYpzlaabPXM z;S7fqYy^I2!S#S2RNSl@MwjQPoI|^Yx;CnZc11k|`?v}AX8e1`e`Pp~IZtYo`)>!q z`A%rFG~DUF9-OF$U?1Spo&IB~bGY!&d+D$WA@+_!eG zUXpsG{N1drinWdNljbx0=cDY|1s4G>cTaH`!tc4t(wX+N)Nph8Ch$*!h4>As=&iu3 z^X~+dxfhjC*+XjX0jFOs!I!J=2h8<940u?WN*x6#`?PyMCUUnx<_h;yEdM;<*nk&b z=?z9+2ELE`4ZyQKq_e2_9l$_M8FJUv>;iti_nuru+!px=(IO*CYWuSC6qg|;mVE}9 z7fPt5vb_`)QhuPwE&VQcptv*dH^A)$uDpTb>AWCdaaBp4B7X4-ry>gY#}kx5BRD4) z5r?8z;kslDDB_Hgro27lv!A#Y(Qb%>AhkVOvVR`dX%)i(Z-=#pC@vWVoqZh#f%Bu6 zymxptNfs562hydcA~%iCvf;$PxneFL`Ck!#Hx{tAMK&3dx6AZ(Q0|t}xJ{-bBl8#5 zLox%!cdk?OqT&g07T^yW!GnymY^5&XQkMfRk8A)uv*cR9K_$as!*j-sY{_jInJd{3 zXXR7tww7X4ilvqJb1jcU^D)XcNQUxW0{k0d7*Xw~2%pT6`BUUI@YiwNDjc`r{5QcV zDY{S7vpClst>rH1Qr z313u6F|(q?2#}075EXYQdEgT#Jtw&RvAjdO238WB8YQ?iOt61mEH5onTHOfF-`xb? zV)zt8kB2x@qXd_R37!O)?dww16)&h|tH`&~&*jB5Hp$PJD|~eUil2QUb6GKs;&hx0 z%9N5CNHX0!`|2b9q?DAG`fskFdSxy9>SLgRYFEVB#st`SNX04hio$h*-7o%h+2L%)&X8@ zyp|c!d)oOx(G4g&1*|bwF!sTD+?R)z|=P7UDW2sGoJIrO@1}#7vm}= zRh8=s=89Psb)r8I42T~xR8cS_4+F45Zz!q^hQ%T}8UQt{sCO_T`eL0UslLH{G1Q_K z7wsP`5SuJ&M$v)6LJ_8A7Rt>i8XGJY6&CeN;iO=RIK!fHie>~$#k(15Zm?W@lA)Fa zE5z(t(z32#ZRsj^l~}}-Y;BcjXKI@uFV%?67DXPc72jIa%$&!RUgBqqA`kZBABdz= zFY;i$aDqY9;K=Xz<*!_(sD?yvU(sOYQ4LL^!=gw_e{sJ>k(NQCZ*QrEY9A`Pm^w`i z@OB0d6wg_C)GNcpJ2DS75cNTZ`Xw+-{AQK=)pu5KgqR&8o!F)2TpAoDwpdg!cSCTr z=-P+!P7`-lZpQuStC^Bs8ZT~@d0fMIaep@|jQ7weXXVZ7Mje}>6x@mIl9cP-g2$8z z;%tjrT}jk>Nr}rjZ<9s6AHE?tK|EY@zwba0BeCqw-bm@1xS>LVTx z)5VK2PdM_P3r-jJ_hFsl?`6*gX9yqOXOORNEPFLLQ+#7llgeKW9x68Xm3a%x-w)0b zC-jrlx#d3vj}UYFOX~MBBQ#rlVo~pv7le)yy$4X9?3KA<08`YWzM;9|x(qci)FSTB zP{Ts=#i{#Ixzj{fWQpTwalWLu$Bq`)GPO;Sd3SZodq(D2`rQ$`4 z8d39*zEsSj<3vdI54VPviUyp0rbpZ|aV}Hjmt#W9#4Q;r5n3)zy)n!TVnmkaKN(%K|96C|lmZ3I=I>nQcg3s;>trkBp zwMwYf8$pd8PC8eKFZ1pTogp4(>NM9I7&&K%trm4xl&Bq&68Gdx3Z5ZGkC5d)faIB? z-J;%i6SbA8i$rDVSH_vb*G!TZiT%oo9A}9&7S$Wn8ljJ*JQ<&B#hIgsBA@*dSSxOk zlxWU*By^rA8BKYs#Pyz6Ll=q;i+UNA_#fgDOOnccC^pQiHPujqpNLPGl3w~$^qrNh;Zre; zDXH@_F_x*-_-@nt;m^b>i#kdFH2k@^+$Q;j*kt8hs8t5P5LJhhPO0TfQODG3F%adx z6bCXT+whebZt{ z8B?ppKlB4!J|)JK?3Em4fK4(-8EQ#hDjFj>O5B#`S30b`cHFV|D_`33a+M#gyz3D? zxr#QAYL_+SDY;BZPvj{DOs&Ryym%x}ImDJ1P>!hZ|b%mlXrE*fTLh&%QT70P77pYK+ zEXrp*8mUw&n38^}Qr0ZX)>oxm%9PYntz5&@YH_c6f4Ew?$)YytH-oyXo8-e*-f7OK zkf)ncC$*?rncbePp;~FPD9Wo*K3S2?t5N>Rl&rm0+0E2yp=nP>YL%+vNK)qYQtFtZ zJVo?UCNs57&~B->ayC;RDdm;VM0zXRY~^Cgi&nY6sZWJtO2P56cCrO|9a&pq%6k?? zdHX1_ld^gHD1$7D^6HeKUD-T(SFPaGt~*reL>Dn!7{GNDalM<~rhn>5%cOIOuZvwd z#6LPh@5iGBgzr;K@b-ubP8z4&;u6UxIH4$wcjuq@2mG2p;Qxs8d=+Pvq)pn;tCH~l z|1G-9N192eX0`%=RbgU;eQaq7}szfn6;B+ zna*bnxYJd;P_#4@fCP!W4_2E*GbPWecNY)E@v&Kp}1SE?ApHXO;b z%^83gYs_&%zamyt5oZB=?-{m)IEom{z3~4ocOEQP#Cnb^iSG%&We-$y>vphJQszju zR*p>xC4V;TS41J_%K1>@n-PtQ*nk*Q#an2XCaN)-ba5yo9m2t*{zz^+@ij4qHBi*a zv7ClCu}`uiR}m8LskysXNwb1?6I45SSYw~3JuEfs&odIu53rMKnaeh0%i{h9+iBo* zvAc}DkL)AYUY8upvQPK)v*b`D%Xn7A^=$K=lF}*(<&4o?2GJ&R@xi?vQGrh-K2`Ws z<5P=IZ+se&e<0G~_%!1)3ZJp~jK^mJK9fWcw=^ykQ}LOGk6SD)#fdebf!lmbOFj7A z(xs)ilfrN?!)Au#8BSw(IKvje2>wqNl0TN=N`~J87KuWIbne6Z$bESKIG8yr8Loni zfm(CSxGOY(;ZTO78BSz)r@Fo5bZ9WbYXR4KFBW&I{_3kBPn>mP zUe#vc#2*UIvw&;8uj0l=dF5B)0d;Wg4>+-)Q{B;=JDPJRGCq;0o{b^E;UTk~%Un zUp<8_TmuVNsuwVRIpga^*mHrpPArUU#(g2OCoJd&K$vd;g!u+QSkMiCFy8S1mn#0*`9%q;=N(OWUPBQeCU>;8HupkCg}OA8_s$tnCXir}P5-2QjJo zdi^&`^IGpc`WGByU%-ZYko#@*L*P)oyVMV>cj`L&u0#2aZSXN3R><--EdP?~tSWL` zE_PSq%@5~pSH90ZM7x}8d{bOjG{vz_xdNwi>y$$g73-7)^siGk6wUzu?5e{72lxqp zwq}mwXLU#AL%NT>u}eFwPmgo}4x5`>?hl6Z5*|8nx zisu5hM;}9s{ZvJ8c-58QOsU%B_*pqG|7M4x?&rQ6_|npC4!62J=LNu@YTf{xo3j%z zp7Wt2fL{0lxWoSgG%u|Bw__i0bYq%&vd?Smqpm_LYM|jBeIK>fU0@7W2fNF_4-{7d zx@vj@o?cTAeyyj>APWZr-vyb$>JY#h<>$~tdX4gRhVlwOm3@g-YWb>)U;|jeCd|aV-fsZTnE^xg{^6OQS zAFWUfPh|L#`hLmpVkYB*wT~(vH)bVr{F`DZb~Or=Z>rWet0H4cqX5dS>(h*9E}GyDnE&R~_b}emTmu z9;Ft5e|pt1fHzhq09RLaxPIetu?Cjkqfb+3;T`QXb#&QUl1 z#`tE|_AqN(z}g;WZR3>-J#KXuA`Q11Sz8w;#Bua?TXU#+%#|dRT?jsySMW!-NqWWDrD7G@NuUD7?$l`R`T;sSl*@SrTc>qko;g;@D?FUX@{OJj zwyJ}z>R_u73Fwy{JQ9C{w%0wnO4@etJg=*ya|h3mTY3KUajuW~UxVuKTyz7;D70-INYtwPhV7)RDcMjUQR6EPJvwSxau zTVETOYUfhzTxtzJJEp0(xsS@B8E=Bt!SZVqn(L;iui)NQjS@l|-xNiN@a@`t(Ek$R zN)a90mc{Dxr7LnexJ4b@q7H7+DO}eYu4@g~wMz9@J)E;$@z-w6S+DwQpU-(y`?{#e zf1^szg&S3RE?kZX8SlDLJ=Rn1zZ~PYm;X&39s8)~x;5V}e!hIlaF_OSpwYie`?+X; z|C=1WZ;Im!X89HMThAH(pOy9b=lfl_2mA)$Eb$KDY_SV)uJ{OWf%qJ7k@yC%P5cPB zT>JvqE`A3*LFl`;v?9HEhgqcyT{oJJN-<=mN^JBxE?bM9QuU7)f38r!e^ z=&;>uvq*KSS?)9KDfVK4A`IH5Qd|ef3TdzRyr| zaW2DA4Cgak&2S^bCmFuaP;-;K?%qfiGCqpoe1@wTKFRQXh9ZaLD;T!;8P83ModqKR z_bHqUczj_O;I_gIfT5x-fJ=(r1Kd)yB`+zw#a*Gxph1KQj$qiuaEs(bh+h#UxHU>v ziBiJ57>Y8+B`jyj3iMj>+zP@sNLZN^j}^aH$+=Yo=Q2DF|GUgXcweR|A*EXBuPji` zQLa;-R9;iQQNn63wOKtveMF6F^R#2NPHm{ZRDVpba13-TcO2(9%kfvoeU5&{FvB!1 zGafKLHGaWY^?NyoJEuA4J6AZ@IyX2UcRu5M-}$NYSLa2pt6YlP<<51Fa^K>9+kJ=U zJCEUwdV6_idXMtX^DgpU>wVWd(|3ojKIg!kvvU5H^I6VO{>%J6>|67(pBLi6f)}ud zKE0CQJ-M#{-daQOGsf?YzJfE8y2fSKL0A7uCQZ4qn(}CAweO8M-?_A)$ z@yqSC*!MmU{6O&{@ZsWh;KT7tNwwGq?*!f~-UB{Ld<1-y_yqV^@lW7m#lL`$$9Ko7 z0S&bl`(zjJ3HVxSE%wSKz^CAsZ)>qsRWx=-=vwBjgzB z$TLP7D~wL#eB)~44r80~rcvl@a;|c|=6uIF+%?7Zi0gS*jl03U(cS1d%G2sO&2x!o zgJ+xPAD-Qw(cX#PGri||-M&2E!M+aPYTq{B>povjIA?CohMenj^e#Gmu>U=UGgIo* z^xwn&UvO^KQ|b|%ob>#gQb8Ph*{AR=D=9@io&NLURE_@Zyq9qDA$hu3H%H=F+ zvSr`5oDME}E<5Pl9 zDL!TRl;cw&G(@I`h}02@I=;Q5BMNa&D-6T{-f`fwkMQBwx_p@ZeK?iK#d%CFq9d2? zj$v%%Vr1mve>Tj;b0HTolZ*d-AQ%7RS1$gCt{}dV6U8@lqKKq?F$ABXq5#ocfO}vC zh~xq>0-t7lM&dIHpV9b?!DlQ!2jMdgpYixiz~^9mCgL**r#h4InS#$$NK6Aoe||B_ zbBOp=%om3$OT`8yf%k?>#S2I))N{oU^l7$J^o{$Iqgl<6LE)ajm$;_))2F{;CYd=U{w}!pC$f>KRBc zbzUrfbndV2!X98h_mS#6_d@j|cT#=M{a3Z0W4*e}^F8!@s$Sy#Recek0^hId0DR8I zXQS_X@uKf-@u9C;bLRZ2mgdYC`{(r6&eMi#i$LEF`U9+ShWXd42mAL|lla_@b6_!a zl)3D<)_D8amietS&FQVn7PQ7&=C!p>YE3K}wqVYjetpHzVe{wA8NE2Mysc&BsJ50w zqF>)Rd*Sx)w>R$InN52WmCV7Yvp;2zinq43w~k+yXm43Izcn$|jL%rq5^r5VmbE5^ z%}dJ-Lx}-gK(=Itxp1bLE=FRUxknrJ+nWjf2JVf!S7yKc_a@r3SFU8j&Za@q(6+YL z`R%eHW8>yh%emxtGFVFWwAkW83oGd}zukowgu+<7hh{PASw2@e*tc=?!%QB%$&g&*IwPpSi z$r!(^-QE%DD#k88VU%gc7c5?e3erp}L8`{JE?&5(eNxME9-jTg^f43r?RAXqjoUPb zxIAKjSZ>_Qh}lco!CZ6@h8-3B^9auBrg`O$Vh&P!>1}ZBz1>~a9#a&08xnumUsReS z;Sc*GBVmsfn)t-fv90a%7fo+Do}-n$4d1PxteGu|C8Nxx%iCJp7n{pwm@DG*Tj%x@ zlUKC0(I5soe$28JOXXC`)UhitYGl^PY~PM-Nsut9L()8-v;mpk+OlBEvbL3$nU(iLNN05x%Oq8-Vo88t(Pq3hbr`7Lb;2rX;x z-$aqqB%=W{Ib25J>Ke@?8ucW7H3AXq~n>#S0b&awS7f=*~pbNjM6gg7Df(%9o)+^TTg&s zYjc9DpuR>9^>vdNyJFe=xlO`y4t(4sMla@`YKgA|!ShmUeA0qr=24mb=gc`i-m<(& z9EvI4jI)>fi=juiEN(*uR5hqYnK3Ns|KNF)*drGEi_zu^1eDE|{#Kn3pO0su*%BW= znkpQS>Dunyf>sVdyV}h705PcrKd5j5B&}|taZ6?QOAjFGoawCz4t4U+e&Vnh2MrpS zDIgt(5@4mLs_u^r6hht~xVvYm>=OgU_7_9<`oxe~_Sy*N=M1t2@kEl18L*lLQ>bR# z@rRQWL?JcFT(AO9WU;Wdea`fQMmCF4&6CDVZ)Um~i_IA;6YZ@_`;3ma9FO0kNT*Gs zS>O=*0g5rp+84L49M`gJL0c;`=3&4yf+>zu(rpDFDN`n=n=pQg7&&RG_&@Dk4{TeF(o zIH~?nwwX$nEK-S`I8!L`iDJTkA}L!+7W8p#um)?f6>WiK=&%iI&=qI_cj&fuU590B zfEHMR4OoE4yXt(`--`&0UD9KUmY{RfsHs8DZ?(VzqzWe^&@!lh; z%g)WKGjj`yoP+@@J?l0W%)lomv+PG=3AZtqRkITdS!`%gt+S|j5vd~Wp-F4#r4aOz z!nm~qn`m9U^tif`FK@U@ODdmNt1zAu<@#D)*vCl}c1R*T#eNJTB-+TtPJ9P2h&xn) z_?DLy>rXU_%c{~`sWr-_WeCKIT3NB22uyBspjw9F{LIqQB*GHN@tKlaE~u3? zxEEEyFr?qyS_8=%Kr`-Yivq0{7=}nn;x#TE)I=SUS5N|=F;*pfD&ntH8LzP{RZA`L zehM=0Cun)8iUcwZt!ZotV3p8JnBl74kz2}#B1tuAV>Jc)*Mf7waD0$4Y<}Jda)(J& zj7R($t2MZFl|jYTQc*j3c+OHsUTYVp+Zsm^afGTGWd!iw5ziy*m zE9dF&1v;CrA}B40u~PH3hQtawmxbcH)Ca3NnsN7L0p27crjS4~2(t0qke%OZ|&Rh>%$Nj2pf za6J^k2Wv`I52axULOBYHj+W4=4V+YlXlhNyP1KFWYH57~GAk=l0q)u%UD^%TSJsc; z$n=W@gu4Kp;Vjgk^sMx4Da;qYBiXuKg+`;vel4P?vb7dbKZ{6MO=eeM+tjkY&DC3_3T(E{ z1w7UH9d<~XHsuP{#L6w(!ZKwx50e3$kgAS6mhVB~RJn#KG6t?B6$6A)t8~SsF%rWr zg}E)1JxbRgDXewsP#;N)_A`~MjFwFGJ=0eb|Me5<3R9;$VwRD^Yz+h~PgORWHl zHZ6is+Z9P_CnCwm*4ze0sNMb))KZCZDw-)nfdNm@cHtv#-EgGECg`#gYZ zaZs}$vb2(Kw$g6dEn<$sAq1S_=+cr*9TcWghbT3~8=_ueq6KHNynz;H;Yfm9+Fjl# z7O5Kn42>TxHA@{Zl3iIYZ{m7>&|uNJMsF$T$FPo&r>&?9tRgl-GR zEjZJp6?O|%x7nP6@eS8CEE_R`KrAh-o5tpB>q>hpR?F4&8|YMaV;St&*}q;FF3!|Y zxjs`XDlES7%qTvUW>LXXO~YU^R*>~0R&EXStkZ@B?stK)@H5b7$t>}OClfAda+SL6b{cbl`of< z5w}6FH6unxrGI>Fy5a5ERmmawJ>wpV#O`I zV3=Een)|v4zsf3O*hZ17B9Hhb6i3V;7%#(DAV@9ibXg!^!+dEIMR21!A&a(=#a5}T zYK`IuJkWB!e4;S2(uAs1Dz&QE{*v32D!TU54?Hun!4_~>)roT1%7RXY8;ulDT3@JO zSy8Dqwjk4PzM|@4cQjwH!j&jC!-RzFTF($-V~5hD7i#eGu!bhvsI^S03T-mUrnpUs z85P3ILaid9o|>%H%5J`@R~!&bWf(`1z!WV$ItQazs;UdvL30~b^df|zbP?-}id&@# z#}=9m26DCO&6a`cI0wOXslK73ZCJ57VmKGe0}`x?crRqWZ0XmS8?}wP52>xLVpSew z>r2ph*gx3;vO=)nt}@~zLb0NOP^b^Np=~@>t1m$i;GxYZCYGDEGF<6=t!aQlPmqO- z&ItuRNE75|&)2Y_jg3e!0-8U)x#EgnQWM1@R^wn<0D?>f89$zu$e-KcWO$G%aVa2R zm}0s6EvV$SfuE+f`#_^RlE-=qxP!*|mH=SbtfOkoaTn;tXZ5LmPE&7C#?7>G|%5y+S#_P*J;HdDKbJ3WIR1ta9k03T?oXK(n01B3{W? zcFIKg*z5<0Vn=|^jjRZ8wuTrUg%ddQG}%;Vv7Nkzb%8ZD=~BK}tu+z7H&qKC?2n6G zZmL`(Uu|O7q5_5)5W|D!b`|k`;E3!*kZVC5^R-+vT=qzRNwv;8|})eL>%4EJBRF#(qA=4)suGB!dCw%Hqf zGq|H4e>=}&?4W1Y@2Vs$0m<8gfZFyrAY>An>c(F+s(CJcnym$FaR-xcR-z#rYG#Jp z3OlL=awHtq<-U$lk06seo^B!%41cMqCjF&JQ|0Z761Bh@`MO3_L!2qf8+g<6>4(Rb zmavc3#5w|dlM~f^8Ovp81$QF+9QM&PSmb{KTPr$Hk(7}^e<3l#@Q+f`xzlPVrKzUz zwOtunDDhBJE!DXmGtwo>X5}_;_)Q@^gP5=3J6piuuVn`5+JHb1;)~ISt`0j9EK*b! z8!6aIX>z1kdrJ!b6Jbk}zF-n7NceVSrW!R|^_NM=={?V8R@SB(G5Tp?7+?c#vN+h( z1qe%;X5bSoHeJcL%=WF`Md^sBM4b#=G|i;Nd@)`%`Ak!G@Fj9Jpy@`V)-Y-9@KjC0 zWQ4eknP?*!?F!p$n59D=y}M$+fK?q|foU!`C-D_|V@te@YKTKoHeg)DUUY+Q*@uW9 z5D4kkv4B+rZkv!#LXU{uT*GYTa041^4R``$bSvMZsc*4&k6FuS4*^*n~YvPJ){^Ezwg5+cX=S2mvN;fU!dWqZCof5?zc$-PIzN7Thc$ zb)xYmovFIif95h0j4;t;STom{uGEoxR*sBipTh~Z=Wz<|ta5Q)djZ!f&U3p8F^*cs zX>J!M*HTDr;IwDil%xRN#3?iEqN7a-CqS!G>p3;bH_>lQ;KXwir7fId<8=k+MTv35 z^fHSabRXy1s%jOj*+U+<@g)l&MdT``MoM8ufng0WmagI-F_Fp^VAxR*Om`~f{m!j) zYdf-}j0j4yfJ1*sY4+TYuIkbihgAr5%o-dtYwV7T17)oT$eQ6NaM*8m<~*s?oloFM zU-s>4xOTc$gb8^tLDNIVA*2G0Sd9WUVrUGH#L`&@%bPw;q#VI3+LFo>LM6qZEyns{@bKk-NP0mUI zeO|)R(G5@>*|qd>Tl!No=wWsDmb;Ys?G9E!WeR=i(W_%w;Gx`7nMpOJJS-&z93|DN z$g8?)rE3nYINud~o<)tU$W#?6s_NtpJUC#A9;m=t8kaF2fj*>wrL$kwe+VCAFiwyP zEGVQWsx%dxv}vlbs6wjTN$Yd})wFi@l>$FBC0YtP=)K!=Eo@2taZRZ)SPQ~=Vmeg<>#?D@?JyO15@5JuQ^N1v zwdoAXh&7Okx0m5P`F$@fPoR6`a1|8S!AaUYYms4X?oI<9*uorgloht6=4hEx_v$$z zlvohyi6&DLXxV7zX~(wk+c6oG&13cuZ=kNmqV`+)dq}DM$It_5KpHkMBROg?vC*l6 zs-G!Aiz$%|G440ozKJ`1q46~lHFymDP*!jn2X|Tubz2%3HcSAL1qIr&sDrjH`@_4V zkY9z>#Xhj$Q18=y9m9C6CLBX+rp5o_pb+&%2NBxJzGmpINvyZggm$xtAj#tC-yY>!g~=sSj8PjhX7Ig>^u^(!IFJN z@DOn}Qfz~7+ay+*M+#ecXicxNAachZFt>L+0m^BaE1?@GX-8GJp1P&^o?;rrRm>+=b@*iz&SWaktGnl`Jz%j-Wj5Sp4ol_AW)m0f|FnVnp zTaYl$#M|_I6aDSQ<<8NCxgHv6$x84PcojrLS>*7oBCgc^aC||2+i1kS_+teWR|Xz{oQGQS7*i2pemWp`%`EY zCX@MxPhFto6ya2_}adLFGijN7S|I_lEAJuA_Ime*jt zqCN70X&I~t)U2iM3>eB~pN{IR)v)Z}{eiJvoXZ0_{xEny*}G!|J@8k&OWpDO@M z5$oBswe^%+ZO3VibOh?g;HZ3`z!`RMX~5~_!g*E z6;F)Oe9^I3Je&qgT0oKwj;ypry!JaKA{@0CSN=5V9JAifIwi58S$feSpl)3u*@cf0aQ5*|>=x?#Igu^gJ)~sEs6d$LvBu z&l*jl)n3&hQM=;~IJpx$%`8<)ON!m5*{f&qNtL}vwX6{Kj0Oo0;hV?Z}P}IOCn=onF!RctKoag~;m0IgG&WkkaYa#l3RB z$U>=n48KpC$>a_Kh3a9md&^a-R!!~@kR!UT-rs!=kK(hg+OJtblGQNXc^N#Xm_Lh! z1i9$1R4vyi=V4#eSn&fvw$4&M)Xyv2^ z`f(5hOIwv0#TyJxVT=X9mT^6b#n~ym(IAi1DL@{?=P17ZAaoR|G1OT>j{lZX>jb82 z6ugMsePeEBF~xc_OC?j=C&YxLH^Ya{6`-A~8w*_!eNZ>JB+wf{v~+e8!YZ`(2AoN~ zoY-w?ZkM)nQIrr9eOS?=VBMk2^f_6=&w(G z>VXSioc*I~A9?Qw-t_)fb*CbccvnhAdXPvanN9E#W!~B7<<&lI<}hE<~M0XWS;zeTSV(U4T64Tnv)AAUQt}>p=_KF6xZ;;s-^C2BPs) zG&-mT1|zXlG%|=Ev+h=r$k4%9x05!N(@|%=7lnyofV+ZzqRvIzIJz%|ckiI_U=&rH zi=j#w6Z-8Ph^XNss;e(Dgn=i*cyduE$3{87QI1Ib+fxRqVDdaE_^5Q|>ONg5_$cU)OX0_KD}jEjCx$tDxjUtjm3XQ7>F3E zNKS~VXkQ=cM6cepLmh3To-_8o8;wWfiS+mRy*OjZ0g5QF$*9>41l+;MFvH)J0t{|l z==6RNqLV5Ps+=*hXwexPj=^*YEA-8~7C)Ty{((f|Kg@?FcpnB#Feca*Lpqsbg{1d7 z#T0UpQqd!^eUA4nw!es38n@LQ?=KwhFP-&%5bo0qu|&oFK=KNt;C1|u_n8Fe>Xm3b z-ra`_WDMQJ@xH4>A~Ap&!o*z@m^1E-bL8WqV1EOHhF0u+Jca@C4mqv#K<~Wka(xX~ zr~SNKU%(igMQQnWa(#=#a28{#8~r2_-B8+jjA^KkLh<8xJlTd#R>}4!dQ~Kf8*Cy# zaT@EM1SB*bk2|i@?n$=y#bNQ-;1e+w0mN}>wv+8o>f2}Z?WGuO0UE_&C?k%GX0W;m z7*ZBH?Ze%@xInqvNmvZ&c{tkJFNr(Rr%v51s_|B`LLbrJ6^kUm(DqTo$3bYWaEeR^ zbP#V^5^M0fkN~dGGW|U!5(W?x09GRr7ZwZ+4N;9}#fv1p?Ae9aUjX*+BMIF| zNNEC@Sgb37;jedtISEtg4cIYyjs)%o%^Qhc)uq{sv7&MU0F3qvKu>tIm)73`Ju}qbF)ci5jDWH-F4&y+Ogf;8;Aq&u>X*1}lH4U+^H;4^4tt z0wIg~`>l+QLHq^;s|Yl(@6&_=wsIiU>#z>!2ENmR4p^Mt%SrEJM`C?wgVt`imG>oQot|~Qqw>e0NO<#e7y2AL8ZM!K7!C{n01cOu_MdCkTZaUB@oG^_gT)H)BY|xMn$;` z1f*~#HAx&iZ0vYc)OcvO&C#fzttF zC@)Mg#0wk|@O9?TK@6R9y2cFrjP6wD!6JhNp^e}e7wLt6xlWUQPR!WrhbhQUk)fyr zK~6jC;4DopeMGWNQwX-EjRdFZe|5#A_vRh3eQca|+7Ds0X#~R-$Nm%~=OIi%vVDrk zu7}(G=vc(ndLJFo!mpu7IVR8S0OVAz?_ zcrhRAI!;5^QL&@<>M#j;8Pp7HfS<-MX^8|wNP~+=JOZvFT&6_rx7oTT%$w zA4e#PKS*W!0;bi^t!ioq18GeX^r{xCu9%F=P(m!+Y8S$JylDHaCN!i}>WCy;vAIm+^5qO9xOvOCKQUCE31%7rf0s z*}jvPy8&M`zE!-fL{tgVW@9To62w&ronnY(%NbSyjrVH;XWuHd3@psRPd2Uw+o_cHNof5t|TPpnii%3l+>n0nKeoVcAuUqj-l?p`|yV z$vCqNioj3oyf}*kl7M|(bk-P4A|cTd_g1jNT6D^UA|cQmp*cY7gd!o(`Ti7^j*QDt z(y}xmLvuBc9f>|DI23_>?>7`9qB5b`}G$i`xbJ%~mk5$7byIO&{BkN^tD7;@fM27@fuqaqEcf>J-5BpuSiR=ADS5W?6< zn$S>tUzLt#g?DLZR)&&hI5msDF{-z?_k?{fjE%Hniw97bD-6BrY9HpHyXYlh^@aJ) zVl<|(4n+71^UYNe(Co)NaScR72}~f<&^?RyGGhksjrXLmo(9Xt$uf!Q97N`)EEt4^ z!GkGmM4)yW+(pbFPRGLFPVOZbN_yRIZY7Qpc>8c1UdFkIawI4N-ak7S2tDnq5k_mW zWC%be8t`66z-{Igp5rN?;*eAqIyCtE`cmM%z&J3^^dr1MNQeK(O1%sa z8Hw<&$&^ZEw8kFVHK`BM(Bwrfo&kG7OAz-uth@k)zl9=n$xeu~7*BDIx!3_Mn7M1f zKnSvt0o)IenirTNdc;8j1;`GLbA>hxX}AW9;Sz~yz*yHkDvnPg9#M2}3fogEf*1e3 z=P^8sc^=Q)+sCZ&C|T`lGlF__l8V0?dO+ThJ5yS2;K`&>rF!T?)ou7SJO2eAsXzNd zD)qqe(NhXP1Eua-IaSCP3i%U9NAraTj*gvp|H-4L#zxd2nPD#3l~;h33Tre1`83Tc!Mxl+->O z!BhB+&X)`9c&>0np0YB}{NBfRbjnjd*x<%VF}g$SN? z+mogn;4%;UbiB?{Wg>WG;+_~gA7b8xwi8Ot;ivR&5z|h}9#m>RqCRx<_+&n|zeHDF ziKxy;RAz64;dlAnXJ1m+@jf(8?3ltE=GFAx==i1>{caE-;|mMrxmY|R7kXzT1^3*| zq2hCId@7XaWWfi>SF<#=HGZFy!MX?8(i~uw|tG9tJ@L#XS>I6MNH_(=U~=l47z% zDtMGCM^tfdG~ub;@n+iNOQZL_qn9tLpO2_Zdw1s3yrZY3iW={BG=FdY z-q(N3Bt6B`_^iPvti44@@W+)>_-`Sb&aPI@4}bN;-#qgN*!}(bKmKBY{^ZODF0X7A z@!HV`$1bncD(>Zl+A>7va>2cFc}2hb^>XLyVJ_pT+sk+{m5awJw-t@l3(M-?K#l!7 zbUV^1o9n#yvdsU(Qt~(AR?2D9}4w4 zN2Gs~0_J50ob}G(b1?;{9Qyf*bQj!>dQ@fA60XxYVv@y|^n8G03HS3jZ#c)M>Konv z^zZsNIjl75`v;{I8x6SYh|Bn*srrp*)Qep5Ed)ir@)i)}0c{`M}2v%9dq3d>{$78Fa)$IP^&~ zp0VL^3jU4a0K{?s13QE73lU48RG)?6g9zmiWp*@dKP|QRq;W}T8^K8yK1sm8bNCex z1ayEG1q0jFK@+Lh4|tO9?XVPnl{AHae1K#W=VKIpL4-UE@aWm%5ip)BY2X)TEJqO> z2<>yG51v0E?UsM`kqX@}XJoH2oEHA`q$?kC*#PfbAx^wK-^YaSoo%;se>?9_N*g|W r!^d^_pj{apOF@EpdM22)?d^o&|J@gy{lE|Rs(TRV{N(Td9|!&uveB%n diff --git a/dist/convoar.exe b/dist/convoar.exe index dfaed7dd94cbbb7c0913600cc3e45bc7a6844b17..b28345b6bab3c70d789482f7dbda8e8df90c30ae 100755 GIT binary patch delta 207 zcmZp8z}oPDbwUSoFmqC4_ttL4Ksy1M<$Kd_En|0?x_AQP+2~y1?QiTD->8|JS{WHw znHuUD87lB{F=`r_q*$0*nj4rIm?Wkdr&=bNnV6WGB^f6fB$}CRGV`x`sPH)`gFR>me) z#uj?!CJMYbmsK@G)75*rR%H{$}c=}+7R%#_>qmyC%ga^Rwm2< diff --git a/prebuild-CommonEntities.xml b/prebuild-CommonEntities.xml index 1841d94..7dc9bb2 100755 --- a/prebuild-CommonEntities.xml +++ b/prebuild-CommonEntities.xml @@ -1,4 +1,4 @@ - + ../../../bin/ @@ -26,7 +26,6 @@ - @@ -44,15 +43,14 @@ + + - - - - + diff --git a/prebuild-CommonEntitiesUtil.xml b/prebuild-CommonEntitiesUtil.xml new file mode 100755 index 0000000..c078a83 --- /dev/null +++ b/prebuild-CommonEntitiesUtil.xml @@ -0,0 +1,38 @@ + + + + ../../../bin/ + true + + + + + ../../../bin/ + true + + + + ../../../bin/ + + + + + + + + + + + + + + + + + + + + + + +