コード例 #1
0
ファイル: VCEScene.cs プロジェクト: shrubba/planetexplorers
    private void New(VCESceneSetting setting)
    {
        m_Setting = setting;
        m_IsoData = new VCIsoData();
        m_IsoData.Init(VCIsoData.ISO_VERSION, setting, new VCIsoOption(true));
        m_IsoData.m_HeadInfo.Category = setting.m_Category;
        m_Stencil = new VCIsoData();
        m_Stencil.Init(VCIsoData.ISO_VERSION, setting, new VCIsoOption(true));
        m_TempIsoMat.Init();
        m_DocumentPath = VCConfig.s_Categories[setting.m_Category].m_DefaultPath + "/Untitled" + VCConfig.s_IsoFileExt;
        int i = 2;

        while (File.Exists(VCConfig.s_IsoPath + m_DocumentPath))
        {
            m_DocumentPath = VCConfig.s_Categories[setting.m_Category].m_DefaultPath + "/Untitled (" + i.ToString() + ")" + VCConfig.s_IsoFileExt;
            ++i;
        }
        VCEditor.Instance.m_MeshMgr.m_ColorMap = m_IsoData.m_Colors;
        m_MeshComputer = new VCMCComputer();
        m_MeshComputer.Init(m_Setting.m_EditorSize, VCEditor.Instance.m_MeshMgr);
        m_CreationAttr = new CreationAttr();
#if false
        this.GenSomeVoxelForTest();
#endif
    }
コード例 #2
0
    public string[] ScenePaths()
    {
        VCESceneSetting scene   = FindSceneSetting();
        List <string>   _scenes = new List <string> ();

        while (null != scene)
        {
            _scenes.Add(scene.m_Name);
            int pid = scene.m_ParentId;
            scene = null;
            foreach (VCESceneSetting ss in VCConfig.s_EditorScenes)
            {
                if (ss.m_Id == pid)
                {
                    scene = ss;
                    break;
                }
            }
        }
        if (_scenes.Count == 0)
        {
            return(new string[0]);
        }

        string[] scenes = new string[_scenes.Count];
        int      i      = scenes.Length;

        foreach (string sp in _scenes)
        {
            scenes[--i] = sp;
        }
        scenes[0] = "Creation";
        return(scenes);
    }
コード例 #3
0
ファイル: VCEScene.cs プロジェクト: shrubba/planetexplorers
    public VCEScene(string iso_path)
    {
        m_IsoData = new VCIsoData();
        if (!LoadIso(iso_path))
        {
            Destroy();
            throw new Exception("Load ISO error");
        }

        VCESceneSetting isosetting = m_IsoData.m_HeadInfo.FindSceneSetting();

        if (isosetting != null)
        {
            m_Setting = isosetting;
            m_Stencil = new VCIsoData();
            m_Stencil.Init(VCIsoData.ISO_VERSION, m_Setting, new VCIsoOption(true));
            m_TempIsoMat.Init();
            m_DocumentPath = iso_path;
            VCEditor.Instance.m_MeshMgr.m_ColorMap = m_IsoData.m_Colors;
            m_MeshComputer = new VCMCComputer();
            m_MeshComputer.Init(m_Setting.m_EditorSize, VCEditor.Instance.m_MeshMgr);
            m_CreationAttr = new CreationAttr();
        }
        else
        {
            Destroy();
            throw new Exception("Scene setting error");
        }
    }
コード例 #4
0
    // Init iso, destroy first, collections, header are ready.
    public void Init(int version, VCESceneSetting setting, VAOption options)
    {
        // Destroy old data
        Destroy();

        // Init header data
        m_HeadInfo          = new VCIsoHeadData();
        m_HeadInfo.Version  = version;
        m_HeadInfo.Category = setting.m_Category;
        m_HeadInfo.Author   = "";
        m_HeadInfo.Name     = "";
        m_HeadInfo.Desc     = "";
        m_HeadInfo.Remarks  = "<REMARKS />";
        m_HeadInfo.xSize    = setting.m_EditorSize.x;
        m_HeadInfo.ySize    = setting.m_EditorSize.y;
        m_HeadInfo.zSize    = setting.m_EditorSize.z;
        m_HeadInfo.IconTex  = new byte [0];
        m_HeadInfo.EnsureIconTexValid();

        // Allocate material, voxel, component, color.
        m_Materials   = new VAMaterial [MAT_ARR_CNT];
        m_DecalAssets = new VCDecalAsset[DECAL_ARR_CNT];
        m_Voxels      = new Dictionary <int, VCVoxel> ();
        m_Components  = new List <VCComponentData> ();
        m_Colors      = new Dictionary <int, Color32> ();

        // Option
        m_Options = options;
    }
