示例#1
0
        void CreateView(RenderingSurface xiSurface, Scene xiScene, Camera xiCamera, RenderMode xiFixedRenderMode)
        {
            xiSurface.MouseDown  += new MouseEventHandler(Viewer3DRenderingSurface_MouseDown);
            xiSurface.MouseUp    += new MouseEventHandler(Viewer3DRenderingSurface_MouseUp);
            xiSurface.MouseMove  += new MouseEventHandler(Viewer3DRenderingSurface_MouseMove);
            xiSurface.MouseWheel += new MouseEventHandler(Viewer3DRenderingSurface_MouseWheel);
            xiSurface.GotFocus   += new EventHandler(Viewer3DRenderingSurface_GotFocus);

            ImmediateModeRenderer lRenderer = new ImmediateModeRenderer();

            lRenderer.FixedRenderMode = xiFixedRenderMode;
            lRenderer.Attach(xiSurface);

            MMEdEditorView lView = new MMEdEditorView(this, xiScene, xiCamera, lRenderer);

            mViews.Add(xiSurface, lView);
        }
示例#2
0
        private ThreeDeeViewer(MainForm xiMainForm)
            : base(xiMainForm)
        {
            mMainForm.KeyPreview   = true;
            mMainForm.KeyPress    += new KeyPressEventHandler(this.KeyPressHandle);
            mMainForm.FormClosing += new FormClosingEventHandler(mMainForm_FormClosing);
            mMainForm.Viewer3DRenderingSurface.MouseDown += new MouseEventHandler(Viewer3DRenderingSurface_MouseDown);
            mMainForm.Viewer3DRenderingSurface.MouseUp   += new MouseEventHandler(Viewer3DRenderingSurface_MouseUp);
            mMainForm.Viewer3DRenderingSurface.MouseMove += new MouseEventHandler(Viewer3DRenderingSurface_MouseMove);
            mMainForm.ChunkTreeView.NodeMouseClick       += new TreeNodeMouseClickEventHandler(ChunkTreeView_NodeMouseClick);

            mRenderer = new ImmediateModeRenderer();
            mRenderer.Attach(mMainForm.Viewer3DRenderingSurface);

            mScene = new Scene();
            // Far distance: 1e3 is half-way along a table, 1e5 seems to include everything on the levels I looked at
            // Near distance: 100 doesn't seem to lose any details until you are right up close to an object, and
            // increases to near distance make a huge improvement in z-clipping.
            // See e.g. https://stackoverflow.com/questions/32938159/how-to-avoid-z-fighting-in-distance
            mCamera = new Camera(80, 100, 1e5);
            mView   = new MMEdViewerView(this, mScene, mCamera, mRenderer);
            mLight  = new Light();
            mLight.DiffuseIntensity  = 0.1;
            mLight.SpecularIntensity = 0.02;

            //add view mode menus:
            mOptionsMenu = new ToolStripMenuItem("3D");
            //
            PropertyController lMoveCtrl = new PropertyController(this, "MovementMode");

            mOptionsMenu.DropDownItems.AddRange(lMoveCtrl.CreateMenuItems());
            mOptionsMenu.DropDownItems.Add(new ToolStripSeparator());
            //
            PropertyController lLightCtrl = new PropertyController(this, "LightingMode");

            mOptionsMenu.DropDownItems.AddRange(lLightCtrl.CreateMenuItems());
            mOptionsMenu.DropDownItems.Add(new ToolStripSeparator());
            //
            PropertyController lNormCtrl = new PropertyController(this, "DrawNormalsMode");

            mOptionsMenu.DropDownItems.AddRange(lNormCtrl.CreateMenuItems());
            mOptionsMenu.DropDownItems.Add(new ToolStripSeparator());
            //
            PropertyController lTexModeCtrl = new PropertyController(this, "TextureMode");

            mOptionsMenu.DropDownItems.AddRange(lTexModeCtrl.CreateMenuItems());
            mOptionsMenu.DropDownItems.Add(new ToolStripSeparator());
            //
            PropertyController lSelMetaCtrl = new PropertyController(this, "SelectedMetadata");

            mOptionsMenu.DropDownItems.Add(lSelMetaCtrl.CreateToolStripComboBox());
            mOptionsMenu.DropDownItems.Add(new ToolStripSeparator());
            //
            mOptionsMenu.DropDownItems.Add(new ToolStripMenuItem("Hide all invisible Flats", null, new EventHandler(this.HideAllFlatsWithoutFlgDClicked)));
            //
            if (DEBUG_ALLOW_LOAD_SAVE_SCENE)
            {
                mOptionsMenu.DropDownItems.Add(new ToolStripSeparator());
                mOptionsMenu.DropDownItems.Add(new ToolStripMenuItem(
                                                   "Save scene to XML...",
                                                   null,
                                                   SaveSceneToXML));
                mOptionsMenu.DropDownItems.Add(new ToolStripMenuItem(
                                                   "Load scene from XML...",
                                                   null,
                                                   LoadSceneFromXML));
            }
            mOptionsMenu.DropDownItems.Add(new ToolStripMenuItem(
                                               "Export scene to VRML...",
                                               null,
                                               ExportSceneToVRML));
            //
            mMainForm.mMenuStrip.Items.Add(mOptionsMenu);
        }
