예제 #1
0
    private void INLINE_CombineMeshes(ref List <int> indexes, ref Mesh visibleMesh, ref Mesh colliderMesh)
    {
        int count = indexes.Count;

        if (count > 0)
        {
            CombineInstance[] visibleCI = new CombineInstance[count], colliderCI = new CombineInstance[count];
            Mesh m;
            BlockpartVisualizeInfo bvi;
            Matrix4x4 mtr;
            for (int i = 0; i < count; i++)
            {
                bvi = blockVisualizersList[indexes[i]];
                m   = MeshMaster.GetMesh(bvi.meshType, bvi.materialID);
                visibleCI[i].mesh      = m;
                visibleCI[i].transform = bvi.GetPositionMatrix();
                mtr = bvi.GetPositionMatrix();
                visibleCI[i].transform  = mtr;
                colliderCI[i].mesh      = bvi.meshType == MeshType.Quad ? m : MeshMaster.GetMeshColliderLink(bvi.meshType);
                colliderCI[i].transform = mtr;
            }

            visibleMesh.CombineMeshes(visibleCI, true); // все подмеши используют один материал
            colliderMesh.CombineMeshes(colliderCI);
        }
    }
예제 #2
0
    private void RedrawRenderer(MeshVisualizeInfo mvi)
    {
        GameObject g;

        renderers.TryGetValue(mvi, out g);
        if (g != null)
        {
            int n = blockVisualizersList.Count;
            if (n > 0)
            {
                var indexes = new List <int>();
                for (int i = 0; i < n; i++)
                {
                    if (blockVisualizersList[i].meshInfo == mvi)
                    {
                        indexes.Add(i);
                    }
                }

                n = indexes.Count;
                if (n > 0)
                {
                    CombineInstance[]      cir = new CombineInstance[n], cic = new CombineInstance[n];
                    BlockpartVisualizeInfo bvi;
                    Mesh      cm;
                    Matrix4x4 mtr;
                    for (int i = 0; i < n; i++)
                    {
                        bvi              = blockVisualizersList[indexes[i]];
                        cm               = MeshMaster.GetMesh(bvi.meshType, bvi.materialID);
                        cir[i].mesh      = cm;
                        mtr              = bvi.GetPositionMatrix();
                        cir[i].transform = mtr;
                        cic[i].mesh      = bvi.meshType == MeshType.Quad ? cm : MeshMaster.GetMeshColliderLink(bvi.meshType);
                        cic[i].transform = mtr;
                    }
                    cm = new Mesh();
                    cm.CombineMeshes(cir);
                    g.GetComponent <MeshFilter>().sharedMesh = cm;
                    cm = new Mesh();
                    cm.CombineMeshes(cic);
                    g.GetComponent <MeshCollider>().sharedMesh = cm;
                    if (PoolMaster.useIlluminationSystem)
                    {
                        g.GetComponent <MeshRenderer>().sharedMaterial = PoolMaster.GetMaterial(mvi.materialType, mvi.illumination);
                    }
                    else
                    {
                        g.GetComponent <MeshRenderer>().sharedMaterial = PoolMaster.GetMaterial(mvi.materialType);
                    }
                }
                else
                {
                    renderers.Remove(mvi);
                    Destroy(g);
                }
            }
        }
        else
        {
            CreateBlockpartsRenderer(mvi);
        }
    }
