예제 #1
0
    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);
    }
예제 #2
0
    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();
    }
예제 #3
0
    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);
        }
    }
예제 #5
0
    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);
    }
예제 #7
0
    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);
    }