Пример #1
0
 public void addModel(String file)
 {
     Model3D m = new Model3D();
     m.model = Content.Load<Model>(file);
     m.visible = true;
     m.name = file;
     models.Add(m);
 }
Пример #2
0
        protected override void Update(GameTime gameTime)
        {
            float timeStep = (float)gameTime.ElapsedGameTime.TotalSeconds * 60.0f;
            float deltaAngleY = 0.0f;

            KeyboardState keyState = Keyboard.GetState();
            MouseState mouseState = Mouse.GetState();

            if (mode != Mode.None)
            {
                if (selectedModel == null) { mode = Mode.None; return; }
                if (mouseState.LeftButton == ButtonState.Pressed)
                {
                    mode = Mode.None;
                    return;
                }
                if (mouseState.RightButton == ButtonState.Pressed)
                {
                    selectedModel.translate = oldTrans;
                    selectedModel.scale = oldScale;
                    selectedModel.rotate = oldRotate;
                    mode = Mode.None;
                    return;
                }
                if (mode == Mode.Translate || mode == Mode.Rotate || mode == Mode.Scale)
                {
                    if (keyState.IsKeyDown(Keys.X))
                        mode -= 9;
                    else if (keyState.IsKeyDown(Keys.Y))
                        mode -= 8;
                    else if (keyState.IsKeyDown(Keys.Z))
                        mode -= 7;
                    return;
                }
                if (mode == Mode.TranslateX || mode == Mode.TranslateY || mode == Mode.TranslateZ)
                {
                    Vector3 translate = new Vector3(0);

                    if (mode == Mode.TranslateX)
                        translate.X = (mouseState.X - mouseX) / 20.0f;
                    else if (mode == Mode.TranslateY)
                        translate.Y = (mouseState.X - mouseX) / 20.0f;
                    else if (mode == Mode.TranslateZ)
                        translate.Z = (mouseState.X - mouseX) / 20.0f;
                    selectedModel.translate = oldTrans + translate;
                }
                else if (mode == Mode.ScaleX)
                {
                    double startDistance = Math.Sqrt(Math.Pow(mouseX - 300, 2) + Math.Pow((mouseY - 300), 2));
                    double distance = Math.Sqrt(Math.Pow(mouseState.X - 300, 2) + Math.Pow((mouseState.Y - 300), 2));

                    selectedModel.Scale((new Vector3((float)(distance / startDistance)) * oldScale));
                }
                else if (mode == Mode.RotateX)
                {
                    double distance = Math.Sqrt(Math.Pow(mouseState.X - mouseX, 2) + Math.Pow((mouseState.Y - mouseY), 2));
                    selectedModel.RotateX((int)(oldRotate.X - distance));
                }
                else if (mode == Mode.RotateY)
                {
                    double distance = Math.Sqrt(Math.Pow(mouseState.X - mouseX, 2) + Math.Pow((mouseState.Y - mouseY), 2));
                    selectedModel.RotateY((int)(oldRotate.Y - distance));
                }
                else if (mode == Mode.RotateZ)
                {
                    double distance = Math.Sqrt(Math.Pow(mouseState.X - mouseX, 2) + Math.Pow((mouseState.Y - mouseY), 2));
                    selectedModel.RotateZ((int)(oldRotate.Z - distance));
                }
                return;
            }
            float scale = 1.0f;
            float dx = 0;
            float dy = 0;

            if (keyState.IsKeyDown(Keys.Right))         // Rotate camera left/right
                deltaAngleY = 0.05f * timeStep;
            if (keyState.IsKeyDown(Keys.Left))
                deltaAngleY = -0.05f * timeStep;

            if (keyState.IsKeyDown(Keys.Up))            // Scale camera
                scale -= 0.025f * timeStep;
            if (keyState.IsKeyDown(Keys.Down))
                scale += 0.025f * timeStep;
            /*
            if (keyState.IsKeyDown(Keys.W))             // Pan camera
                dy += 0.05f * timeStep;
            if (keyState.IsKeyDown(Keys.S))
                dy -= 0.05f * timeStep;
            if (keyState.IsKeyDown(Keys.A))
                dx -= 0.05f * timeStep;
            if (keyState.IsKeyDown(Keys.D))
                dx += 0.05f * timeStep;
            */
            if (keyState.IsKeyDown(Keys.G))
            {
                if (selectedModel == null) return;
                mode = Mode.Translate;
                mouseX = mouseState.X;
                oldTrans = selectedModel.translate;
                oldScale = selectedModel.scale;
                oldRotate = selectedModel.rotate;
            }
            if (keyState.IsKeyDown(Keys.S))
            {
                if (selectedModel == null) return;
                mode = Mode.ScaleX;
                mouseX = mouseState.X;
                mouseY = mouseState.Y;
                oldTrans = selectedModel.translate;
                oldScale = selectedModel.scale;
                oldRotate = selectedModel.rotate;
            }
            if (keyState.IsKeyDown(Keys.R))
            {
                if (selectedModel == null) return;
                mode = Mode.Rotate;
                mouseX = mouseState.X;
                mouseY = mouseState.Y;
                oldTrans = selectedModel.translate;
                oldScale = selectedModel.scale;
                oldRotate = selectedModel.rotate;
            }
            if (keyState.IsKeyDown(Keys.LeftAlt) && keyState.IsKeyDown(Keys.H))
            {
                foreach (Model3D m in models)
                    m.visible = true;
            }
            else if (keyState.IsKeyDown(Keys.H))
            {
                if (selectedModel == null) return;
                selectedModel.visible = false;
            }
            if (keyState.IsKeyDown(Keys.LeftShift) && keyState.IsKeyDown(Keys.X))
            {
                if (selectedModel == null) return;
                int i = models.IndexOf(selectedModel);
                models.RemoveAt(i);
                parentForm.models.RemoveAt(i);
                parentForm.modelList.Items.RemoveAt(i);
                selectedModel = null;
            }
            if (keyState.IsKeyDown(Keys.LeftShift) && keyState.IsKeyDown(Keys.A))
            {
                parentForm.LoadModel();
            }
            if (keyState.IsKeyDown(Keys.LeftControl) && keyState.IsKeyDown(Keys.E))
            {
                parentForm.Export();
            }
            if (keyState.IsKeyDown(Keys.LeftControl) && keyState.IsKeyDown(Keys.I))
            {
                parentForm.Import();
            }
            if (mouseState.RightButton == ButtonState.Pressed)
            {
                device.SetRenderTarget(renderTarget);
                device.Clear(Color.Black);
                int i = 1;
                int x = mouseState.X;
                int y = mouseState.Y;
                Effect e = Content.Load<Effect>("Target");
                foreach (Model3D m in models)
                {
                    m.model.Meshes[0].MeshParts[0].Effect = e;
                    ModelMesh mesh = m.model.Meshes[0];

                    Matrix[] transforms = new Matrix[m.model.Bones.Count];
                    m.model.CopyAbsoluteBoneTransformsTo(transforms);

                    e.CurrentTechnique = e.Techniques["Target"];

                    e.Parameters["World"].SetValue(m.GetWorld(mesh));
                    e.Parameters["View"].SetValue(camera.ViewMatrix);
                    e.Parameters["Projection"].SetValue(camera.ProjectionMatrix);
                    e.Parameters["Color"].SetValue(50.0f * i);

                    i++;
                    mesh.Draw();
                    m.model.Meshes[0].MeshParts[0].Effect = effect;
                }
                device.SetRenderTarget(null);
                targetMap = renderTarget;
                Color[] mapColors = new Color[targetMap.Width * targetMap.Height];
                targetMap.GetData<Color>(mapColors);
                if (mapColors[y * 600 + x].R > 0)
                    selectedModel = models[mapColors[y * 600 + x].B / 50 - 1];
            }

            camera.Eye += new Vector3(dx, dy, 0);
            camera.Focus += new Vector3(dx, dy, 0);
            camera.Eye = Vector3.Transform(camera.Eye, Matrix.CreateRotationY(deltaAngleY));
            camera.Eye = Vector3.Transform(camera.Eye, Matrix.CreateScale(scale));

            base.Update(gameTime);
        }