コード例 #5
0
ファイル: VCConfig.cs プロジェクト: shrubba/planetexplorers
    private static void LoadEditorScenes()
    {
        s_EditorScenes = new List <VCESceneSetting> ();
#if PLANET_EXPLORERS
        SqliteDataReader reader = LocalDatabase.Instance.ExecuteQuery("SELECT * FROM vc_scene");
        while (reader.Read())
        {
            VCESceneSetting scene = new VCESceneSetting();
            scene.m_Id       = Convert.ToInt32(reader.GetString(reader.GetOrdinal("id")));
            scene.m_ParentId = Convert.ToInt32(reader.GetString(reader.GetOrdinal("parentid")));
            scene.m_Name     = reader.GetString(reader.GetOrdinal("name"));
            scene.m_Category = (EVCCategory)(Convert.ToInt32(reader.GetString(reader.GetOrdinal("category"))));
            List <string> parts = null;
            parts = VCUtils.ExplodeString(reader.GetString(reader.GetOrdinal("editorsize")), ';');
            scene.m_EditorSize   = new IntVector3();
            scene.m_EditorSize.x = Convert.ToInt32(parts[0]);
            scene.m_EditorSize.y = Convert.ToInt32(parts[1]);
            scene.m_EditorSize.z = Convert.ToInt32(parts[2]);
            parts.Clear();
            scene.m_VoxelSize     = Convert.ToSingle(reader.GetString(reader.GetOrdinal("voxelsize")));
            parts                 = VCUtils.ExplodeString(reader.GetString(reader.GetOrdinal("interval")), ';');
            scene.m_MajorInterval = Convert.ToInt32(parts[0]);
            scene.m_MinorInterval = Convert.ToInt32(parts[1]);
            parts.Clear();
            parts             = VCUtils.ExplodeString(reader.GetString(reader.GetOrdinal("cost")), ';');
            scene.m_BlockUnit = Convert.ToInt32(parts[0]);
            scene.m_DyeUnit   = Convert.ToInt32(parts[1]);
            parts.Clear();
            s_EditorScenes.Add(scene);
        }
#endif
    }
コード例 #6
0
    // begin a template scene
    public static void NewScene(VCESceneSetting setting, int template)
    {
        if (s_Instance == null)
        {
            return;
        }

        // Close current scene first
        CloseScene();

        // New VCEScene
        s_SceneId++;
        s_Scene = new VCEScene(setting, template);
        s_Scene.BuildScene();
        Debug.Log("VCE new scene. sceneid = " + s_SceneId.ToString());

        // After Scene Changed
        AfterSceneChanged(setting);
        if (OnSceneCreate != null)
        {
            OnSceneCreate(s_Scene);
        }

        // Show status
        string s = "New scene".ToLocalizationString() + " ";

        string[] scenepaths = s_Scene.m_IsoData.m_HeadInfo.ScenePaths();
        foreach (string sp in scenepaths)
        {
            s += "[" + sp.ToLocalizationString() + "] ";
        }
        s += "is ready".ToLocalizationString() + " !";
        VCEStatusBar.ShowText(s, 10, true);
    }
コード例 #7
0
    public virtual void Init(BehaviourController controller)
    {
        m_Controller   = controller;
        m_SceneSetting = controller.creationController.creationData.m_IsoData.m_HeadInfo.FindSceneSetting();

        m_DamageParticlePlayers  = new List <VCParticlePlayer>();
        m_ExplodeParticlePlayers = new List <VCParticlePlayer>();

        VCParticlePlayer[] pps = GetComponentsInChildren <VCParticlePlayer>(false);

        foreach (VCParticlePlayer pp in pps)
        {
            if (pp.FunctionTag == VCParticlePlayer.ftDamaged)
            {
                m_DamageParticlePlayers.Add(pp);
            }
            else if (pp.FunctionTag == VCParticlePlayer.ftExplode)
            {
                m_ExplodeParticlePlayers.Add(pp);
            }
        }

        m_DestructTick = 120.0f;
        m_IsWreckage   = false;
        m_Sinked       = false;
    }
