//Returns segnum, or -1 public int InsertSegmentSelectedSide(bool regular = false) { if (selected_side > -1 && selected_segment > -1) { Side s = segment[selected_segment].side[selected_side]; if (s.segment.neighbor[selected_side] < 0) { Vector3 side_normal = -s.FindNormal(); Vector3 side_right = s.FindBestEdgeDir(); // s.FindEdgeDir(0); Vector3 side_up = Vector3.Cross(side_normal, side_right).Normalized(); Vector3 side_center = s.FindCenter(); int idx_new = InsertSegmentBasic(s, side_center, side_normal, side_right, side_up, regular, editor.CurrExtrudeLength); segment[idx_new].CopyTexturesAndDecalsFromSegmentAtBack(segment[selected_segment], selected_side); s.DisableDecals(); // Tag the two segments (for refreshing decals) UnTagAllSegments(); segment[idx_new].m_tag = true; s.segment.m_tag = true; // Select the new cube (depending on the option) if (editor.ShouldInsertAdvance) { selected_segment = idx_new; //selected_side = (int)SideOrder.FRONT; } return(idx_new); } else { // Already has a neighbor } } else { // Nothing selected } return(-1); }
public void FindBaseAttributes(Decal d) { Side s = d.side; m_base_normal = s.FindNormal(); // Center position switch (d.align) { case DecalAlign.TEXTURE: m_base_pos = s.FindUVCenterIn3D(); break; case DecalAlign.CENTER: m_base_pos = s.FindCenter(); break; case DecalAlign.EDGE_RIGHT: case DecalAlign.EDGE_DOWN: case DecalAlign.EDGE_LEFT: case DecalAlign.EDGE_UP: m_base_pos = s.FindEdgeCenter((int)d.align - (int)DecalAlign.EDGE_RIGHT); break; } m_base_rvec = Vector3.Zero; // Up vector switch (d.align) { case DecalAlign.TEXTURE: m_base_uvec = s.FindUVUpVector(); break; case DecalAlign.CENTER: m_base_uvec = s.FindBestEdgeDir(); break; case DecalAlign.EDGE_RIGHT: case DecalAlign.EDGE_DOWN: case DecalAlign.EDGE_LEFT: case DecalAlign.EDGE_UP: m_base_rvec = -s.FindEdgeDir((int)d.align - (int)DecalAlign.EDGE_RIGHT); m_base_uvec = Vector3.Cross(m_base_normal, m_base_rvec); break; } // Find the right vec for cases we haven't already if (m_base_rvec == Vector3.Zero) { m_base_rvec = Vector3.Cross(m_base_uvec, m_base_normal); } // Apply the rotation of the decal properties to the Up and Right Vector Matrix4 vec_rot = Matrix4.CreateFromAxisAngle(m_base_normal, d.RotationAngle()); m_base_uvec = Vector3.TransformNormal(m_base_uvec, vec_rot); m_base_rvec = Vector3.TransformNormal(m_base_rvec, vec_rot); // Base rotation m_base_rot = Matrix4.Transpose(Matrix4.LookAt(Vector3.Zero, m_base_normal, m_base_uvec)); }