예제 #1
0
        /// <inheritdoc />
        public CollisionDataWindow(Editor editor, AssetItem item)
            : base(editor, item)
        {
            // Toolstrip
            _toolstrip.AddSeparator();
            _toolstrip.AddButton(editor.Icons.Docs32, () => Platform.StartProcess(Utilities.Constants.DocsUrl + "manual/physics/colliders/collision-data.html")).LinkTooltip("See documentation to learn more");

            // Split Panel
            _split = new SplitPanel(Orientation.Horizontal, ScrollBars.None, ScrollBars.Vertical)
            {
                DockStyle     = DockStyle.Fill,
                SplitterValue = 0.7f,
                Parent        = this
            };

            // Model preview
            _preview = new ModelPreview(true)
            {
                ViewportCamera = new FPSCamera(),
                Parent         = _split.Panel1
            };

            // Asset properties
            _propertiesPresenter = new CustomEditorPresenter(null);
            _propertiesPresenter.Panel.Parent = _split.Panel2;
            _properties = new PropertiesProxy();
            _propertiesPresenter.Select(_properties);
        }
예제 #2
0
        public void LoadStaticMesh(int index)
        {
            try
            {
                stm = ObjectBinary.From <StaticMesh>(Pcc.GetUExport(index));
                //var mesh = ObjectBinary.From <StaticMesh>(Pcc.getUExport(index));
                // Load meshes for the LODs
                preview?.Dispose();
                preview = new ModelPreview(view.Context.Device, stm, 0, view.Context.TextureCache);
                RefreshChosenMaterialsList();
                CenterView();

                // Update treeview
                treeView1.BeginUpdate();
                treeView1.Nodes.Clear();
                //treeView1.Nodes.Add(stm.ToTree());
                //treeView1.Nodes[0].Expand();
                treeView1.EndUpdate();
                MaterialBox.Visible              = false;
                MaterialApplyButton.Visible      = false;
                MaterialIndexBox.Visible         = false;
                MaterialIndexApplyButton.Visible = false;
            }
            catch (Exception e)
            {
                MessageBox.Show(ExceptionHandlerDialogWPF.FlattenException(e));
            }
        }
예제 #3
0
        /// <inheritdoc />
        public override void OnThumbnailDrawPrepare(ThumbnailRequest request)
        {
            if (_preview == null)
            {
                _preview = new ModelPreview(false);
                InitAssetPreview(_preview);
            }

            // TODO: disable streaming for asset during thumbnail rendering (and restore it after)
        }
예제 #4
0
        /// <inheritdoc />
        public override void Dispose()
        {
            if (_preview != null)
            {
                _preview.Dispose();
                _preview = null;
            }

            base.Dispose();
        }
예제 #5
0
        /// <inheritdoc />
        public override void OnThumbnailDrawPrepare(ThumbnailRequest request)
        {
            if (_preview == null)
            {
                _preview = new ModelPreview(false);
                _preview.RenderOnlyWithWindow = false;
                _preview.Task.Enabled         = false;
                _preview.Size = new Vector2(PreviewsCache.AssetIconSize, PreviewsCache.AssetIconSize);
                _preview.SyncBackbufferSize();
            }

            // TODO: disable streaming for asset during thumbnail rendering (and restore it after)
        }
예제 #6
0
        /// <inheritdoc />
        public override void OnThumbnailDrawPrepare(ThumbnailRequest request)
        {
            if (_preview == null)
            {
                _preview = new ModelPreview(false);
                _preview.RenderOnlyWithWindow = false;
                _preview.Task.Enabled         = false;
                _preview.PostFxVolume.Settings.Eye_Technique = EyeAdaptationTechnique.None;
                _preview.PostFxVolume.Settings.Eye_Exposure  = 0.1f;
                _preview.PostFxVolume.Settings.data.Flags4  |= 0b1001;
                _preview.Size = new Vector2(PreviewsCache.AssetIconSize, PreviewsCache.AssetIconSize);
                _preview.SyncBackbufferSize();
            }

            // TODO: disable streaming for asset during thumbnail rendering (and restore it after)
        }
