public static void doCreateShipMesh(Player player, Ship ship, float tileWidth, float tileThickness) { List <Tile> shipTiles = new List <Tile>(); Mesh shipMesh = ship.shipObject.GetComponent <MeshFilter>().mesh; MeshAttributes[] AllMeshAttributes; List <MeshAttributes> meshAttributesList = new List <MeshAttributes>(); Vector3 floorTileDimensions = new Vector3(tileWidth, tileThickness, tileWidth); Vector3 wallTileXDimensions = new Vector3(tileThickness, tileWidth, tileWidth); Vector3 wallTileYDimensions = new Vector3(tileWidth, tileWidth, tileThickness); foreach (Tile tile in ship.tilesList) { if (tile.type == 0) { MeshAttributes meshAttributes = CreateTileMesh.createTileVerticesTriangles(new Vector3(tile.tilePosition.x, tile.tilePosition.y + HandlerScene.tileOffset - 1f, tile.tilePosition.z), floorTileDimensions); meshAttributesList.Add(meshAttributes); } else if (tile.type == 1) { MeshAttributes meshAttributes = CreateTileMesh.createTileVerticesTriangles(new Vector3(tile.tilePosition.x - HandlerScene.tileOffset + 1f, tile.tilePosition.y, tile.tilePosition.z), wallTileXDimensions); meshAttributesList.Add(meshAttributes); } else if (tile.type == 2) { MeshAttributes meshAttributes = CreateTileMesh.createTileVerticesTriangles(new Vector3(tile.tilePosition.x + HandlerScene.tileOffset + 1f, tile.tilePosition.y, tile.tilePosition.z), wallTileXDimensions); meshAttributesList.Add(meshAttributes); } else if (tile.type == 3) { MeshAttributes meshAttributes = CreateTileMesh.createTileVerticesTriangles(new Vector3(tile.tilePosition.x, tile.tilePosition.y, tile.tilePosition.z - HandlerScene.tileOffset + 1f), wallTileYDimensions); meshAttributesList.Add(meshAttributes); } else if (tile.type == 4) { MeshAttributes meshAttributes = CreateTileMesh.createTileVerticesTriangles(new Vector3(tile.tilePosition.x, tile.tilePosition.y, tile.tilePosition.z + HandlerScene.tileOffset + 1f), wallTileYDimensions); meshAttributesList.Add(meshAttributes); } } AddMeshToShip.addMesh(meshAttributesList, shipMesh); }
public static void addMesh(MeshAttributes meshAttributes, Mesh shipMesh) { List<Vector3> shipVertices = shipMesh.vertices.ToList(); shipVertices.AddRange(meshAttributes.vertices); for (int i = 0; i < meshAttributes.triangles.Length; i++) { meshAttributes.triangles[i] = meshAttributes.triangles[i] + shipMesh.vertexCount; } List<int> shipTris = shipMesh.triangles.ToList(); shipTris.AddRange(meshAttributes.triangles); shipMesh.Clear(); shipMesh.vertices = shipVertices.ToArray(); shipMesh.triangles = shipTris.ToArray(); }
static public void addMesh(MeshAttributes meshAttributes, Mesh shipMesh) { List <Vector3> shipVertices = shipMesh.vertices.ToList(); shipVertices.AddRange(meshAttributes.vertices); for (int i = 0; i < meshAttributes.triangles.Length; i++) { meshAttributes.triangles[i] = meshAttributes.triangles[i] + shipMesh.vertexCount; } List <int> shipTris = shipMesh.triangles.ToList(); shipTris.AddRange(meshAttributes.triangles); shipMesh.Clear(); shipMesh.vertices = shipVertices.ToArray(); shipMesh.triangles = shipTris.ToArray(); }
// Decodes a Draco mesh, creates a Unity mesh from the decoded data and // adds the Unity mesh to meshes. encodedData is the compressed Draco mesh. public unsafe AsyncMesh LoadMesh(byte[] encodedData, MeshAttributes attributes) { DracoMesh *mesh = null; if (DecodeDracoMesh(encodedData, encodedData.Length, &mesh) <= 0) { Debug.Log("Failed: Decoding error."); return(null); } AsyncMesh unityMesh = CreateAsyncMesh(mesh, attributes); int numFaces = mesh->numFaces; ReleaseDracoMesh(&mesh); if (numFaces > 0) { return(unityMesh); } else { return(null); } }
public static MeshAttributes createTileVerticesTriangles(Vector3 tilePosition, Vector3 tileDimensions) { Vector3 p0; Vector3 p1; Vector3 p2; Vector3 p3; Vector3 p4; Vector3 p5; Vector3 p6; Vector3 p7; MeshAttributes meshAttributes = new MeshAttributes(); meshAttributes.vertices = new Vector3[24]; meshAttributes.triangles = new int[36]; //top vertices p0 = (new Vector3(tileDimensions.x,tileDimensions.y,tileDimensions.z) + tilePosition); //front right p1 = (new Vector3(tileDimensions.x,tileDimensions.y,-tileDimensions.z) + tilePosition); // back right p2 = (new Vector3(-tileDimensions.x,tileDimensions.y,tileDimensions.z) + tilePosition); //front left p3 = (new Vector3(-tileDimensions.x,tileDimensions.y,-tileDimensions.z) + tilePosition); //back left //bottom vertices p4 = (new Vector3(tileDimensions.x,-tileDimensions.y,tileDimensions.z) + tilePosition); //front right p5 = (new Vector3(tileDimensions.x,-tileDimensions.y,-tileDimensions.z) + tilePosition); // back right p6 = (new Vector3(-tileDimensions.x,-tileDimensions.y,tileDimensions.z) + tilePosition); //front left p7 = (new Vector3(-tileDimensions.x,-tileDimensions.y,-tileDimensions.z) + tilePosition); //back left //top face meshAttributes.vertices[0] = p2; meshAttributes.vertices[1] = p0; meshAttributes.vertices[2] = p1; meshAttributes.vertices[3] = p3; //forward face meshAttributes.vertices[4] = p0; meshAttributes.vertices[5] = p2; meshAttributes.vertices[6] = p6; meshAttributes.vertices[7] = p4; //right face meshAttributes.vertices[8] = p1; meshAttributes.vertices[9] = p0; meshAttributes.vertices[10] = p4; meshAttributes.vertices[11] = p5; //back face meshAttributes.vertices[12] = p3; meshAttributes.vertices[13] = p1; meshAttributes.vertices[14] = p5; meshAttributes.vertices[15] = p7; //left face meshAttributes.vertices[16] = p2; meshAttributes.vertices[17] = p3; meshAttributes.vertices[18] = p7; meshAttributes.vertices[19] = p6; //bottom face meshAttributes.vertices[20] = p4; meshAttributes.vertices[21] = p6; meshAttributes.vertices[22] = p7; meshAttributes.vertices[23] = p5; //THESE ARE THE TRIS, NOT THE FACES!!! //top tris //203 meshAttributes.triangles[0] = 0; meshAttributes.triangles[1] = 1; meshAttributes.triangles[2] = 3; //013 meshAttributes.triangles[3] = 1; meshAttributes.triangles[4] = 2; meshAttributes.triangles[5] = 3; //front tris //026 meshAttributes.triangles[6] = 4; meshAttributes.triangles[7] = 5; meshAttributes.triangles[8] = 6; //064 meshAttributes.triangles[9] = 4; meshAttributes.triangles[10] = 6; meshAttributes.triangles[11] = 7; //right tris //104 meshAttributes.triangles[12] = 8; meshAttributes.triangles[13] = 9; meshAttributes.triangles[14] = 10; //145 meshAttributes.triangles[15] = 8; meshAttributes.triangles[16] = 10; meshAttributes.triangles[17] = 11; //back tris //315 meshAttributes.triangles[18] = 12; meshAttributes.triangles[19] = 13; meshAttributes.triangles[20] = 14; //357 meshAttributes.triangles[21] = 12; meshAttributes.triangles[22] = 14; meshAttributes.triangles[23] = 15; //left tris //237 meshAttributes.triangles[24] = 16; meshAttributes.triangles[25] = 17; meshAttributes.triangles[26] = 18; //276 meshAttributes.triangles[27] = 16; meshAttributes.triangles[28] = 18; meshAttributes.triangles[29] = 19; //bottom tris //467 meshAttributes.triangles[30] = 20; meshAttributes.triangles[31] = 21; meshAttributes.triangles[32] = 22; //475 meshAttributes.triangles[33] = 20; meshAttributes.triangles[34] = 22; meshAttributes.triangles[35] = 23; return meshAttributes; }
// Creates a Unity mesh from the decoded Draco mesh. public unsafe AsyncMesh CreateAsyncMesh(DracoMesh *dracoMesh, MeshAttributes attributes) { int numFaces = dracoMesh->numFaces; AsyncMesh mesh = new AsyncMesh(); mesh.tris = new int[dracoMesh->numFaces * 3]; mesh.verts = new Vector3[dracoMesh->numVertices]; // Copy face indices. DracoData *indicesData; GetMeshIndices(dracoMesh, &indicesData); int elementSize = DataTypeSize((GLTFUtilityDracoLoader.DataType)indicesData->dataType); int *indices = (int * )(indicesData->data); var indicesPtr = UnsafeUtility.AddressOf(ref mesh.tris[0]); UnsafeUtility.MemCpy(indicesPtr, indices, mesh.tris.Length * elementSize); ReleaseDracoData(&indicesData); DracoAttribute *attr = null; // Copy positions. if (GetAttributeByUniqueId(dracoMesh, attributes.pos, &attr)) { DracoData *posData = null; GetAttributeData(dracoMesh, attr, &posData); elementSize = DataTypeSize((GLTFUtilityDracoLoader.DataType)posData->dataType) * attr->numComponents; var newVerticesPtr = UnsafeUtility.AddressOf(ref mesh.verts[0]); UnsafeUtility.MemCpy(newVerticesPtr, (void * )posData->data, dracoMesh->numVertices * elementSize); ReleaseDracoData(&posData); ReleaseDracoAttribute(&attr); } // Copy normals. if (GetAttributeByUniqueId(dracoMesh, attributes.norms, &attr)) { DracoData *normData = null; if (GetAttributeData(dracoMesh, attr, &normData)) { elementSize = DataTypeSize((GLTFUtilityDracoLoader.DataType)normData->dataType) * attr->numComponents; mesh.norms = new Vector3[dracoMesh->numVertices]; var newNormalsPtr = UnsafeUtility.AddressOf(ref mesh.norms[0]); UnsafeUtility.MemCpy(newNormalsPtr, (void * )normData->data, dracoMesh->numVertices * elementSize); ReleaseDracoData(&normData); ReleaseDracoAttribute(&attr); } } // Copy texture coordinates. if (GetAttributeByUniqueId(dracoMesh, attributes.uv, &attr)) { DracoData *texData = null; if (GetAttributeData(dracoMesh, attr, &texData)) { elementSize = DataTypeSize((GLTFUtilityDracoLoader.DataType)texData->dataType) * attr->numComponents; mesh.uv = new Vector2[dracoMesh->numVertices]; var newUVsPtr = UnsafeUtility.AddressOf(ref mesh.uv[0]); UnsafeUtility.MemCpy(newUVsPtr, (void * )texData->data, dracoMesh->numVertices * elementSize); ReleaseDracoData(&texData); ReleaseDracoAttribute(&attr); } } // Copy colors. if (GetAttributeByUniqueId(dracoMesh, attributes.col, &attr)) { DracoData *colorData = null; if (GetAttributeData(dracoMesh, attr, &colorData)) { elementSize = DataTypeSize((GLTFUtilityDracoLoader.DataType)colorData->dataType) * attr->numComponents; mesh.colors = new Color[dracoMesh->numVertices]; var newColorsPtr = UnsafeUtility.AddressOf(ref mesh.colors[0]); UnsafeUtility.MemCpy(newColorsPtr, (void * )colorData->data, dracoMesh->numVertices * elementSize); ReleaseDracoData(&colorData); ReleaseDracoAttribute(&attr); } } // Copy weights. Vector4[] weights = null; if (GetAttributeByUniqueId(dracoMesh, attributes.weights, &attr)) { DracoData *weightData = null; if (GetAttributeData(dracoMesh, attr, &weightData)) { elementSize = DataTypeSize((GLTFUtilityDracoLoader.DataType)weightData->dataType) * attr->numComponents; if (attr->dataType == 9) { weights = new Vector4[dracoMesh->numVertices]; var newWeightsPtr = UnsafeUtility.AddressOf(ref weights[0]); UnsafeUtility.MemCpy(newWeightsPtr, (void * )weightData->data, dracoMesh->numVertices * elementSize); } else if (attr->dataType == 4) { var newWeightsInt = new Vector4 <UInt16> [dracoMesh->numVertices]; var newWeightsPtr = UnsafeUtility.AddressOf(ref newWeightsInt[0]); UnsafeUtility.MemCpy(newWeightsPtr, (void * )weightData->data, dracoMesh->numVertices * elementSize); weights = newWeightsInt.Select(x => new Vector4(x.x, x.y, x.z, x.w)).ToArray(); } ReleaseDracoData(&weightData); ReleaseDracoAttribute(&attr); } } // Copy joints. Vector4[] joints = null; if (GetAttributeByUniqueId(dracoMesh, attributes.joints, &attr)) { DracoData *jointData = null; if (GetAttributeData(dracoMesh, attr, &jointData)) { elementSize = DataTypeSize((GLTFUtilityDracoLoader.DataType)jointData->dataType) * attr->numComponents; if (attr->dataType == 9) { joints = new Vector4[dracoMesh->numVertices]; var newJointsPtr = UnsafeUtility.AddressOf(ref joints[0]); UnsafeUtility.MemCpy(newJointsPtr, (void * )jointData->data, dracoMesh->numVertices * elementSize); } else if (attr->dataType == 4) { var newJointsInt = new Vector4 <UInt16> [dracoMesh->numVertices]; var newJointsPtr = UnsafeUtility.AddressOf(ref newJointsInt[0]); UnsafeUtility.MemCpy(newJointsPtr, (void * )jointData->data, dracoMesh->numVertices * elementSize); joints = newJointsInt.Select(x => new Vector4(x.x, x.y, x.z, x.w)).ToArray(); } ReleaseDracoData(&jointData); ReleaseDracoAttribute(&attr); } } /* #if UNITY_2017_3_OR_NEWER * mesh.indexFormat = (newVertices.Length > System.UInt16.MaxValue) ? * UnityEngine.Rendering.IndexFormat.UInt32 : * UnityEngine.Rendering.IndexFormat.UInt16; #else * if (newVertices.Length > System.UInt16.MaxValue) { * throw new System.Exception("Draco meshes with more than 65535 vertices are only supported from Unity 2017.3 onwards."); * } #endif */ if (joints != null && weights != null) { if (joints.Length == weights.Length) { BoneWeight[] boneWeights = new BoneWeight[weights.Length]; for (int k = 0; k < boneWeights.Length; k++) { NormalizeWeights(ref weights[k]); boneWeights[k].weight0 = weights[k].x; boneWeights[k].weight1 = weights[k].y; boneWeights[k].weight2 = weights[k].z; boneWeights[k].weight3 = weights[k].w; boneWeights[k].boneIndex0 = Mathf.RoundToInt(joints[k].x); boneWeights[k].boneIndex1 = Mathf.RoundToInt(joints[k].y); boneWeights[k].boneIndex2 = Mathf.RoundToInt(joints[k].z); boneWeights[k].boneIndex3 = Mathf.RoundToInt(joints[k].w); } mesh.boneWeights = boneWeights; } else { Debug.LogWarning("Draco: joints and weights not same length. Skipped"); } } return(mesh); }
static public MeshAttributes createTileVerticesTriangles(Vector3 tilePosition, Vector3 tileDimensions) { Vector3 p0; Vector3 p1; Vector3 p2; Vector3 p3; Vector3 p4; Vector3 p5; Vector3 p6; Vector3 p7; MeshAttributes meshAttributes = new MeshAttributes(); meshAttributes.vertices = new Vector3[24]; meshAttributes.triangles = new int[36]; //top vertices p0 = (new Vector3(tileDimensions.x, tileDimensions.y, tileDimensions.z) + tilePosition); //front right p1 = (new Vector3(tileDimensions.x, tileDimensions.y, -tileDimensions.z) + tilePosition); // back right p2 = (new Vector3(-tileDimensions.x, tileDimensions.y, tileDimensions.z) + tilePosition); //front left p3 = (new Vector3(-tileDimensions.x, tileDimensions.y, -tileDimensions.z) + tilePosition); //back left //bottom vertices p4 = (new Vector3(tileDimensions.x, -tileDimensions.y, tileDimensions.z) + tilePosition); //front right p5 = (new Vector3(tileDimensions.x, -tileDimensions.y, -tileDimensions.z) + tilePosition); // back right p6 = (new Vector3(-tileDimensions.x, -tileDimensions.y, tileDimensions.z) + tilePosition); //front left p7 = (new Vector3(-tileDimensions.x, -tileDimensions.y, -tileDimensions.z) + tilePosition); //back left //top face meshAttributes.vertices[0] = p2; meshAttributes.vertices[1] = p0; meshAttributes.vertices[2] = p1; meshAttributes.vertices[3] = p3; //forward face meshAttributes.vertices[4] = p0; meshAttributes.vertices[5] = p2; meshAttributes.vertices[6] = p6; meshAttributes.vertices[7] = p4; //right face meshAttributes.vertices[8] = p1; meshAttributes.vertices[9] = p0; meshAttributes.vertices[10] = p4; meshAttributes.vertices[11] = p5; //back face meshAttributes.vertices[12] = p3; meshAttributes.vertices[13] = p1; meshAttributes.vertices[14] = p5; meshAttributes.vertices[15] = p7; //left face meshAttributes.vertices[16] = p2; meshAttributes.vertices[17] = p3; meshAttributes.vertices[18] = p7; meshAttributes.vertices[19] = p6; //bottom face meshAttributes.vertices[20] = p4; meshAttributes.vertices[21] = p6; meshAttributes.vertices[22] = p7; meshAttributes.vertices[23] = p5; //THESE ARE THE TRIS, NOT THE FACES!!! //top tris //203 meshAttributes.triangles[0] = 0; meshAttributes.triangles[1] = 1; meshAttributes.triangles[2] = 3; //013 meshAttributes.triangles[3] = 1; meshAttributes.triangles[4] = 2; meshAttributes.triangles[5] = 3; //front tris //026 meshAttributes.triangles[6] = 4; meshAttributes.triangles[7] = 5; meshAttributes.triangles[8] = 6; //064 meshAttributes.triangles[9] = 4; meshAttributes.triangles[10] = 6; meshAttributes.triangles[11] = 7; //right tris //104 meshAttributes.triangles[12] = 8; meshAttributes.triangles[13] = 9; meshAttributes.triangles[14] = 10; //145 meshAttributes.triangles[15] = 8; meshAttributes.triangles[16] = 10; meshAttributes.triangles[17] = 11; //back tris //315 meshAttributes.triangles[18] = 12; meshAttributes.triangles[19] = 13; meshAttributes.triangles[20] = 14; //357 meshAttributes.triangles[21] = 12; meshAttributes.triangles[22] = 14; meshAttributes.triangles[23] = 15; //left tris //237 meshAttributes.triangles[24] = 16; meshAttributes.triangles[25] = 17; meshAttributes.triangles[26] = 18; //276 meshAttributes.triangles[27] = 16; meshAttributes.triangles[28] = 18; meshAttributes.triangles[29] = 19; //bottom tris //467 meshAttributes.triangles[30] = 20; meshAttributes.triangles[31] = 21; meshAttributes.triangles[32] = 22; //475 meshAttributes.triangles[33] = 20; meshAttributes.triangles[34] = 22; meshAttributes.triangles[35] = 23; return(meshAttributes); }