コード例 #8
0
    public static void DoCreateSceneFromMsgBox()
    {
        if (s_SceneToCreate == null)
        {
            s_SceneToCreate = VCConfig.FirstSceneSetting;
        }

        VCEditor.NewScene(s_SceneToCreate);
    }
コード例 #9
0
    public void OnItemClick(GameObject sender)
    {
        VCEUICreationTypeItem sender_item = sender.GetComponentInParent <VCEUICreationTypeItem>();
        int             usage             = sender_item.usage;
        VCESceneSetting scene             = sender_item.m_Scene;

        // 树形菜单
        if (usage == 0)
        {
            parentId = scene.m_Id;
            m_BackButton.gameObject.SetActive(true);
            CreateChildItems();
        }
        // 创建新的ISO
        else if (usage == 1)
        {
            parentId = scene.m_Id;
            m_BackButton.gameObject.SetActive(true);
            CreateChildItems();
        }
        // 加载旧的ISO
        else if (usage == 2)
        {
            OnCloseClick(gameObject);
            VCEditor.Instance.m_UI.m_ISOTab.isChecked = true;
            VCEditor.Instance.m_UI.m_IsoTip.Show();
        }
        // Template
        else if (usage == 3)
        {
            TextAsset asset = Resources.Load <TextAsset>("Isos/" + scene.m_Id.ToString() + "/index");
            if (asset == null)
            {
                OnCloseClick(gameObject);
                VCEditor.NewScene(scene);
                return;
            }
            int count = 0;
            int.TryParse(asset.text, out count);
            if (count == 0)
            {
                OnCloseClick(gameObject);
                VCEditor.NewScene(scene);
                return;
            }
            int tmpIdx = (int)(Random.value * count - 0.00001f);
            OnCloseClick(gameObject);
            VCEditor.NewScene(scene, tmpIdx);
        }
        // Empty
        else if (usage == 4)
        {
            OnCloseClick(gameObject);
            VCEditor.NewScene(scene);
        }
    }
コード例 #10
0
    public override void Awake()
    {
        base.Awake();
        var cc = GetComponent <CreationController>();

        if (cc != null)
        {
            m_CreationData = cc.creationData;
            if (m_CreationData != null)
            {
                m_IsoData      = m_CreationData.m_IsoData;
                m_SceneSetting = m_IsoData.m_HeadInfo.FindSceneSetting();
                m_Attribute    = m_CreationData.m_Attribute;
                m_MassCenter   = m_Attribute.m_CenterOfMass;
            }
        }
    }
コード例 #11
0
 public void OnBtnClick()
 {
     if (m_SceneSetting.m_Category == EVCCategory.cgAbstract)
     {
         return;
     }
     UICamera.selectedObject = null;
     notExpandTime           = 0;
     if (VCEHistory.s_Modified)
     {
         s_SceneToCreate = m_SceneSetting;
         VCEMsgBox.Show(VCEMsgBoxType.SWITCH_QUERY);
     }
     else
     {
         VCEditor.NewScene(m_SceneSetting);
     }
 }