예제 #7
0
        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            int      n = MaterialBox.SelectedIndex;
            TreeNode t = treeView1.SelectedNode;

            if (n == -1 || Pcc == null || t == null || t.Parent == null)
            {
                return;
            }

            if (stm != null && t.Parent.Text == "Sections")
            {
                //DISABLED TEMP

                //stm.SetSectionMaterial(CurrentLOD, t.Index, Materials[n] + 1);


                //SerializingCont
                //                MemoryStream ms = new MemoryStream();
                //              Pcc.Exports[stm.index].Data = stm.SerializeToBuffer();


                //DISABLED TEMP
                //stm.Export.Data = stm.SerializeToBuffer(); //hope this works
                // Update treeview

                // Update preview
                preview.Dispose();
                preview = new ModelPreview(view.Context.Device, stm, 0, view.Context.TextureCache);
            }
            else if (skm != null && t.Parent.Text == "Materials")
            {
                skm.Materials[t.Index] = Materials[n] + 1;
                SerializingContainer con = new SerializingContainer();
                con.Memory    = new MemoryStream();
                con.isLoading = false;
                skm.Serialize(con);
                skm.Export.setBinaryData(con.Memory.ToArray());

                //Old binary setting code
                //int end = skm.GetPropertyEnd();
                //MemoryStream mem = new MemoryStream();
                //mem.Write(Pcc.Exports[skm.MyIndex].Data, 0, end);
                //mem.Write(con.Memory.ToArray(), 0, (int)con.Memory.Length);
                //Pcc.Exports[skm.MyIndex].Data = mem.ToArray();
            }
        }
예제 #8
0
        public void LoadSkeletalMesh(int uindex)
        {
            DisableLODs();
            UnCheckLODs();
            try
            {
                skm = new SkeletalMesh(Pcc.GetUExport(uindex));

                // Load preview model
                preview?.Dispose();
                preview = new ModelPreview(view.Context.Device, skm, view.Context.TextureCache);
                RefreshChosenMaterialsList();
                CenterView();

                // Update treeview
                treeView1.BeginUpdate();
                treeView1.Nodes.Clear();
                treeView1.Nodes.Add(skm.ToTree());
                treeView1.Nodes[0].Expand();
                treeView1.EndUpdate();
                lODToolStripMenuItem.Visible  = true;
                lOD0ToolStripMenuItem.Enabled = true;
                lOD0ToolStripMenuItem.Checked = true;
                if (skm.LODModels.Count > 1)
                {
                    lOD1ToolStripMenuItem.Enabled = true;
                }
                if (skm.LODModels.Count > 2)
                {
                    lOD2ToolStripMenuItem.Enabled = true;
                }
                if (skm.LODModels.Count > 3)
                {
                    lOD3ToolStripMenuItem.Enabled = true;
                }
                MaterialBox.Visible              = false;
                MaterialApplyButton.Visible      = false;
                MaterialIndexBox.Visible         = false;
                MaterialIndexApplyButton.Visible = false;
            }
            catch (Exception e)
            {
                MessageBox.Show(ExceptionHandlerDialogWPF.FlattenException(e));
            }
        }
예제 #9
0
        /// <inheritdoc />
        public override void OnThumbnailDrawPrepare(ThumbnailRequest request)
        {
            if (_preview == null)
            {
                _preview = new ModelPreview(false);
                _preview.RenderOnlyWithWindow = false;
                _preview.Task.Enabled         = false;

                var eyeAdaptation = _preview.PostFxVolume.EyeAdaptation;
                eyeAdaptation.Mode                  = EyeAdaptationMode.None;
                eyeAdaptation.OverrideFlags        |= EyeAdaptationSettings.Override.Mode;
                _preview.PostFxVolume.EyeAdaptation = eyeAdaptation;

                _preview.Size = new Vector2(PreviewsCache.AssetIconSize, PreviewsCache.AssetIconSize);
                _preview.SyncBackbufferSize();
            }

            // TODO: disable streaming for asset during thumbnail rendering (and restore it after)
        }
