예제 #1
0
        private void button_ShowInfo_Click(object sender, System.EventArgs e)
        {
            VisionLightInfo info = new VisionLightInfo();

            // collect all infos
            foreach (Layer layer in EditorManager.Scene.Layers)
            {
                layer.GetStaticLightInfo(info);
            }

            string s = info.ToText();

            if (s == null)
            {
                return;
            }

            ShowDescriptionDlg dlg = new ShowDescriptionDlg();

            dlg.Text            = "Scene lighting information";
            dlg.HeaderText      = "Scene elements that contribute to vLux computations";
            dlg.DescriptionText = s;
            dlg.ShowDialog(this);
        }
예제 #2
0
        public bool RunLighting(bool bShowDlg, ZoneCollection zones, bool bIncludeMainZone)
        {
            bool bExportInfoOnly = false;

            if (bShowDlg)
            {
                VLuxLightingDlg dlg = new VLuxLightingDlg();
                dlg.Settings      = (EditorManager.Scene as EditorScene).Settings; // clone settings
                dlg.LightMainPart = bIncludeMainZone;

                if (dlg.ShowDialog() != DialogResult.OK)
                {
                    return(false);
                }
                // copy back settings:
                (EditorManager.Scene as EditorScene).Settings = dlg.Settings;

                if (!dlg.DoRelighting)
                {
                    return(true);
                }

                bExportInfoOnly = dlg.ExportInfoOnly;
            }

            // for progress bar
            int iRelevantCount = bIncludeMainZone ? 1 : 0;

            foreach (Zone zone in zones)
            {
                if (zone.RunLighting)
                {
                    iRelevantCount++;
                }
            }

            // nothing to light
            if (iRelevantCount == 0)
            {
                return(true);
            }

            Cursor oldCursor = EditorManager.MainForm.Cursor;

            EditorManager.MainForm.Cursor = Cursors.WaitCursor;

            VisionLightInfo info = new VisionLightInfo();

            EditorManager.Progress.ShowProgressDialog("Calculate static lighting");
            EditorManager.Progress.Percentage = 0.0f;
            float fPercentageStep = 100.0f / (float)iRelevantCount;

            // collect all infos
            foreach (Layer layer in EditorManager.Scene.Layers)
            {
                layer.GetStaticLightInfo(info);
            }

            // save all info files, for every zone and optionally main zone
            for (int i = 0; i <= zones.Count; i++)
            {
                Zone zone = null;
                if (i == zones.Count)
                {
                    if (!bIncludeMainZone)
                    {
                        continue;
                    }
                }
                else
                {
                    zone = zones[i];
                    if (!zone.RunLighting)
                    {
                        continue;
                    }
                }

                info.FilterByZone(zone);

                // save file that contains static lights
                string basename = "StaticLightingInfo";
                if (zone != null)
                {
                    zone.StaticLightInfo = (StaticLightInfo)info.Clone();
                    basename            += "_" + zone.ZoneName;
                }

                string absfilename = Path.Combine(EditorManager.Scene.LayerDirectoryName, basename + ".XML");
                if (!info.Save(absfilename))
                {
                    EditorManager.MainForm.Cursor = oldCursor;
                    EditorManager.Progress.HideProgressDialog();
                    return(false);
                }

                // also, collect static mesh information
                string meshRelFilename = Path.Combine(EditorManager.Scene.RelativeLayerDirectoryName, basename + ".temp");
                string meshAbsFilename = Path.Combine(EditorManager.Scene.LayerDirectoryName, basename + ".temp");
                EditorManager.EngineManager.CreateStaticLightingMeshes(meshAbsFilename, info);
                EditorManager.Progress.Percentage += fPercentageStep;
            }


            if (bExportInfoOnly)
            {
                EditorManager.MainForm.Cursor = oldCursor;
                EditorManager.Progress.HideProgressDialog();
                return(true);
            }

            // trigger the event (maybe another before info.Save?)
            EditorManager.TriggerSceneEvent(SceneEventArgs.Action.BeforeStaticLighting, true);

            // put together vLux parameter string
            string projectDir = EditorManager.Project.ProjectDir;

            if (projectDir.EndsWith(@"\"))
            {
                projectDir = projectDir.Remove(projectDir.Length - 1, 1);
            }

            // restart progress bar
            EditorManager.Progress.Percentage = 0.0f;

            // launch vLux n times
            bool bSuccess = true;

            for (int i = 0; i <= zones.Count; i++)
            {
                bool bVLuxSuccess = true;
                Zone zone         = null;
                if (i == zones.Count)
                {
                    if (!bIncludeMainZone)
                    {
                        continue;
                    }
                }
                else
                {
                    zone = zones[i];
                    if (!zone.Loaded || !zone.RunLighting)
                    {
                        continue;
                    }
                }

                // save file that contains static lights
                string basename = "StaticLightingInfo";
                if (zone != null)
                {
                    basename += "_" + zone.ZoneName;
                }

                string meshLitFilename = Path.Combine(EditorManager.Scene.LayerDirectoryName, basename + ".lit");



                // determine out filename (including relative path) and remove file extension
                string outFilename    = EditorManager.Scene.FileName;
                string outFilenameExt = Path.GetExtension(outFilename);
                if (outFilenameExt != null)
                {
                    outFilename = outFilename.Remove(outFilename.Length - outFilenameExt.Length, outFilenameExt.Length);
                }
                if (zone != null)
                {
                    outFilename += "_" + zone.ZoneName;
                }


                //set edit mode for relevant lighting files
                EditorManager.EngineManager.EditOrAddRCSLightingFiles(Path.Combine(projectDir, outFilename), zone, meshLitFilename, false);

                string paramStr = "\"\"";                                                      // no v3d (first parameter just empty quotes)

                paramStr += " -project \"" + projectDir + "\"";                                // the project folder
                paramStr += " -tempfolder \"" + EditorManager.Scene.LayerDirectoryName + "\""; // the relative folder name where the temp files are located
                paramStr += " -out \"" + outFilename + "\"";                                   // output filename
                if (zone != null)
                {
                    paramStr += " -zone \"" + zone.ZoneName + "\"";
                }
                //paramStr += " -title \"" + EditorApp.Scene.FileName + "\""; // no window title required in this mode
                paramStr += " -quiet -minimized";

                string lightingCfgFile = VLuxLightingTool.GetLightingCfgFile((EditorManager.Scene as EditorScene).Settings);

                ManagedBase.RCS.GetProvider().EditFile(lightingCfgFile);
                paramStr += " -config \"" + lightingCfgFile + "\"";

                try
                {
                    // create a batch file for stand-alone lighting
                    string     batchName = Path.Combine(EditorManager.Scene.LayerDirectoryName, "Relight_" + basename + ".bat");
                    TextWriter txt       = new StreamWriter(batchName);
                    txt.WriteLine("vLux.exe " + paramStr);
                    txt.Close();
                }
                catch (Exception ex)
                {
                    EditorManager.DumpException(ex);
                }


                try
                {
                    Process vLux = FileHelper.RunExternalTool("vLux", VLuxLightingDlg.vLuxEXEPath, paramStr, true);

                    if (vLux == null)
                    {
                        EditorManager.MainForm.Cursor = oldCursor;
                        EditorManager.Progress.HideProgressDialog();
                        return(false);
                    }

                    Console.WriteLine(vLux.StandardOutput.ReadToEnd());

                    vLux.WaitForExit();
                    int iExitCode = vLux.ExitCode; // can we do something with this?
                }
                catch (Exception ex)
                {
                    EditorManager.ShowMessageBox("vLux did not complete lighting. Please try again.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    EditorManager.DumpException(ex);
                    bVLuxSuccess = false;
                }

                // wait until vLux is finished...

                EditorManager.Progress.Percentage += fPercentageStep;

                // reload the engine files
                if (bSuccess)
                {
                    bVLuxSuccess &= EditorManager.EngineManager.ReloadLightingFiles(outFilename, zone);
                    bVLuxSuccess &= EditorManager.EngineManager.ReloadStaticLightingMeshes(zone, meshLitFilename);

                    EditorManager.Scene.UpdateView(true);
                    EditorManager.Scene.UpdateView(true);

                    //add relevant lighting files to RCS
                    ManagedBase.RCS.GetProvider().AddFile(lightingCfgFile, false);
                    EditorManager.EngineManager.EditOrAddRCSLightingFiles(Path.Combine(projectDir, outFilename), zone, meshLitFilename, true);
                }


                System.Diagnostics.Debug.Assert(bVLuxSuccess, "lighting was not successful");
                bSuccess &= bVLuxSuccess;

                // trigger the event (maybe another before info.Save?)
                EditorManager.OnSceneEvent(new SceneEventArgs(SceneEventArgs.Action.AfterStaticLighting, bSuccess));
            }

            // Update all shader assignments
            IScene.SendShaderResourceChangedEvent(new EventArgs());

            // repaint
            EditorManager.Scene.UpdateView(false);

            EditorManager.MainForm.Cursor = oldCursor;
            EditorManager.Progress.HideProgressDialog();
            return(bSuccess);
        }