예제 #3
0
    private static GameObject ConstructGeneratedMesh(GeneratedMeshPartInfo[,,] dataArray, int materialID)
    {
        Vector3 scale = Vector3.one;
        var     ci = new CombineInstance[RefineGeneratedMesh(ref dataArray)];
        int     i = 0, xsize = dataArray.GetLength(0), ysize = dataArray.GetLength(1), zsize = dataArray.GetLength(2);
        float   xhalf = xsize / 2f, zhalf = zsize / 2f;

        Quaternion[] rotations = new Quaternion[6]
        {
            Quaternion.identity, Quaternion.Euler(0f, 90f, 0f), Quaternion.Euler(0f, 180f, 0f),
            Quaternion.Euler(0f, 270f, 0f), Quaternion.Euler(90f, 0f, 0f), Quaternion.Euler(-90f, 0f, 0f)
        };
        Vector3[] correctionVectors = new Vector3[6]
        {
            Vector3.forward * 0.5f *scale.z, Vector3.right * 0.5f *scale.x, Vector3.back * 0.5f *scale.z,
                  Vector3.left * 0.5f *scale.x, Vector3.up * 0.5f *scale.y, Vector3.down * 0.5f *scale.y
        };
        for (int x = 0; x < xsize; x++)
        {
            for (int y = 0; y < ysize; y++)
            {
                for (int z = 0; z < zsize; z++)
                {
                    var gmi = dataArray[x, y, z];
                    if (gmi.fwdFaceType != MeshType.NoMesh)
                    {
                        ci[i].mesh      = MeshMaster.GetMesh(gmi.fwdFaceType, materialID);
                        ci[i].transform = Matrix4x4.TRS((new Vector3(x - xhalf, y - ysize, z - zhalf) + correctionVectors[0]), rotations[0], scale);
                        i++;
                    }
                    if (gmi.rightFaceType != MeshType.NoMesh)
                    {
                        ci[i].mesh      = MeshMaster.GetMesh(gmi.rightFaceType, materialID);
                        ci[i].transform = Matrix4x4.TRS((new Vector3(x - xhalf, y - ysize, z - zhalf) + correctionVectors[1]), rotations[1], scale);
                        i++;
                    }
                    if (gmi.backFaceType != MeshType.NoMesh)
                    {
                        ci[i].mesh      = MeshMaster.GetMesh(gmi.backFaceType, materialID);
                        ci[i].transform = Matrix4x4.TRS((new Vector3(x - xhalf, y - ysize, z - zhalf) + correctionVectors[2]), rotations[2], scale);
                        i++;
                    }
                    if (gmi.leftFaceType != MeshType.NoMesh)
                    {
                        ci[i].mesh      = MeshMaster.GetMesh(gmi.leftFaceType, materialID);
                        ci[i].transform = Matrix4x4.TRS((new Vector3(x - xhalf, y - ysize, z - zhalf) + correctionVectors[3]), rotations[3], scale);
                        i++;
                    }
                    if (gmi.upFaceType != MeshType.NoMesh)
                    {
                        ci[i].mesh      = MeshMaster.GetMesh(gmi.upFaceType, materialID);
                        ci[i].transform = Matrix4x4.TRS((new Vector3(x - xhalf, y - ysize, z - zhalf) + correctionVectors[4]), rotations[5], scale);
                        i++;
                    }
                    if (gmi.downFaceType != MeshType.NoMesh)
                    {
                        ci[i].mesh      = MeshMaster.GetMesh(gmi.downFaceType, materialID);
                        ci[i].transform = Matrix4x4.TRS((new Vector3(x - xhalf, y - ysize, z - zhalf) + correctionVectors[5]), rotations[5], scale);
                        i++;
                    }
                    if (gmi.innerFaceType != MeshType.NoMesh)
                    {
                        ci[i].mesh      = MeshMaster.GetMesh(gmi.innerFaceType, materialID);
                        ci[i].transform = Matrix4x4.TRS((new Vector3(x - xhalf, y - ysize, z - zhalf)),
                                                        (gmi.fwdFaceType == MeshType.NoMesh) ? rotations[0] : (gmi.rightFaceType == MeshType.NoMesh ? rotations[1] : (
                                                                                                                   gmi.backFaceType == MeshType.NoMesh ? rotations[2] : rotations[3]
                                                                                                                   )),
                                                        scale);
                        i++;
                    }
                }
            }
        }
        GameObject g  = new GameObject("peak model");
        var        mf = g.AddComponent <MeshFilter>();
        var        m  = new Mesh();

        m.CombineMeshes(ci, true);
        mf.sharedMesh = m;
        var mr = g.AddComponent <MeshRenderer>();

        mr.sharedMaterial = PoolMaster.GetMaterial(materialID);
        if (PoolMaster.shadowCasting)
        {
            mr.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On;
            mr.receiveShadows    = true;
        }
        else
        {
            mr.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
            mr.receiveShadows    = false;
        }
        mr.lightProbeUsage      = UnityEngine.Rendering.LightProbeUsage.Off;
        mr.reflectionProbeUsage = UnityEngine.Rendering.ReflectionProbeUsage.Off;
        return(g);
    }
예제 #4
0
    private void CreateBlockpartsRenderer(MeshVisualizeInfo mvi)
    {
        if (renderers.ContainsKey(mvi))
        {
            return;
        }
        var processingIndexes = new List <int>();

        for (int i = 0; i < blockVisualizersList.Count; i++)
        {
            if (blockVisualizersList[i].meshInfo == mvi)
            {
                processingIndexes.Add(i);
            }
        }

        int pcount = processingIndexes.Count;

        if (pcount > 0)
        {
            var  ci = new CombineInstance[pcount];
            Mesh m;
            BlockpartVisualizeInfo cdata;
            for (int j = 0; j < pcount; j++)
            {
                cdata           = blockVisualizersList[processingIndexes[j]];
                m               = MeshMaster.GetMesh(cdata.meshType, cdata.materialID);
                ci[j].mesh      = m;
                ci[j].transform = cdata.GetPositionMatrix();
            }

            GameObject g = new GameObject();
            m = new Mesh();
            m.CombineMeshes(ci, true); // все подмеши используют один материал

            //удаление копий вершин на стыках - отменено из-за uv

            var mf = g.AddComponent <MeshFilter>();
            mf.sharedMesh = m;

            var mr = g.AddComponent <MeshRenderer>();
            mr.shadowCastingMode    = UnityEngine.Rendering.ShadowCastingMode.Off;
            mr.receiveShadows       = PoolMaster.shadowCasting;
            mr.lightProbeUsage      = UnityEngine.Rendering.LightProbeUsage.Off;
            mr.reflectionProbeUsage = UnityEngine.Rendering.ReflectionProbeUsage.Off;
            if (!PoolMaster.useIlluminationSystem)
            {
                mr.sharedMaterial = PoolMaster.GetMaterial(mvi.materialType);
            }
            else
            {
                mr.sharedMaterial = PoolMaster.GetMaterial(mvi.materialType, mvi.illumination);
            }

            g.transform.parent = renderersHolders[mvi.faceIndex].transform;
            g.AddComponent <MeshCollider>().sharedMesh = m;
            g.tag = BLOCK_COLLIDER_TAG;

            renderers.Add(mvi, g);
        }
    }