예제 #10
0
        /// <inheritdoc />
        public override void OnThumbnailDrawPrepare(ThumbnailRequest request)
        {
            if (_preview == null)
            {
                _preview = new ModelPreview(false)
                {
                    RenderOnlyWithWindow = false,
                    AnchorPreset         = AnchorPresets.StretchAll,
                    Offsets = Margin.Zero,
                };
                _preview.Task.Enabled = false;

                var eyeAdaptation = _preview.PostFxVolume.EyeAdaptation;
                eyeAdaptation.Mode                  = EyeAdaptationMode.None;
                eyeAdaptation.OverrideFlags        |= EyeAdaptationSettingsOverride.Mode;
                _preview.PostFxVolume.EyeAdaptation = eyeAdaptation;
            }

            // TODO: disable streaming for asset during thumbnail rendering (and restore it after)
        }
예제 #11
0
        public void LoadStaticMesh(int index)
        {
            stm = new StaticMesh(Pcc, index);

            // Load meshes for the LODs
            preview?.Dispose();
            preview = new ModelPreview(view.Device, stm, view.TextureCache);
            RefreshChosenMaterialsList();
            CenterView();

            // Update treeview
            treeView1.BeginUpdate();
            treeView1.Nodes.Clear();
            treeView1.Nodes.Add(stm.ToTree());
            treeView1.Nodes[0].Expand();
            treeView1.EndUpdate();
            MaterialBox.Visible              = false;
            MaterialApplyButton.Visible      = false;
            MaterialIndexBox.Visible         = false;
            MaterialIndexApplyButton.Visible = false;
        }
예제 #12
0
        public void LoadSkeletalMesh(int index)
        {
            DisableLODs();
            UnCheckLODs();
            skm    = new SkeletalMesh(pcc, index);
            skmold = new SkeletalMeshOld(pcc, index);

            // Load preview model
            preview?.Dispose();
            preview = new ModelPreview(view.Device, skm, view.TextureCache);
            RefreshChosenMaterialsList();
            CenterView();

            // Update treeview
            treeView1.BeginUpdate();
            treeView1.Nodes.Clear();
            treeView1.Nodes.Add(skm.ToTree());
            treeView1.Nodes[0].Expand();
            treeView1.EndUpdate();
            lODToolStripMenuItem.Visible  = true;
            lOD0ToolStripMenuItem.Enabled = true;
            lOD0ToolStripMenuItem.Checked = true;
            if (skm.LODModels.Count > 1)
            {
                lOD1ToolStripMenuItem.Enabled = true;
            }
            if (skm.LODModels.Count > 2)
            {
                lOD2ToolStripMenuItem.Enabled = true;
            }
            if (skm.LODModels.Count > 3)
            {
                lOD3ToolStripMenuItem.Enabled = true;
            }
            MaterialBox.Visible              = false;
            MaterialApplyButton.Visible      = false;
            MaterialIndexBox.Visible         = false;
            MaterialIndexApplyButton.Visible = false;
        }
예제 #13
0
        /// <inheritdoc />
        public CollisionDataWindow(Editor editor, AssetItem item)
            : base(editor, item)
        {
            // Split Panel
            var splitPanel = new SplitPanel(Orientation.Horizontal, ScrollBars.None, ScrollBars.Vertical)
            {
                DockStyle     = DockStyle.Fill,
                SplitterValue = 0.7f,
                Parent        = this
            };

            // Model preview
            _preview = new ModelPreview(true)
            {
                Parent = splitPanel.Panel1
            };

            // Asset properties
            _propertiesPresenter = new CustomEditorPresenter(null);
            _propertiesPresenter.Panel.Parent = splitPanel.Panel2;
            _properties = new PropertiesProxy();
            _propertiesPresenter.Select(_properties);
        }