コード例 #12
0
ファイル: VCEScene.cs プロジェクト: shrubba/planetexplorers
    public VCEScene(VCESceneSetting setting, int template)
    {
        TextAsset asset = Resources.Load <TextAsset>("Isos/" + setting.m_Id.ToString() + "/" + template.ToString());

        if (asset == null)
        {
            New(setting);
            return;
        }

        m_IsoData = new VCIsoData();
        if (!m_IsoData.Import(asset.bytes, new VCIsoOption(true)))
        {
            Destroy();
            throw new Exception("Load Template ISO error");
        }

        VCESceneSetting isosetting = m_IsoData.m_HeadInfo.FindSceneSetting();

        if (isosetting != null)
        {
            m_Setting = isosetting;
            m_Stencil = new VCIsoData();
            m_Stencil.Init(VCIsoData.ISO_VERSION, m_Setting, new VCIsoOption(true));
            m_TempIsoMat.Init();
            m_DocumentPath = VCConfig.s_Categories[setting.m_Category].m_DefaultPath + "/Untitled" + VCConfig.s_IsoFileExt;
            int i = 2;
            while (File.Exists(VCConfig.s_IsoPath + m_DocumentPath))
            {
                m_DocumentPath = VCConfig.s_Categories[setting.m_Category].m_DefaultPath + "/Untitled (" + i.ToString() + ")" + VCConfig.s_IsoFileExt;
                ++i;
            }
            VCEditor.Instance.m_MeshMgr.m_ColorMap = m_IsoData.m_Colors;
            m_MeshComputer = new VCMCComputer();
            m_MeshComputer.Init(m_Setting.m_EditorSize, VCEditor.Instance.m_MeshMgr);
            m_CreationAttr = new CreationAttr();
        }
        else
        {
            Destroy();
            throw new Exception("Scene setting error");
        }
    }
コード例 #13
0
    public List <VCComponentData> FindComponentsAtPos(Vector3 wpos, int id = 0)
    {
        List <VCComponentData> list    = new List <VCComponentData> ();
        VCESceneSetting        setting = m_HeadInfo.FindSceneSetting();

        if (setting == null)
        {
            return(list);
        }
        foreach (VCComponentData cdata in m_Components)
        {
            if (Vector3.Distance(cdata.m_Position, wpos) < setting.m_VoxelSize * 0.01f)
            {
                if (id == 0 || cdata.m_ComponentId == id)
                {
                    list.Add(cdata);
                }
            }
        }
        return(list);
    }
コード例 #14
0
    public Vector3 ClampPointWorldCoord(Vector3 pos)
    {
        VCESceneSetting setting = m_HeadInfo.FindSceneSetting();

        if (setting == null)
        {
            return(Vector3.zero);
        }
        float voxelsize = setting.m_VoxelSize;
        float sx        = m_HeadInfo.xSize * voxelsize;
        float sy        = m_HeadInfo.ySize * voxelsize;
        float sz        = m_HeadInfo.zSize * voxelsize;

        if (pos.x < 0)
        {
            pos.x = 0;
        }
        else if (pos.x > sx)
        {
            pos.x = sx;
        }
        if (pos.y < 0)
        {
            pos.y = 0;
        }
        else if (pos.y > sy)
        {
            pos.y = sy;
        }
        if (pos.z < 0)
        {
            pos.z = 0;
        }
        else if (pos.z > sz)
        {
            pos.z = sz;
        }
        return(pos);
    }
コード例 #15
0
    public bool IsComponentIn(Vector3 pos)
    {
        VCESceneSetting setting = m_HeadInfo.FindSceneSetting();

        if (setting == null)
        {
            return(false);
        }
        float voxelsize = setting.m_VoxelSize;

        if (pos.x < 0)
        {
            return(false);
        }
        if (pos.y < 0)
        {
            return(false);
        }
        if (pos.z < 0)
        {
            return(false);
        }
        if (pos.x > m_HeadInfo.xSize * voxelsize)
        {
            return(false);
        }
        if (pos.y > m_HeadInfo.ySize * voxelsize)
        {
            return(false);
        }
        if (pos.z > m_HeadInfo.zSize * voxelsize)
        {
            return(false);
        }
        return(true);
    }
