示例#1
0
        private bool SpawnVoxelFaces()
        {
            // Faces
            if (!Data)
            {
                return(false);
            }

            int[,,] voxels = Data.Voxels[CurrentModelIndex];
            bool  tooLargeAsked = false;
            int   sizeX         = voxels.GetLength(0);
            int   sizeY         = voxels.GetLength(1);
            int   sizeZ         = voxels.GetLength(2);
            float maxSize       = Mathf.Max(sizeX, sizeY, sizeZ, 12);

            CameraSizeMin = 5f;
            CameraSizeMax = maxSize * 2f;
            SetCameraSize((CameraSizeMin + CameraSizeMax) * 0.5f);
            SetCameraFarClip(maxSize * 4f);
            SetCameraPosition(new Vector3(0f, 0f, -maxSize * 2f));
            ContainerTF.localPosition = -new Vector3(sizeX / 2f, sizeY / 2f, sizeZ / 2f);

            switch (CurrentEditorMode)
            {
            case EditorMode.Rigging:
                // Quads
                for (int x = 0; x < sizeX; x++)
                {
                    Util.ProgressBar("", "Importing...", ((float)x / (sizeX - 1)) * 0.5f + 0.5f);
                    for (int y = 0; y < sizeY; y++)
                    {
                        for (int z = 0; z < sizeZ; z++)
                        {
                            if (voxels[x, y, z] == 0)
                            {
                                continue;
                            }
                            AddQuad(x, y, z, voxels[x, y, z], sizeX, sizeY, sizeZ);

                            if (!tooLargeAsked && ContainerTF.childCount > MAX_QUAD_COUNT)
                            {
                                Util.ClearProgressBar();
                                bool go = Util.Dialog("", "This model is too large. Still want to edit it ?", "Yes", "Cancel");
                                tooLargeAsked = true;
                                if (!go)
                                {
                                    return(false);
                                }
                            }
                        }
                    }
                }
                break;

            case EditorMode.Sprite:
            case EditorMode.MapGenerator:
            case EditorMode.CharacterGenerator:
                bool allInOne = CurrentEditorMode == EditorMode.CharacterGenerator;
                // Mesh
                var result = Core_Voxel.CreateModel(Data, 1f, false, Core_Voxel.LightMapSupportType.SmallTextureButNoLightmap, false, Vector3.one * 0.5f);
                var vModel = result.VoxelModels != null && result.VoxelModels.Length > 0 ? result.VoxelModels[0] : null;
                for (int modelIndex = allInOne ? 0 : CurrentModelIndex; modelIndex < (allInOne ? vModel.Meshs.Length : CurrentModelIndex + 1); modelIndex++)
                {
                    var vMesh = vModel != null && vModel.Meshs != null && vModel.Meshs.Length > modelIndex ? vModel.Meshs[modelIndex] : null;
                    if (vMesh == null)
                    {
                        break;
                    }
                    for (int i = 0; i < vMesh.Count; i++)
                    {
                        var       mesh = vMesh.GetMeshAt(i);
                        Texture2D texture;
                        if (IsSpriting)
                        {
                            texture = vModel != null && vModel.Textures != null && vModel.Textures.Length > CurrentModelIndex ? vModel.Textures[CurrentModelIndex] : null;
                        }
                        else
                        {
                            texture = CurrentModelIndex == 0 && vModel != null && vModel.Textures != null && vModel.Textures.Length > 0 ? vModel.Textures[0] : null;
                        }
                        if (!mesh)
                        {
                            break;
                        }

                        FixMeshColorByNormal(mesh);

                        var meshTF = new GameObject("_mesh", typeof(MeshRenderer), typeof(MeshFilter)).transform;
                        meshTF.SetParent(ContainerTF);
                        meshTF.localPosition    = new Vector3(sizeX / 2f, sizeY / 2f, sizeZ / 2f);
                        meshTF.localScale       = Vector3.one;
                        meshTF.localRotation    = Quaternion.identity;
                        meshTF.gameObject.layer = LAYER_ID;

                        var mf = meshTF.GetComponent <MeshFilter>();
                        mf.mesh = mesh;

                        var mr  = meshTF.GetComponent <MeshRenderer>();
                        var mat = new Material(MESH_SHADER);
                        mat.SetColor(COLOR_SHADER_ID, Color.white);
                        mat.mainTexture      = texture ? texture : Texture2D.blackTexture;
                        mr.material          = mat;
                        mr.receiveShadows    = false;
                        mr.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
                    }
                }
                break;
            }
            return(true);
        }