예제 #14
0
        public static void SetupAssets(KCModHelper _helper)
        {
            _helper.Log("-----------HOOKING UP ASSETS------------");

            // Setup District UI
            GameObject District_UI_GameObject = GameObject.Instantiate(AssetsLoader.GetAsset("District") as GameObject);
            Transform  Worker_UI = GameState.inst.playingMode.GameUIParent.transform.Find("WorkerUICanvas").Find("WorkerUI");

            District_UI_GameObject.transform.SetParent(Worker_UI, false);

            // Collect Specific Children In District UI
            List <String> filter = new List <String>(new String[] {
                "District(Clone)", "Expand", "CreateSwatch", "ToggleSwatchPicker",
                "Dropdown", "Options", "Option", "ContentBar", "Picker", "Fill",
                "InputField", "BoxSlider", "Hue", "Background", "ModelPreview",
                "ToggleDeleteMode"
            });

            District_UI_Children = Utilities.CollectChildren(District_UI_GameObject.transform, null, filter);

            GameObject Option_Prefab = District_UI_Children.Find(i => i.name == "Option").gameObject;
            AssetInfo  option_Info   = new AssetInfo("Option.Prefab", Option_Prefab.GetType(), Option_Prefab);

            AssetsLoader.assets.Add(option_Info);
            _helper.Log(option_Info.ToString());


            // Mod Components
            District           district_Component           = District_UI_GameObject.AddComponent <District>();
            Expand             expand_Component             = District_UI_Children.Find(i => i.name == "Expand").gameObject.AddComponent <Expand>();
            CreateSwatch       createSwatch_Component       = District_UI_Children.Find(i => i.name == "CreateSwatch").gameObject.AddComponent <CreateSwatch>();
            ModelPreview       modelPreview_Component       = District_UI_Children.Find(i => i.name == "ModelPreview").gameObject.AddComponent <ModelPreview>();
            ToggleSwatchPicker toggleSwatchPicker_Component = District_UI_Children.Find(i => i.name == "ToggleSwatchPicker").gameObject.AddComponent <ToggleSwatchPicker>();
            ToggleDeleteMode   toggleDeleteMode_Componenet  = District_UI_Children.Find(i => i.name == "ToggleDeleteMode").gameObject.AddComponent <ToggleDeleteMode>();


            district_Component.AddSwatch(Color.white, District.SwatchType.Default);
            district_Component.AddSwatch(Color.blue, District.SwatchType.Default);
            district_Component.AddSwatch(Color.cyan, District.SwatchType.Default);
            district_Component.AddSwatch(Color.gray, District.SwatchType.Default);
            district_Component.AddSwatch(Color.green, District.SwatchType.Default);
            district_Component.AddSwatch(Color.magenta, District.SwatchType.Default);
            district_Component.AddSwatch(Color.red, District.SwatchType.Default);
            district_Component.AddSwatch(Color.yellow, District.SwatchType.Default);


            // Color Picker
            ColorPicker colorPicker_Component = District_UI_Children.Find(i => i.name == "Picker").gameObject.AddComponent <ColorPicker>();
            ColorImage  colorImage_Component  = District_UI_Children.Find(i => i.name == "Fill").gameObject.AddComponent <ColorImage>();

            colorImage_Component.picker = colorPicker_Component;
            HexColorField hexColorField_Component = District_UI_Children.Find(i => i.name == "InputField").gameObject.AddComponent <HexColorField>();

            hexColorField_Component.hsvpicker = colorPicker_Component;
            BoxSlider boxSlider_Component = District_UI_Children.Find(i => i.name == "BoxSlider").gameObject.AddComponent <BoxSlider>();

            boxSlider_Component.handleRect = boxSlider_Component.transform.Find("Handle Slide Area").Find("Handle").GetComponent <RectTransform>();
            SVBoxSlider sVBoxSlider = boxSlider_Component.gameObject.AddComponent <SVBoxSlider>();

            sVBoxSlider.picker = colorPicker_Component;
            ColorSlider colorSlider_Component = District_UI_Children.Find(i => i.name == "Hue").gameObject.AddComponent <ColorSlider>();

            colorSlider_Component.hsvpicker = colorPicker_Component;
            colorSlider_Component.type      = ColorValues.Hue;
            ColorSliderImage colorSliderImage_Component = colorSlider_Component.transform.Find("Background").gameObject.AddComponent <ColorSliderImage>();

            colorSliderImage_Component.picker    = colorPicker_Component;
            colorSliderImage_Component.type      = ColorValues.Hue;
            colorSliderImage_Component.direction = Slider.Direction.BottomToTop;

            _helper.Log("-----------ASSETS HOOKED UP------------");
        }