コード例 #16
0
ファイル: VCEUI.cs プロジェクト: shrubba/planetexplorers
    public void OnSceneCreate()
    {
        if (VCEditor.DocumentOpen())
        {
            VCESceneSetting setting = VCEditor.s_Scene.m_Setting;
            // Tab
            if (!m_ISOTab.isChecked)
            {
                m_PartTab.isChecked = true;
            }
            if (!VCEditor.s_Ready)
            {
                OnPartTab(false);
                OnMaterialTab(false);
                OnPaintTab(false);
                OnDecalTab(false);
                OnEffectTab(false);
                OnISOTab(false);
                m_PartTab.isChecked = true;
            }

            VCEditor.Instance.m_UI.m_IsoTip.Hide();
            firstvalid = true;
            UpdateErrorLabel();

            // Title label
            VCESceneSetting parentsetting = VCConfig.s_EditorScenes.Find(iter => iter.m_Id == setting.m_ParentId);
            if (parentsetting.m_Id == 1)
            {
                m_TitleLabel.text = setting.m_Name.ToUpper().ToLocalizationString();
            }
            else
            {
                m_TitleLabel.text = parentsetting.m_Name.ToUpper().ToLocalizationString() + " - " + setting.m_Name.ToUpper().ToLocalizationString();
            }
            if (VCEditor.s_Scene.m_Setting.m_Category == EVCCategory.cgObject)
            {
                m_TitleLabel.text = "OBJECT".ToLocalizationString() + " - " + m_TitleLabel.text.ToLocalizationString();
            }
            m_SceneSizeLabel.text = "  " +
                                    setting.EditorWorldSize.x.ToString("0.##") + "m x " +
                                    setting.EditorWorldSize.z.ToString("0.##") + "m x " +
                                    setting.EditorWorldSize.y.ToString("0.##") + "m";
            m_SceneSizeLabel2.text =
                VCUtils.LengthToString(setting.m_MajorInterval * setting.m_VoxelSize) + "\r\n" +
                VCUtils.LengthToString(setting.m_MinorInterval * setting.m_VoxelSize) + "\r\n" +
                VCUtils.LengthToString(setting.m_VoxelSize);

            // Part List
            m_PartList.InitTypeList();
            m_PartList.RefreshPartList(m_PartTypePopupList.selection);
            m_PartList.RepositionList();
            // Material List
            m_MaterialList.InitMatterList();
            m_MaterialList.RefreshMaterialList(m_MatterPopupList.selection);
            m_MaterialList.RepositionList();
            // Decal List
            m_DecalList.RefreshDecalList();
            m_DecalList.RepositionList();
            // Iso List
            m_IsoList.RefreshIsoList();
            m_IsoList.RepositionList();
            // Stat
            m_StatPanel.SetIsoIcon();
            m_StatPanel.OnCreationInfoRefresh();
        }
    }
コード例 #17
0
    public static GameObject GetEffect(string effect, VCESceneSetting scene_setting)
    {
        if (Instance == null)
        {
            return(null);
        }
        if (scene_setting == null)
        {
            return(null);
        }
        int vsize_cm  = Mathf.RoundToInt(scene_setting.m_VoxelSize * 100.0f);
        int ssize_x_m = Mathf.RoundToInt(scene_setting.EditorWorldSize.x);
        int ssize_z_m = Mathf.RoundToInt(scene_setting.EditorWorldSize.z);

        // [VCCase] - Get creation buff effect particle by VCESceneSetting
        // voxelsize = 3cm scene
        if (vsize_cm == 3)
        {
            if (effect.ToLower() == "fire")
            {
                return(Instance.Fire_3cm);
            }
            if (effect.ToLower() == "smoke")
            {
                return(Instance.Smoke_3cm);
            }
            if (effect.ToLower() == "wreckage spurt")
            {
                return(Instance.WreckageSpurt_3cm);
            }
        }
        // voxelsize = 10cm scene
        else if (vsize_cm == 10)
        {
            if (effect.ToLower() == "fire")
            {
                return(Instance.Fire_10cm);
            }
            if (effect.ToLower() == "smoke")
            {
                return(Instance.Smoke_10cm);
            }
            if (effect.ToLower() == "wreckage spurt")
            {
                return(Instance.WreckageSpurt_10cm);
            }
        }
        else
        {
            if (effect.ToLower() == "fire")
            {
                return(Instance.Fire_3cm);
            }
            if (effect.ToLower() == "smoke")
            {
                return(Instance.Smoke_3cm);
            }
            if (effect.ToLower() == "wreckage spurt")
            {
                return(Instance.WreckageSpurt_3cm);
            }
        }
        // 5m x 3m scene
        if (ssize_x_m == 3 && ssize_z_m == 5)
        {
            if (effect.ToLower() == "explode")
            {
                return(Instance.Explode_5x3m);
            }
        }
        // 16m x 8m scene
        else if (ssize_x_m == 8 && ssize_z_m == 16)
        {
            if (effect.ToLower() == "explode")
            {
                return(Instance.Explode_16x8m);
            }
        }
        else
        {
            if (effect.ToLower() == "explode")
            {
                return(Instance.Explode_5x3m);
            }
        }
        return(null);
    }
