コード例 #1
0
        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);
        }
コード例 #2
0
        /// <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;
        }
コード例 #3
0
        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]);
                }
            }
        }
コード例 #4
0
        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;
                }
            }
        }