예제 #15
0
 public override void AttachPreview(IAssetPreview preview)
 {
     modelPreview = (ModelPreview)preview;
 }
        private void ReadMaterial(ExportEntry export, PackageCache assetCache = null)
        {
            if (export.ClassName == "Material")
            {
                var parsedMaterial = ObjectBinary.From <Material>(export);
                StaticParameterSet = (StaticParameterSet)parsedMaterial.SM3MaterialResource.ID;
                foreach (var v in parsedMaterial.SM3MaterialResource.UniformExpressionTextures)
                {
                    IEntry tex = export.FileRef.GetEntry(v.value);
                    if (tex != null)
                    {
                        Textures.Add(tex);
                    }
                }
            }
            else if (export.ClassName == "RvrEffectsMaterialUser")
            {
                var props = export.GetProperties();
                if (export.GetProperty <ObjectProperty>("m_pBaseMaterial") is ObjectProperty baseProp)
                {
                    // This is an instance... maybe?
                    if (baseProp.Value > 0)
                    {
                        // Local export
                        ReadMaterial(export.FileRef.GetUExport(baseProp.Value));
                    }
                    else
                    {
                        ImportEntry ie            = export.FileRef.GetImport(baseProp.Value);
                        var         externalEntry = EntryImporter.ResolveImport(ie, null, assetCache);
                        if (externalEntry != null)
                        {
                            ReadMaterial(externalEntry);
                        }
                    }
                }
            }
            else if (export.ClassName == "MaterialInstanceConstant")
            {
                if (ObjectBinary.From(export) is MaterialInstance matInstBin)
                {
                    StaticParameterSet = matInstBin.SM3StaticParameterSet;
                }
                //Read Local
                if (export.GetProperty <ArrayProperty <StructProperty> >("TextureParameterValues") is ArrayProperty <StructProperty> textureparams)
                {
                    foreach (var param in textureparams)
                    {
                        var paramValue = param.GetProp <ObjectProperty>("ParameterValue");
                        var texntry    = export.FileRef.GetEntry(paramValue.Value);
                        if (texntry?.ClassName == "Texture2D" && !Textures.Contains(texntry))
                        {
                            Textures.Add(texntry);
                        }
                    }
                }

                if (export.GetProperty <ArrayProperty <ObjectProperty> >("ReferencedTextures") is ArrayProperty <ObjectProperty> textures)
                {
                    foreach (var obj in textures)
                    {
                        var texntry = export.FileRef.GetEntry(obj.Value);
                        if (texntry.ClassName == "Texture2D" && !Textures.Contains(texntry))
                        {
                            Textures.Add(texntry);
                        }
                    }
                }

                //Read parent
                if (export.GetProperty <ObjectProperty>("Parent") is ObjectProperty parentObjProp)
                {
                    // This is an instance... maybe?
                    if (parentObjProp.Value > 0)
                    {
                        // Local export
                        ReadMaterial(export.FileRef.GetUExport(parentObjProp.Value));
                    }
                    else
                    {
                        ImportEntry ie            = export.FileRef.GetImport(parentObjProp.Value);
                        var         externalEntry = ModelPreview.FindExternalAsset(ie, null, null);
                        if (externalEntry != null)
                        {
                            ReadMaterial(externalEntry);
                        }
                    }
                }
            }
        }