示例#3
0
        private void InitialiseThreeDeeView()
        {
            if (mSubject == null)
            {
                return;
            }

            int SCALE    = 256;
            int GRIDSIZE = 9; // Should be an odd number so the centre is the middle of a tile.

            mRenderer = new ImmediateModeRenderer();
            mRenderer.Attach(mMainForm.CameraRenderingSurface);

            mScene  = new Scene();
            mCamera = new Camera(80, 0.1, 1e10);
            mView   = new GLTK.View(mScene, mCamera, mRenderer);

            mScene.Clear();
            if (mMainForm.CurrentLevel != null)
            {
                // Create a surface and fill it with a 10 x 10 grid of squares
                MMEdEntity lSurface = new MMEdEntity(mSubject);

                for (int x = 0; x < GRIDSIZE; x++)
                {
                    for (int y = 0; y < GRIDSIZE; y++)
                    {
                        Mesh lSquare = new OwnedMesh(mSubject, PolygonMode.Quads);
                        lSquare.AddFace(
                            new Vertex(new GLTK.Point(x, y, 0), 0, 0),
                            new Vertex(new GLTK.Point(x + 1, y, 0), 1, 0),
                            new Vertex(new GLTK.Point(x + 1, y + 1, 0), 1, 1),
                            new Vertex(new GLTK.Point(x, y + 1, 0), 0, 1));
                        lSquare.RenderMode = RenderMode.Wireframe;
                        lSurface.Meshes.Add(lSquare);
                    }
                }

                // Add it to the scene at the origin
                lSurface.Scale(SCALE, SCALE, 1.0);
                short      lOffset = (short)(-SCALE * GRIDSIZE / 2);
                GLTK.Point lNewPos = ThreeDeeViewer.Short3CoordToPoint(new Short3Coord(lOffset, lOffset, 0));
                lSurface.Position = new GLTK.Point(lNewPos.x, lNewPos.y, -lNewPos.z);
                mScene.AddRange(new MMEdEntity[] { lSurface });

                // Use a random object from the level for now.
                Level    lLevel  = mMainForm.CurrentLevel;
                TMDChunk lObject = lLevel.GetObjtById(1);
                mScene.AddRange(lObject.GetEntities(
                                    mMainForm.CurrentLevel,
                                    MMEd.Viewers.ThreeDee.eTextureMode.NormalTextures,
                                    eTexMetaDataEntries.Steering));

                string lExceptionWhen = "opening file";
                try
                {
                    ThreeDeeViewer.SceneHolder sh;
                    string lFilename = string.Format("{0}{1}..{1}camera-editor-scene.xml",
                                                     Path.GetDirectoryName(
                                                         new Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath),
                                                     Path.DirectorySeparatorChar);

                    using (FileStream fs = File.OpenRead(lFilename))
                    {
                        lExceptionWhen = "deserialising the scene";
                        XmlSerializer xs = new XmlSerializer(typeof(ThreeDeeViewer.SceneHolder));
                        sh = (ThreeDeeViewer.SceneHolder)xs.Deserialize(fs);
                    }
                    lExceptionWhen = "fixing texture ids";
                    Dictionary <int, int> lSavedTexIdsToLiveTexIds = new Dictionary <int, int>();
                    foreach (ThreeDeeViewer.TextureHolder th in sh.Textures)
                    {
                        if (th.Bitmap != null)
                        {
                            lSavedTexIdsToLiveTexIds[th.ID] = AbstractRenderer.ImageToTextureId(th.Bitmap);
                        }
                        else
                        {
                            lSavedTexIdsToLiveTexIds[th.ID] = 0;
                        }
                    }
                    foreach (Entity ent in sh.Entities)
                    {
                        foreach (Mesh m in ent.Meshes)
                        {
                            if (m.RenderMode == RenderMode.Textured)
                            {
                                m.Texture = lSavedTexIdsToLiveTexIds[m.Texture];
                            }
                        }
                    }
                    mScene.Objects.Clear();
                    mScene.AddRange(sh.Entities);
                }
                catch (Exception err)
                {
                    System.Diagnostics.Trace.WriteLine(err);
                    MessageBox.Show(string.Format("Exception occurred while {0}: {1}", lExceptionWhen, err.Message), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                UpdateCameraThreeDee();
            }
            else
            {
                System.Windows.Forms.MessageBox.Show("3D view is only available when editing a level");
                mMainForm.CameraRenderingSurface.Visible = false;
            }
        }