Exemple #1
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;
              }
        }