예제 #17
0
        public override void PrepareRenderables()
        {
            var voxel             = GetVoxel();
            var palette           = GetPalette();
            var playerPalette     = GetPlayerPalette();
            var normalsPalette    = GetNormalsPalette();
            var shadowPalette     = GetShadowPalette();
            var scale             = GetScale();
            var rotation          = GetRotation();
            var lightAmbientColor = GetLightAmbientColor();
            var lightDiffuseColor = GetLightDiffuseColor();
            var lightPitch        = GetLightPitch();
            var lightYaw          = GetLightYaw();
            var cameraAngle       = GetCameraAngle();

            if (voxel == null || palette == null)
            {
                return;
            }

            if (voxel != cachedVoxel)
            {
                cachedVoxel = voxel;
            }

            if (palette != cachedPalette)
            {
                if (string.IsNullOrEmpty(palette) && string.IsNullOrEmpty(playerPalette))
                {
                    return;
                }

                var paletteName = string.IsNullOrEmpty(palette) ? playerPalette : palette;
                paletteReference = WorldRenderer.Palette(paletteName);
                cachedPalette    = paletteName;
            }

            if (playerPalette != cachedPlayerPalette)
            {
                paletteReferencePlayer = WorldRenderer.Palette(playerPalette);
                cachedPlayerPalette    = playerPalette;
            }

            if (normalsPalette != cachedNormalsPalette)
            {
                paletteReferenceNormals = WorldRenderer.Palette(normalsPalette);
                cachedNormalsPalette    = normalsPalette;
            }

            if (shadowPalette != cachedShadowPalette)
            {
                paletteReferenceShadow = WorldRenderer.Palette(shadowPalette);
                cachedShadowPalette    = shadowPalette;
            }

            if (scale != cachedScale)
            {
                cachedScale = scale;
            }

            if (rotation != cachedRotation)
            {
                cachedRotation = rotation;
            }

            if (lightPitch != cachedLightPitch)
            {
                cachedLightPitch = lightPitch;
            }

            if (lightYaw != cachedLightYaw)
            {
                cachedLightYaw = lightYaw;
            }

            if (cachedLightAmbientColor[0] != lightAmbientColor[0] || cachedLightAmbientColor[1] != lightAmbientColor[1] || cachedLightAmbientColor[2] != lightAmbientColor[2])
            {
                cachedLightAmbientColor = lightAmbientColor;
            }

            if (cachedLightDiffuseColor[0] != lightDiffuseColor[0] || cachedLightDiffuseColor[1] != lightDiffuseColor[1] || cachedLightDiffuseColor[2] != lightDiffuseColor[2])
            {
                cachedLightDiffuseColor = lightDiffuseColor;
            }

            if (cameraAngle != cachedCameraAngle)
            {
                cachedCameraAngle = cameraAngle;
            }

            if (cachedVoxel == null)
            {
                return;
            }

            var animation = new ModelAnimation(
                cachedVoxel,
                () => WVec.Zero,
                () => cachedRotation,
                () => false,
                () => 0,
                true);

            var animations = new ModelAnimation[] { animation };

            ModelPreview preview = new ModelPreview(
                new ModelAnimation[] { animation }, WVec.Zero, 0,
                cachedScale,
                new WAngle(cachedLightPitch),
                new WAngle(cachedLightYaw),
                cachedLightAmbientColor,
                cachedLightDiffuseColor,
                cachedCameraAngle,
                paletteReference,
                paletteReferenceNormals,
                paletteReferenceShadow);

            var screenBounds = animation.ScreenBounds(WPos.Zero, WorldRenderer, scale);

            IdealPreviewSize = new int2(screenBounds.Width, screenBounds.Height);
            var origin = RenderOrigin + new int2(RenderBounds.Size.Width / 2, RenderBounds.Size.Height / 2);

            var camera          = new WRot(WAngle.Zero, cachedCameraAngle - new WAngle(256), new WAngle(256));
            var modelRenderable = new UIModelRenderable(
                animations, WPos.Zero, origin, 0, camera, scale,
                WRot.None, cachedLightAmbientColor, cachedLightDiffuseColor,
                paletteReferencePlayer, paletteReferenceNormals, paletteReferenceShadow);

            renderable = modelRenderable.PrepareRender(WorldRenderer);
        }
