/// <summary> /// Crear el mesh y cargarlo en la tabla /// </summary> private void meshCreate_Click(object sender, EventArgs e) { if (meshFilePath == null || meshFilePath.Equals("")) { return; } try { //Parsear XML de mesh var mediaPath = meshFilePath.Substring(0, meshFilePath.LastIndexOf('\\') + 1); var xmlString = File.ReadAllText(meshFilePath); var sceneData = parser.parseSceneFromString(xmlString); //Crear el mesh tantas veces como se haya pedido var cantidad = (int)amountToCreate.Value; var initialPos = getInitialPos(); for (var i = 0; i < cantidad; i++) { var scene = sceneLoader.loadScene(sceneData, mediaPath); var radius = scene.Meshes[0].BoundingBox.calculateBoxRadius(); var posOffsetX = radius * 2; //cargar meshes en dataGrid foreach (var mesh in scene.Meshes) { var mo = new SceneEditorMeshObject(); mo.mesh = mesh; mo.mesh.AutoTransformEnable = true; mo.name = mesh.Name + meshCounter++; mo.userInfo = ""; mo.index = MeshObjects.Count; mo.fileName = fileName.Text; mo.groupIndex = meshGroupCounter; mo.folderName = meshFolderName; //Mover mesh a la posicion correcta mesh.Position = new TGCVector3(initialPos.X + i * posOffsetX, initialPos.Y, initialPos.Z); MeshObjects.Add(mo); dataGridMeshList.Rows.Add(dataGridMeshList.Rows.Count + 1, meshGroupCounter, mo.name); } meshGroupCounter++; } //seleccionar el primer mesh en la grilla seleccionarPrimerElementoDataGrid(); //pasar a modo camara con edicion de mesh radioButtonCameraMode.Checked = true; tabControl.SelectedTab = tabControl.TabPages["tabPageModify"]; } catch (Exception ex) { MessageBox.Show("Hubo un error al cargar el archivo " + fileName.Text, "Error al cargar Mesh", MessageBoxButtons.OK, MessageBoxIcon.Error); Debug.Write("Error al cargar Mesh de TGC " + ex.Message); } }
/// <summary> /// Informa si un objeto esta actualmente seleccionado /// </summary> private bool isMeshObjectSelected(SceneEditorMeshObject meshObj) { foreach (var selectMeshObj in SelectedMeshList) { if (selectMeshObj == meshObj) { return(true); } } return(false); }
/// <summary> /// Hacer picking y seleccionar modelo si hay colision /// </summary> private void findSelectedMeshWithPicking() { pickingRay.updateRay(); TGCVector3 collisionP; //Hacer picking sobre todos los modelos y quedarse con el mas cerca var minDistance = float.MaxValue; SceneEditorMeshObject collisionMeshObj = null; foreach (var meshObj in MeshObjects) { if (!meshObj.visible) { continue; } //Si ya está seleccionado ignorar if (isMeshObjectSelected(meshObj)) { continue; } var aabb = meshObj.mesh.BoundingBox; var result = TgcCollisionUtils.intersectRayAABB(pickingRay.Ray, aabb, out collisionP); if (result) { var lengthSq = TGCVector3.Subtract(collisionP, pickingRay.Ray.Origin).LengthSq(); if (lengthSq < minDistance) { minDistance = lengthSq; collisionMeshObj = meshObj; } } } //Seleccionar objeto if (collisionMeshObj != null) { //Deseleccionar todo for (var i = 0; i < dataGridMeshList.Rows.Count; i++) { dataGridMeshList.Rows[i].Selected = false; } //Seleccionar objeto del dataGrid dataGridMeshList.Rows[collisionMeshObj.index].Selected = true; dataGridMeshList_RowEnter(null, null); } }
/// <summary> /// Actualizar valores de edicion de mesh de la interfaz /// </summary> private void updateEditMeshValues(SceneEditorMeshObject meshObj) { meshName.Text = meshObj.name; var pos = meshObj.mesh.Position; meshPosX.Text = pos.X.ToString(); meshPosY.Text = pos.Y.ToString(); meshPosZ.Text = pos.Z.ToString(); var rot = meshObj.mesh.Rotation; meshRotX.Text = rot.X.ToString(); meshRotY.Text = rot.Y.ToString(); meshRotZ.Text = rot.Z.ToString(); var scale = meshObj.mesh.Scale; meshScaleX.Text = scale.X.ToString(); meshScaleY.Text = scale.Y.ToString(); meshScaleZ.Text = scale.Z.ToString(); userInfo.Text = meshObj.userInfo; }
/// <summary> /// Seleccionar objeto /// </summary> private void selectMeshObject(SceneEditorMeshObject selectedMeshObj) { //Cargar valores del panel de edicion updateEditMeshValues(selectedMeshObj); enableEditMeshPanels(true); }