private ClipMask GetClipMask(RasterizerVertex v) { ClipMask mask = 0; if (v.w - v.x < 0) { mask |= ClipMask.PosX; } if (v.x + v.w < 0) { mask |= ClipMask.NegX; } if (v.w - v.y < 0) { mask |= ClipMask.PosY; } if (v.y + v.w < 0) { mask |= ClipMask.NegY; } if (v.w - v.z < 0) { mask |= ClipMask.PosZ; } if (v.z + v.w < 0) { mask |= ClipMask.NegZ; } return(mask); }
/// <summary> /// Function to initialize the control with the data context. /// </summary> /// <param name="dataContext">The data context to assign.</param> private void InitializeFromDataContext(ISpritePickMaskEditor dataContext) { if (dataContext == null) { ResetDataContext(); return; } _originalMask = dataContext.ClipMaskType; RadioAlpha.Checked = dataContext.ClipMaskType == ClipMask.Alpha; RadioColorAlpha.Checked = !RadioAlpha.Checked; TableAlphaOnly.Visible = RadioAlpha.Checked; Picker.Visible = !RadioAlpha.Checked; Picker.OriginalColor = Picker.SelectedColor = dataContext.ClipMaskValue; ColorShow.UpperColor = Color.FromArgb((int)(255 * dataContext.ClipMaskValue.Alpha), Color.White); SliderAlpha.ValuePercentual = dataContext.ClipMaskValue.Alpha; }
private void ClipTriangles() { m_clipMask.Clear(); for (int i = 0; i < m_verticesOut.Count; i++) { m_clipMask.Add(0); } for (int i = 0; i < m_verticesOut.Count; i++) { m_clipMask[i] = GetClipMask(m_verticesOut[i]); } int n = m_indicesOut.Count; for (int i = 0; i < n; i += 3) { int i0 = m_indicesOut[i]; int i1 = m_indicesOut[i + 1]; int i2 = m_indicesOut[i + 2]; ClipMask clipMask = m_clipMask[i0] | m_clipMask[i1] | m_clipMask[i2]; polyClipper.Init(m_verticesOut, i0, i1, i2, m_shader.AVarCount, m_shader.PVarCount); if ((clipMask & ClipMask.PosX) == ClipMask.PosX) { polyClipper.ClipToPlane(-1, 0, 0, 1); } if ((clipMask & ClipMask.NegX) == ClipMask.NegX) { polyClipper.ClipToPlane(1, 0, 0, 1); } if ((clipMask & ClipMask.PosY) == ClipMask.PosY) { polyClipper.ClipToPlane(0, -1, 0, 1); } if ((clipMask & ClipMask.NegY) == ClipMask.NegY) { polyClipper.ClipToPlane(0, 1, 0, 1); } if ((clipMask & ClipMask.PosZ) == ClipMask.PosZ) { polyClipper.ClipToPlane(0, 0, -1, 1); } if ((clipMask & ClipMask.NegZ) == ClipMask.NegZ) { polyClipper.ClipToPlane(0, 0, 1, 1); } if (polyClipper.IsFullyClipped()) { m_indicesOut[i] = -1; m_indicesOut[i + 1] = -1; m_indicesOut[i + 2] = -1; continue; } List <int> indices = polyClipper.GetIndices(); m_indicesOut[i] = indices[0]; m_indicesOut[i + 1] = indices[1]; m_indicesOut[i + 2] = indices[2]; for (int idx = 3; idx < indices.Count; ++idx) { m_indicesOut.Add(indices[0]); m_indicesOut.Add(indices[idx - 1]); m_indicesOut.Add(indices[idx]); } } }
private void ClipLines() { m_clipMask.Clear(); for (int i = 0; i < m_verticesOut.Count; i++) { m_clipMask.Add(0); } for (int i = 0; i < m_verticesOut.Count; i++) { m_clipMask[i] = GetClipMask(m_verticesOut[i]); } for (int i = 0; i < m_indicesOut.Count; i += 2) { int index0 = m_indicesOut[i]; int index1 = m_indicesOut[i + 1]; RasterizerVertex v0 = m_verticesOut[index0]; RasterizerVertex v1 = m_verticesOut[index1]; ClipMask clipMask = m_clipMask[index0] | m_clipMask[index1]; LineClipper lineClipper = new LineClipper(v0, v1); if ((clipMask & ClipMask.PosX) == ClipMask.PosX) { lineClipper.clipToPlane(-1, 0, 0, 1); } if ((clipMask & ClipMask.NegX) == ClipMask.NegX) { lineClipper.clipToPlane(1, 0, 0, 1); } if ((clipMask & ClipMask.PosY) == ClipMask.PosY) { lineClipper.clipToPlane(0, -1, 0, 1); } if ((clipMask & ClipMask.NegY) == ClipMask.NegY) { lineClipper.clipToPlane(0, 1, 0, 1); } if ((clipMask & ClipMask.PosZ) == ClipMask.PosZ) { lineClipper.clipToPlane(0, 0, -1, 1); } if ((clipMask & ClipMask.NegZ) == ClipMask.NegZ) { lineClipper.clipToPlane(0, 0, 1, 1); } if (lineClipper.fullyClipped) { m_indicesOut[i] = -1; m_indicesOut[i + 1] = -1; continue; } if (m_clipMask[index0] > 0) { RasterizerVertex newV = Helper.InterpolateVertex(v0, v1, lineClipper.t0, m_shader.AVarCount, m_shader.PVarCount); m_verticesOut.Add(newV); m_indicesOut[i] = m_verticesOut.Count - 1; } if (m_clipMask[index1] > 0) { RasterizerVertex newV = Helper.InterpolateVertex(v0, v1, lineClipper.t1, m_shader.AVarCount, m_shader.PVarCount); m_verticesOut.Add(newV); m_indicesOut[i + 1] = m_verticesOut.Count - 1; } } }