예제 #18
0
        public override void PrepareRenderables()
        {
            var voxel             = GetVoxel();
            var palette           = GetPalette();
            var playerPalette     = GetPlayerPalette();
            var normalsPalette    = GetNormalsPalette();
            var shadowPalette     = GetShadowPalette();
            var scale             = GetScale();
            var lightAmbientColor = GetLightAmbientColor();
            var lightDiffuseColor = GetLightDiffuseColor();
            var lightPitch        = GetLightPitch();
            var lightYaw          = GetLightYaw();

            if (voxel == null || palette == null)
            {
                return;
            }

            if (voxel != cachedVoxel)
            {
                offset      = 0.5f * (new float2(RenderBounds.Size) - new float2(voxel.Size[0], voxel.Size[1]));
                cachedVoxel = voxel;
            }

            if (palette != cachedPalette)
            {
                if (string.IsNullOrEmpty(palette) && string.IsNullOrEmpty(playerPalette))
                {
                    return;
                }
                string paletteName = string.IsNullOrEmpty(palette) ? playerPalette : palette;
                pr            = WorldRenderer.Palette(paletteName);
                cachedPalette = paletteName;
            }

            if (playerPalette != cachedPlayerPalette)
            {
                prPlayer            = WorldRenderer.Palette(playerPalette);
                cachedPlayerPalette = playerPalette;
            }

            if (normalsPalette != cachedNormalsPalette)
            {
                prNormals            = WorldRenderer.Palette(normalsPalette);
                cachedNormalsPalette = normalsPalette;
            }

            if (shadowPalette != cachedShadowPalette)
            {
                prShadow            = WorldRenderer.Palette(shadowPalette);
                cachedShadowPalette = shadowPalette;
            }

            if (scale != cachedScale)
            {
                //offset *= scale;
                cachedScale = scale;
            }

            if (lightPitch != cachedLightPitch)
            {
                cachedLightPitch = lightPitch;
            }

            if (lightYaw != cachedLightYaw)
            {
                cachedLightYaw = lightYaw;
            }

            if (cachedLightAmbientColor[0] != lightAmbientColor[0] || cachedLightAmbientColor[1] != lightAmbientColor[1] || cachedLightAmbientColor[2] != lightAmbientColor[2])
            {
                cachedLightAmbientColor = lightAmbientColor;
            }

            if (cachedLightDiffuseColor[0] != lightDiffuseColor[0] || cachedLightDiffuseColor[1] != lightDiffuseColor[1] || cachedLightDiffuseColor[2] != lightDiffuseColor[2])
            {
                cachedLightDiffuseColor = lightDiffuseColor;
            }
            if (cachedVoxel == null)
            {
                return;
            }
            var            size      = new float2(cachedVoxel.Size[0] * cachedScale, cachedVoxel.Size[1] * cachedScale);
            ModelAnimation animation = new ModelAnimation(
                cachedVoxel,
                () => WVec.Zero,
                () => new List <WRot>()
            {
                new WRot(
                    new WAngle(-45),
                    new WAngle(-30),
                    new WAngle(360)
                    )
            },
                () => false,
                () => 0,
                true);

            ModelPreview preview = new ModelPreview(
                new ModelAnimation[] { animation }, WVec.Zero, 0,
                cachedScale,
                new WAngle(cachedLightPitch),
                new WAngle(cachedLightYaw),
                cachedLightAmbientColor,
                cachedLightDiffuseColor,
                new WAngle(),
                pr,
                prNormals,
                prShadow);

            List <ModelPreview> previews = new List <ModelPreview>()
            {
                preview
            };


            // Calculate the preview bounds
            PreviewOffset    = int2.Zero;
            IdealPreviewSize = int2.Zero;

            var rs = previews.SelectMany(p => ((IActorPreview)p).ScreenBounds(WorldRenderer, WPos.Zero));

            if (rs.Any())
            {
                var b = rs.First();
                foreach (var rr in rs.Skip(1))
                {
                    b = OpenRA.Primitives.Rectangle.Union(b, rr);
                }

                IdealPreviewSize = new int2(b.Width, b.Height);
                PreviewOffset    = -new int2(b.Left, b.Top) - IdealPreviewSize / 2;
            }

            renderables = previews
                          .SelectMany(p => ((IActorPreview)p).Render(WorldRenderer, WPos.Zero))
                          .OrderBy(WorldRenderer.RenderableScreenZPositionComparisonKey)
                          .Select(r => r.PrepareRender(WorldRenderer))
                          .ToArray();
        }
