public void addModel(String file) { Model3D m = new Model3D(); m.model = Content.Load<Model>(file); m.visible = true; m.name = file; models.Add(m); }
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); }