コード例 #18
0
ファイル: VCEScene.cs プロジェクト: shrubba/planetexplorers
 // new scene
 public VCEScene(VCESceneSetting setting)
 {
     New(setting);
 }
コード例 #19
0
    private static void AfterSceneChanged(VCESceneSetting setting)
    {
        // Mirror
        s_Mirror = new VCEMirrorSetting();
        s_Mirror.Reset(setting.m_EditorSize.x, setting.m_EditorSize.y, setting.m_EditorSize.z);

        // Mesh manager
        VCEditor.Instance.m_MeshMgr.m_VoxelSize = s_Scene.m_Setting.m_VoxelSize;
        VCEditor.Instance.m_MeshMgr.m_MeshMat   = s_Scene.m_TempIsoMat.m_EditorMat;

        // Set gameobject parameters
        // Camera
        float scale = setting.m_EditorSize.ToVector3().magnitude *setting.m_VoxelSize;

        s_Instance.m_MainCamera.nearClipPlane = setting.m_VoxelSize * 0.5f;
        s_Instance.m_MainCamera.farClipPlane  = scale * 5F;
        VCECamera vce_camera = s_Instance.m_MainCamera.GetComponent <VCECamera>();

        if (s_Scene.m_IsoData.m_Voxels.Count == 0)
        {
            vce_camera.BeginTarget   = setting.m_EditorSize.ToVector3() * setting.m_VoxelSize * 0.5F;
            vce_camera.BeginTarget.y = 0;
            vce_camera.BeginDistance = new Vector2(setting.m_EditorSize.x, setting.m_EditorSize.z).magnitude *setting.m_VoxelSize * 1.2F;
            vce_camera.MinDistance   = setting.m_VoxelSize * 0.5f;
            vce_camera.MaxDistance   = scale * 3F;
            vce_camera.Reset();
        }
        else
        {
            vce_camera.BeginTarget   = setting.m_EditorSize.ToVector3() * setting.m_VoxelSize * 0.5F;
            vce_camera.BeginDistance = setting.m_EditorSize.ToVector3().magnitude *setting.m_VoxelSize * 1.2F;
            vce_camera.MinDistance   = setting.m_VoxelSize * 0.5f;
            vce_camera.MaxDistance   = scale * 3F;
            vce_camera.Reset();
        }
        // GLs
        GLGridPlane[] gps = s_Instance.m_GLGroup.GetComponentsInChildren <GLGridPlane>(true);
        GLBound[]     gbs = s_Instance.m_GLGroup.GetComponentsInChildren <GLBound>(true);
        foreach (GLGridPlane gp in gps)
        {
            gp.m_CellCount         = new IntVector3(setting.m_EditorSize.x, setting.m_EditorSize.y, setting.m_EditorSize.z);
            gp.m_CellSize          = Vector3.one * setting.m_VoxelSize;
            gp.m_MajorGridInterval = setting.m_MajorInterval;
            gp.m_MinorGridInterval = setting.m_MinorInterval;
            gp.m_Fdisk             = setting.m_Category == EVCCategory.cgDbSword;
        }
        foreach (GLBound gb in gbs)
        {
            gb.m_Bound = new Bounds(Vector3.zero, Vector3.zero);
            gb.m_Bound.SetMinMax(Vector3.zero, setting.m_EditorSize.ToVector3() * setting.m_VoxelSize);
        }

        // UIs
        s_Instance.m_UI.OnSceneCreate();

        // VARS
        // Recent vars
        VCESelectMethod_Box.s_RecentDepth         = 1;
        VCESelectMethod_Box.s_RecentFeatherLength = 0;
        VCESelectMethod_Box.s_RecentPlaneFeather  = true;

        // Selected
        SelectedColor = Color.white;
    }