예제 #19
0
        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            TreeNode t = treeView1.SelectedNode;

            if (DisplayStyle == 0)
            {
                if (t.Parent == null || t.Name == "")
                {
                    return;
                }
                preview?.Dispose();
                preview = null;
                try
                {
                    if (int.TryParse(t.Name, out int i))
                    {
                        EntryStruct en = Entries[i];
                        if (!en.isDLC)
                        {
                            using (ME3Package pcc = MEPackageHandler.OpenME3Package(ME3Directory.cookedPath + en.Filename))
                            {
                                if (en.isSkeletal)
                                {
                                    SkeletalMesh skmesh = new SkeletalMesh(pcc, en.Index); // TODO: pass device
                                    preview = new ModelPreview(view.Device, skmesh, view.TextureCache);
                                    CenterView();
                                    treeView2.Nodes.Clear();
                                    if (previewWithTreeToolStripMenuItem.Checked)
                                    {
                                        treeView2.Visible = false;
                                        Application.DoEvents();
                                        treeView2.Nodes.Add(skmesh.ToTree());
                                        treeView2.Visible = true;
                                    }
                                }
                                else
                                {
                                }
                            }
                        }
                        else
                        {
                            string loc    = Path.GetDirectoryName(Application.ExecutablePath) + "\\exec\\";
                            string dirDLC = ME3Directory.DLCPath;
                            dirDLC += en.DLCName;
                            dirDLC += "\\CookedPCConsole\\Default.sfar";
                            DLCUnpack dlc = new DLCUnpack(dirDLC);
                            foreach (DLCUnpack.DLCEntry file in dlc.filesList)
                            {
                                try
                                {
                                    string filename = Path.GetFileName(file.filenamePath);
                                    if (Path.GetExtension(filename).ToLower().EndsWith(".pcc") && filename == en.Filename)
                                    {
                                        using (Stream input = File.OpenRead(dirDLC), output = File.Create(loc + filename))
                                        {
                                            dlc.ExtractEntry(file, input, output);
                                        }
                                        if (File.Exists(loc + filename))
                                        {
                                            try
                                            {
                                                if (en.isSkeletal)
                                                {
                                                    using (ME3Package pcc = MEPackageHandler.OpenME3Package(loc + filename))
                                                    {
                                                        SkeletalMesh skmesh = new SkeletalMesh(pcc, en.Index);
                                                        CenterView();
                                                        treeView2.Nodes.Clear();
                                                        if (previewWithTreeToolStripMenuItem.Checked)
                                                        {
                                                            treeView2.Visible = false;
                                                            Application.DoEvents();
                                                            treeView2.Nodes.Add(skmesh.ToTree());
                                                            treeView2.Visible = true;
                                                        }
                                                    }
                                                }
                                            }
                                            catch (Exception)
                                            {
                                            }
                                            File.Delete(loc + filename);
                                        }
                                    }
                                }
                                catch (Exception)
                                {
                                }
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }
        }