コード例 #20
0
    private void BuildStructure()
    {
        m_Prefab = new GameObject("Creation_" + m_ObjectID.ToString() + " (" + m_IsoData.m_HeadInfo.Name + ")");
        m_Prefab.transform.parent        = VCEditor.Instance.m_CreationGroup.transform;
        m_Prefab.transform.localPosition = Vector3.zero;
        m_Prefab.layer = VCConfig.s_ProductLayer;
        m_Prefab.SetActive(false);

        m_Root = new GameObject("Root");
        m_Root.transform.parent        = m_Prefab.transform;
        m_Root.transform.localPosition = Vector3.zero;
        m_Root.layer = VCConfig.s_ProductLayer;
        m_PartGroup  = new GameObject("Parts");
        m_PartGroup.transform.parent        = m_Root.transform;
        m_PartGroup.transform.localPosition = Vector3.zero;
        m_PartGroup.layer                     = VCConfig.s_ProductLayer;
        m_MeshGroup                           = new GameObject("Meshes");
        m_MeshGroup.transform.parent          = m_Root.transform;
        m_MeshGroup.transform.localPosition   = Vector3.zero;
        m_MeshGroup.layer                     = VCConfig.s_ProductLayer;
        m_DecalGroup                          = new GameObject("Decals");
        m_DecalGroup.transform.parent         = m_Root.transform;
        m_DecalGroup.transform.localPosition  = Vector3.zero;
        m_DecalGroup.layer                    = VCConfig.s_ProductLayer;
        m_EffectGroup                         = new GameObject("Effects");
        m_EffectGroup.transform.parent        = m_Root.transform;
        m_EffectGroup.transform.localPosition = Vector3.zero;
        m_EffectGroup.layer                   = VCConfig.s_ProductLayer;

        m_RootL = new GameObject("Root_L");
        m_RootL.transform.parent        = m_Prefab.transform;
        m_RootL.transform.localPosition = Vector3.zero;
        m_RootL.layer = VCConfig.s_ProductLayer;
        m_PartGroupL  = new GameObject("Parts_L");
        m_PartGroupL.transform.parent        = m_RootL.transform;
        m_PartGroupL.transform.localPosition = Vector3.zero;
        m_PartGroupL.layer                     = VCConfig.s_ProductLayer;
        m_MeshGroupL                           = new GameObject("Meshes_L");
        m_MeshGroupL.transform.parent          = m_RootL.transform;
        m_MeshGroupL.transform.localPosition   = Vector3.zero;
        m_MeshGroupL.layer                     = VCConfig.s_ProductLayer;
        m_DecalGroupL                          = new GameObject("Decals_L");
        m_DecalGroupL.transform.parent         = m_RootL.transform;
        m_DecalGroupL.transform.localPosition  = Vector3.zero;
        m_DecalGroupL.layer                    = VCConfig.s_ProductLayer;
        m_EffectGroupL                         = new GameObject("Effects_L");
        m_EffectGroupL.transform.parent        = m_RootL.transform;
        m_EffectGroupL.transform.localPosition = Vector3.zero;
        m_EffectGroupL.layer                   = VCConfig.s_ProductLayer;

        bool            dbRoot       = m_IsoData.m_HeadInfo.Category == EVCCategory.cgDbSword;
        VCESceneSetting sceneSetting = m_IsoData.m_HeadInfo.FindSceneSetting();

        foreach (VCComponentData cdata in m_IsoData.m_Components)
        {
            if (cdata.m_Type == EVCComponent.cpDecal)
            {
                if (dbRoot)
                {
                    bool isleft = cdata.m_Position.x < 0.5f * m_IsoData.m_HeadInfo.xSize * sceneSetting.m_VoxelSize;
                    if (isleft)
                    {
                        cdata.CreateEntity(false, m_DecalGroupL.transform);
                    }
                    else
                    {
                        cdata.CreateEntity(false, m_DecalGroup.transform);
                    }
                }
                else
                {
                    cdata.CreateEntity(false, m_DecalGroup.transform);
                }
            }
            else if (cdata.m_Type == EVCComponent.cpEffect)
            {
                if (dbRoot)
                {
                    bool isleft = cdata.m_Position.x < 0.5f * m_IsoData.m_HeadInfo.xSize * sceneSetting.m_VoxelSize;
                    if (isleft)
                    {
                        cdata.CreateEntity(false, m_EffectGroupL.transform);
                    }
                    else
                    {
                        cdata.CreateEntity(false, m_EffectGroup.transform);
                    }
                }
                else
                {
                    cdata.CreateEntity(false, m_EffectGroup.transform);
                }
            }
            else if (cdata.m_Type == EVCComponent.cpDbSwordHilt)
            {
                if ((cdata as VCFixedHandPartData).m_LeftHand)
                {
                    cdata.CreateEntity(false, m_PartGroupL.transform);
                    VCParticlePlayer pp = cdata.m_Entity.AddComponent <VCParticlePlayer>();
                    pp.FunctionTag   = VCParticlePlayer.ftDamaged;
                    pp.LocalPosition = cdata.m_Entity.GetComponent <VCEComponentTool>().m_SelBound.transform.localPosition;

                    m_MeshMgrL                 = m_MeshGroupL.AddComponent <VCMeshMgr>();
                    m_MeshMgrL.m_VoxelSize     = sceneSetting.m_VoxelSize;
                    m_MeshMgrL.m_ColorMap      = m_IsoData.m_Colors;
                    m_MeshMgrL.m_ColliderDirty = false;
                    m_MeshMgrL.m_MeshMat       = null;
                    m_MeshMgrL.m_DaggerMesh    = true;
                    m_MeshMgrL.m_LeftSidePos   = cdata.m_Position.x < 0.5f * m_IsoData.m_HeadInfo.xSize * sceneSetting.m_VoxelSize;
                    m_MeshMgrL.Init();
                }
                else
                {
                    cdata.CreateEntity(false, m_PartGroup.transform);
                    VCParticlePlayer pp = cdata.m_Entity.AddComponent <VCParticlePlayer>();
                    pp.FunctionTag   = VCParticlePlayer.ftDamaged;
                    pp.LocalPosition = cdata.m_Entity.GetComponent <VCEComponentTool>().m_SelBound.transform.localPosition;

                    m_MeshMgr                 = m_MeshGroup.AddComponent <VCMeshMgr>();
                    m_MeshMgr.m_VoxelSize     = sceneSetting.m_VoxelSize;
                    m_MeshMgr.m_ColorMap      = m_IsoData.m_Colors;
                    m_MeshMgr.m_ColliderDirty = false;
                    m_MeshMgr.m_MeshMat       = null;
                    m_MeshMgr.m_DaggerMesh    = true;
                    m_MeshMgr.m_LeftSidePos   = cdata.m_Position.x < 0.5f * m_IsoData.m_HeadInfo.xSize * sceneSetting.m_VoxelSize;
                    m_MeshMgr.Init();
                }
            }
            else
            {
                cdata.CreateEntity(false, m_PartGroup.transform);
                VCParticlePlayer pp = cdata.m_Entity.AddComponent <VCParticlePlayer>();
                pp.FunctionTag   = VCParticlePlayer.ftDamaged;
                pp.LocalPosition = cdata.m_Entity.GetComponent <VCEComponentTool>().m_SelBound.transform.localPosition;

                m_MeshMgr                 = m_MeshGroup.AddComponent <VCMeshMgr>();
                m_MeshMgr.m_VoxelSize     = sceneSetting.m_VoxelSize;
                m_MeshMgr.m_ColorMap      = m_IsoData.m_Colors;
                m_MeshMgr.m_ColliderDirty = false;
                m_MeshMgr.m_MeshMat       = null;
                m_MeshMgr.m_DaggerMesh    = false;
                m_MeshMgr.m_LeftSidePos   = false;
                m_MeshMgr.Init();
            }
        }

        if (m_MeshMgr == null)
        {
            m_MeshMgr                 = m_MeshGroup.AddComponent <VCMeshMgr>();
            m_MeshMgr.m_VoxelSize     = sceneSetting.m_VoxelSize;
            m_MeshMgr.m_ColorMap      = m_IsoData.m_Colors;
            m_MeshMgr.m_ColliderDirty = false;
            m_MeshMgr.m_MeshMat       = null;
            m_MeshMgr.m_DaggerMesh    = false;
            m_MeshMgr.m_LeftSidePos   = false;
            m_MeshMgr.Init();
        }
    }