Example #1
0
        public void DrawMeshEdgeOnly(apMesh mesh, apMatrix3x3 matrix)
        {
            try
            {
                //0. 메시, 텍스쳐가 없을 때
                //if (mesh == null || mesh._textureData == null || mesh._textureData._image == null)//이전 코드
                if (mesh == null || mesh.LinkedTextureData == null || mesh.LinkedTextureData._image == null)                //변경 코드
                {
                    return;
                }

                //1. 모든 메시를 보여줄때 (또는 클리핑된 메시가 없을 때) =>
                Color meshEdgeColor       = new Color(1.0f, 0.5f, 0.0f, 0.9f);
                Color meshHiddenEdgeColor = new Color(1.0f, 1.0f, 0.0f, 0.7f);

                matrix *= mesh.Matrix_VertToLocal;


                Vector2 pos0 = Vector2.zero, pos1 = Vector2.zero;
                if (mesh._edges.Count > 0)
                {
                    _matBatch.SetPass_Color();
                    _matBatch.SetClippingSize(_glScreenClippingSize);
                    GL.Begin(GL.LINES);
                    for (int i = 0; i < mesh._edges.Count; i++)
                    {
                        pos0 = matrix.MultiplyPoint(mesh._edges[i]._vert1._pos);
                        pos1 = matrix.MultiplyPoint(mesh._edges[i]._vert2._pos);

                        DrawLine(pos0, pos1, meshEdgeColor, false);
                    }

                    for (int iPoly = 0; iPoly < mesh._polygons.Count; iPoly++)
                    {
                        for (int iHE = 0; iHE < mesh._polygons[iPoly]._hidddenEdges.Count; iHE++)
                        {
                            apMeshEdge hiddenEdge = mesh._polygons[iPoly]._hidddenEdges[iHE];

                            pos0 = matrix.MultiplyPoint(hiddenEdge._vert1._pos);
                            pos1 = matrix.MultiplyPoint(hiddenEdge._vert2._pos);

                            DrawLine(pos0, pos1, meshHiddenEdgeColor, false);
                        }
                    }

                    GL.End();
                }
            }
            catch (Exception ex)
            {
                Debug.LogException(ex);
            }
        }
        // Calculate
        //---------------------------------------------------------
        public void Calculate()
        {
            //역순으로 World Matrix를 계산하자
            _matrix_ToWorld = _matrix_Cal_VertWorld
                              //* _matrix_TF_Cal_Parent
                              //* _matrix_Cal_Mesh
                              //* _matrix_TF_Mesh
                              * _matrix_MeshTransform
                              * _matrix_Cal_VertLocal
                              * _matrix_Static_Vert2Mesh;

            //_matrix_ToVert = _matrix_ToWorld.inverse;

            //이전 식
            //_vertPos3_World = _matrix_ToWorld.MultiplyPoint3x4(_pos3_Local);

            //리깅 포함한 식으로 변경
            //_weight_Rigging = Mathf.Clamp(_weight_Rigging, 0.0f, 0.5f);

            _vertPos_World = _matrix_ToWorld.MultiplyPoint(_pos_Local * (1.0f - _weight_Rigging) + _pos_Rigging * _weight_Rigging);

            //_vertPos_World.x = _vertPos3_World.x;
            //_vertPos_World.y = _vertPos3_World.y;

            Vector2 posLocalUpdated = (_matrix_Static_Vert2Mesh_Inverse).MultiplyPoint(_vertPos_World);

            _vertPos3_LocalUpdated.x = posLocalUpdated.x;
            _vertPos3_LocalUpdated.y = posLocalUpdated.y;
            _vertPos3_LocalUpdated.z = 0;

            _isCalculated = true;
        }
Example #3
0
        // Scale
        public void Scale__MeshTRS(Vector2 deltaScaleW, bool isFirstScale)
        {
            if (Editor.Select.SelectionType != apSelection.SELECTION_TYPE.Mesh ||
                Editor.Select.Mesh == null ||
                Editor.Select.Mesh.LinkedTextureData == null ||
                Editor.Select.Mesh.LinkedTextureData._image == null ||
                Editor._meshEditMode != apEditor.MESH_EDIT_MODE.MakeMesh ||
                Editor._meshEditeMode_MakeMesh != apEditor.MESH_EDIT_MODE_MAKEMESH.TRS)
            {
                return;
            }

            apMesh mesh = Editor.Select.Mesh;
            //Vector2 imageHalfOffset = new Vector2(mesh.LinkedTextureData._width * 0.5f, mesh.LinkedTextureData._height * 0.5f);
            List <apVertex> vertices         = mesh._vertexData;
            List <apVertex> selectedVertices = Editor.VertController.Vertices;

            if (vertices.Count == 0 || selectedVertices.Count == 0)
            {
                return;
            }

            if (isFirstScale)
            {
                apEditorUtil.SetRecord_Mesh(apUndoGroupData.ACTION.MeshEdit_EditVertex, Editor, mesh, mesh, true);
            }

            apVertex curVert   = null;
            Vector2  centerPos = Vector2.zero;

            for (int i = 0; i < selectedVertices.Count; i++)
            {
                curVert    = selectedVertices[i];
                centerPos += curVert._pos - mesh._offsetPos;
            }
            centerPos /= selectedVertices.Count;

            Vector2 scale = new Vector2(1.0f + deltaScaleW.x, 1.0f + deltaScaleW.y);

            apMatrix3x3 matrix_Rotate = apMatrix3x3.TRS(centerPos, 0, Vector2.one)
                                        * apMatrix3x3.TRS(Vector2.zero, 0.0f, scale)
                                        * apMatrix3x3.TRS(-centerPos, 0, Vector2.one);

            Vector2 posW = Vector2.zero;

            for (int i = 0; i < selectedVertices.Count; i++)
            {
                curVert      = selectedVertices[i];
                posW         = curVert._pos - (mesh._offsetPos);
                posW         = matrix_Rotate.MultiplyPoint(posW);
                curVert._pos = posW + (mesh._offsetPos);
            }

            for (int i = 0; i < selectedVertices.Count; i++)
            {
                mesh.RefreshVertexAutoUV(selectedVertices[i]);
            }

            Editor.SetRepaint();
        }
        /// <summary>
        /// Modifier가 적용되지 않은 World Position을 직접 계산한다.
        /// _pos_World_NoMod로 저장된다.
        /// </summary>
        /// <param name="matrix_Vert2Local"></param>
        /// <param name="matrix_meshTransformNoMod"></param>
        public void CalculateNotModified(apMatrix3x3 matrix_Vert2Local, apMatrix3x3 matrix_meshTransformNoMod)
        {
            apMatrix3x3 matrix_ToWorld = matrix_meshTransformNoMod * matrix_Vert2Local;
            Vector2     posW           = matrix_ToWorld.MultiplyPoint(_vertex._pos);

            _pos_World_NoMod = posW;
            //_pos_World_NoMod.x = posW.x;
            //_pos_World_NoMod.y = posW.y;
        }
        public void Calculate(float tDelta)        //<<tDelta가 추가되었다.
        {
            #region [미사용 코드] 해시코드 체크 부분을 없앴다. 퍼포먼스 잘나온다 =3=b
            //if (_isMatrixChanged)
            //{
            //	//테스트
            //	//상대값이 아니라 절대값을 World로 사용하자
            //	//_matrix_ToWorld = _matrix_MeshTransform * _matrix_Cal_VertLocal * _matrix_Static_Vert2Mesh;
            //	//_pos_World3 = _matrix_ToWorld.MultiplyPoint3x4(Vector3.zero);
            //	//_pos_World3 = _matrix_ToWorld.MultiplyPoint3x4(_vertex._pos);

            //	//역순으로 World Matrix를 계산하자
            //	_matrix_ToWorld = _matrix_Cal_VertWorld
            //					//* _matrix_TF_Cal_Parent
            //					//* _matrix_Cal_Mesh
            //					//* _matrix_TF_Mesh
            //					* _matrix_MeshTransform
            //					* _matrix_Cal_VertLocal
            //					* _matrix_Static_Vert2Mesh;

            //	//_matrix_ToVert = _matrix_ToWorld.inverse;


            //}
            #endregion


            //역순으로 World Matrix를 계산하자
            //1. 기존 식
            //(Vert -> Rigging : ITP) -> (V2Mesh -> Local Morph -> Mesh TF -> World Morph : WorldMTX) 방식
            //_matrix_ToWorld = _matrix_Cal_VertWorld
            //				* _matrix_MeshTransform
            //				* _matrix_Cal_VertLocal
            //				* _matrix_Static_Vert2Mesh;

            //_pos_World = _matrix_ToWorld.MultiplyPoint(_vertex._pos * (1.0f - _weight_Rigging) + _pos_Rigging * _weight_Rigging);

            //2. 변경된 식
            //Vert -> (V2Mesh -> Local Morph -> RiggingMTX -> MeshTF -> World Morph : WorldMTX) 방식
            _matrix_ToWorld = _matrix_Cal_VertWorld
                              * _matrix_MeshTransform
                              * _matrix_Rigging                          //<<이게 추가
                              * _matrix_Cal_VertLocal
                              * _matrix_Static_Vert2Mesh;

            _pos_World = _matrix_ToWorld.MultiplyPoint(_vertex._pos);


            //World -> Local
            _pos_LocalOnMesh = (_matrix_MeshTransform.inverse).MultiplyPoint(_pos_World);


            _isCalculated = true;
        }
Example #6
0
        public void Scale__MeshAutoGen(Vector2 deltaScaleW, bool isFirstScale)
        {
            if (Editor.Select.SelectionType != apSelection.SELECTION_TYPE.Mesh ||
                Editor.Select.Mesh == null ||
                Editor.Select.Mesh.LinkedTextureData == null ||
                Editor.Select.Mesh.LinkedTextureData._image == null ||
                Editor._meshEditMode != apEditor.MESH_EDIT_MODE.MakeMesh ||
                Editor._meshEditeMode_MakeMesh != apEditor.MESH_EDIT_MODE_MAKEMESH.AutoGenerate ||
                !Editor.MeshGenerator.IsScanned)
            {
                return;
            }

            apMesh  mesh            = Editor.Select.Mesh;
            Vector2 imageHalfOffset = new Vector2(mesh.LinkedTextureData._width * 0.5f, mesh.LinkedTextureData._height * 0.5f);

            //List<apMeshGenMapper.ControlPoint> controlPoints = Editor.MeshGenerator.Mapper.ControlPoints;
            List <apMeshGenMapper.ControlPoint> selectedControlPoints = Editor.MeshGenerator._selectedControlPoints;

            if (selectedControlPoints.Count <= 1)
            {
                return;
            }

            apMeshGenMapper.ControlPoint curPoint = null;

            Vector2 posW      = Vector2.zero;
            Vector2 centerPos = Vector2.zero;

            for (int i = 0; i < selectedControlPoints.Count; i++)
            {
                curPoint   = selectedControlPoints[i];
                posW       = curPoint._pos_Cur - (mesh._offsetPos + imageHalfOffset);
                centerPos += posW;
            }
            centerPos /= selectedControlPoints.Count;

            Vector2 scale = new Vector2(1.0f + deltaScaleW.x, 1.0f + deltaScaleW.y);

            apMatrix3x3 matrix_Scale = apMatrix3x3.TRS(centerPos, 0, Vector2.one)
                                       * apMatrix3x3.TRS(Vector2.zero, 0, scale)
                                       * apMatrix3x3.TRS(-centerPos, 0, Vector2.one);


            for (int i = 0; i < selectedControlPoints.Count; i++)
            {
                curPoint          = selectedControlPoints[i];
                posW              = curPoint._pos_Cur - (mesh._offsetPos + imageHalfOffset);
                posW              = matrix_Scale.MultiplyPoint(posW);
                curPoint._pos_Cur = posW + (mesh._offsetPos + imageHalfOffset);
            }

            Editor.SetRepaint();
        }
Example #7
0
        public void Calculate(float tDelta)        //<<tDelta가 추가되었다.
        {
            #region [미사용 코드] 해시코드 체크 부분을 없앴다. 퍼포먼스 잘나온다 =3=b
            //if (_isMatrixChanged)
            //{
            //	//테스트
            //	//상대값이 아니라 절대값을 World로 사용하자
            //	//_matrix_ToWorld = _matrix_MeshTransform * _matrix_Cal_VertLocal * _matrix_Static_Vert2Mesh;
            //	//_pos_World3 = _matrix_ToWorld.MultiplyPoint3x4(Vector3.zero);
            //	//_pos_World3 = _matrix_ToWorld.MultiplyPoint3x4(_vertex._pos);

            //	//역순으로 World Matrix를 계산하자
            //	_matrix_ToWorld = _matrix_Cal_VertWorld
            //					//* _matrix_TF_Cal_Parent
            //					//* _matrix_Cal_Mesh
            //					//* _matrix_TF_Mesh
            //					* _matrix_MeshTransform
            //					* _matrix_Cal_VertLocal
            //					* _matrix_Static_Vert2Mesh;

            //	//_matrix_ToVert = _matrix_ToWorld.inverse;


            //}
            #endregion


            //역순으로 World Matrix를 계산하자
            _matrix_ToWorld = _matrix_Cal_VertWorld
                              * _matrix_MeshTransform
                              * _matrix_Cal_VertLocal
                              * _matrix_Static_Vert2Mesh;



            //_pos_World3 = _matrix_ToWorld.MultiplyPoint3x4(_vertex._pos * (1.0f - _weight_Rigging) + _pos_Rigging * _weight_Rigging);

            //_pos_World.x = _pos_World3.x;
            //_pos_World.y = _pos_World3.y;

            _pos_World = _matrix_ToWorld.MultiplyPoint(_vertex._pos * (1.0f - _weight_Rigging) + _pos_Rigging * _weight_Rigging);

            _pos_LocalOnMesh = (_matrix_MeshTransform.inverse).MultiplyPoint(_pos_World);
            //_pos_LocalOnMesh.z = 0;


            _isCalculated = true;

            //_isUpdateMatrixForce = false;
            //_isMatrixChanged = false;
        }
        public static bool IsMouseInMesh(Vector2 mousePos, apMesh targetMesh, apMatrix3x3 matrixWorldToMeshLocal)
        {
            Vector2 mousePosW = apGL.GL2World(mousePos);

            Vector2 mousePosL = matrixWorldToMeshLocal.MultiplyPoint(mousePosW);

            //Vector2 mousePosL = mousePosW + targetMesh._offsetPos;//<<이걸 추가해줘야 Local Pos가 된다.

            List <apMeshPolygon> polygons = targetMesh._polygons;

            for (int iPoly = 0; iPoly < polygons.Count; iPoly++)
            {
                List <apMeshTri> tris = polygons[iPoly]._tris;
                for (int iTri = 0; iTri < tris.Count; iTri++)
                {
                    apMeshTri tri = tris[iTri];
                    if (tri.IsPointInTri(mousePosL))
                    {
                        return(true);
                    }
                }
            }
            return(false);
        }
Example #9
0
        // Calculate
        //---------------------------------------------------------
        public void Calculate()
        {
            //역순으로 World Matrix를 계산하자
            #region [미사용 코드 : 리깅을 Vertex Pos로 받던 방식]
            //기본 코드
            //_matrix_ToWorld = _matrix_Cal_VertWorld
            //				//* _matrix_TF_Cal_Parent
            //				//* _matrix_Cal_Mesh
            //				//* _matrix_TF_Mesh
            //				* _matrix_MeshTransform
            //				* _matrix_Cal_VertLocal
            //				* _matrix_Static_Vert2Mesh;

            //마개조 코드/.... 예전 코드
            //_matrix_ToWorld._m00 = _matrix_MeshTransform._m00;
            //_matrix_ToWorld._m01 = _matrix_MeshTransform._m01;
            //_matrix_ToWorld._m02 = _matrix_MeshTransform._m00 * (_matrix_Cal_VertLocal._m02 + _matrix_Static_Vert2Mesh._m02)
            //						+ _matrix_MeshTransform._m01 * (_matrix_Cal_VertLocal._m12 + _matrix_Static_Vert2Mesh._m12)
            //						+ _matrix_MeshTransform._m02
            //						+ _matrix_Cal_VertWorld._m02;

            //_matrix_ToWorld._m10 = _matrix_MeshTransform._m10;
            //_matrix_ToWorld._m11 = _matrix_MeshTransform._m11;
            //_matrix_ToWorld._m12 = _matrix_MeshTransform._m10 * (_matrix_Cal_VertLocal._m02 + _matrix_Static_Vert2Mesh._m02)
            //						+ _matrix_MeshTransform._m11 * (_matrix_Cal_VertLocal._m12 + _matrix_Static_Vert2Mesh._m12)
            //						+ _matrix_MeshTransform._m12
            //						+ _matrix_Cal_VertWorld._m12;

            //_matrix_ToWorld._m20 = 0;
            //_matrix_ToWorld._m21 = 0;
            //_matrix_ToWorld._m22 = 1;
            #endregion

            //Rigging이 포함된 코드
            //_matrix_ToWorld = _matrix_Cal_VertWorld // T
            //				* _matrix_MeshTransform // TRS
            //				* _matrix_Rigging//<<추가 // TRS
            //				* _matrix_Cal_VertLocal // T
            //				* _matrix_Static_Vert2Mesh; // T


            //단축식을 만들자
            //1. MR 00, 01, 10, 11
            _matrix_ToWorld._m00 = (_matrix_MeshTransform._m00 * _matrix_Rigging._m00) + (_matrix_MeshTransform._m01 * _matrix_Rigging._m10);
            _matrix_ToWorld._m01 = (_matrix_MeshTransform._m00 * _matrix_Rigging._m01) + (_matrix_MeshTransform._m01 * _matrix_Rigging._m11);
            _matrix_ToWorld._m10 = (_matrix_MeshTransform._m10 * _matrix_Rigging._m00) + (_matrix_MeshTransform._m11 * _matrix_Rigging._m10);
            _matrix_ToWorld._m11 = (_matrix_MeshTransform._m10 * _matrix_Rigging._m01) + (_matrix_MeshTransform._m11 * _matrix_Rigging._m11);

            //2.
            //x=02, y=12
            // X : MR00(Lx+Px) + MR01(Ly+Py) + M00Rx + M01Ry + Wx + Mx
            // Y : MR10(Lx+Px) + MR11(Ly+Py) + M10Rx + M11Ry + Wy + My
            _matrix_ToWorld._m02 = _matrix_ToWorld._m00 * (_matrix_Cal_VertLocal._m02 + _matrix_Static_Vert2Mesh._m02)
                                   + _matrix_ToWorld._m01 * (_matrix_Cal_VertLocal._m12 + _matrix_Static_Vert2Mesh._m12)
                                   + _matrix_MeshTransform._m00 * _matrix_Rigging._m02
                                   + _matrix_MeshTransform._m01 * _matrix_Rigging._m12
                                   + _matrix_Cal_VertWorld._m02
                                   + _matrix_MeshTransform._m02;

            _matrix_ToWorld._m12 = _matrix_ToWorld._m10 * (_matrix_Cal_VertLocal._m02 + _matrix_Static_Vert2Mesh._m02)
                                   + _matrix_ToWorld._m11 * (_matrix_Cal_VertLocal._m12 + _matrix_Static_Vert2Mesh._m12)
                                   + _matrix_MeshTransform._m10 * _matrix_Rigging._m02
                                   + _matrix_MeshTransform._m11 * _matrix_Rigging._m12
                                   + _matrix_Cal_VertWorld._m12
                                   + _matrix_MeshTransform._m12;

            _matrix_ToWorld._m20 = 0;
            _matrix_ToWorld._m21 = 0;
            _matrix_ToWorld._m22 = 1;

            //_matrix_ToVert = _matrix_ToWorld.inverse;

            //이전 식
            //_vertPos3_World = _matrix_ToWorld.MultiplyPoint3x4(_pos3_Local);

            //리깅 포함한 식으로 변경

            //리깅 변경 이전 코드
            //_vertPos_World = _matrix_ToWorld.MultiplyPoint(_pos_Local * (1.0f - _weight_Rigging) + _pos_Rigging * _weight_Rigging);

            //리깅 변경 후 코드
            _vertPos_World = _matrix_ToWorld.MultiplyPoint(_pos_Local);

            //_vertPos_World.x = _vertPos3_World.x;
            //_vertPos_World.y = _vertPos3_World.y;

            if (_isMeshOrthoCorrection)
            {
                //추가 : Pers -> Ortho Correction을 적용한다.
                _cal_posLocalUpdated2 = (_matrix_MeshOrthoCorrection * _matrix_Static_Vert2Mesh_Inverse).MultiplyPoint(_vertPos_World);
            }
            else
            {
                _cal_posLocalUpdated2 = (_matrix_Static_Vert2Mesh_Inverse).MultiplyPoint(_vertPos_World);
            }

            _vertPos3_LocalUpdated.x = _cal_posLocalUpdated2.x;
            _vertPos3_LocalUpdated.y = _cal_posLocalUpdated2.y;
            _vertPos3_LocalUpdated.z = _zDepth * 0.01f;

            _isCalculated = true;
        }
Example #10
0
        public void DrawTexture(Texture2D image, apMatrix3x3 matrix, float width, float height, Color color2X, float depth, bool isDrawToneOutline = false)
        {
            if (_matBatch.IsNotReady())
            {
                return;
            }

            float width_Half  = width * 0.5f;
            float height_Half = height * 0.5f;

            //Zero 대신 mesh Pivot 위치로 삼자
            Vector2 pos_0 = World2GL(matrix.MultiplyPoint(new Vector2(-width_Half, +height_Half)));
            Vector2 pos_1 = World2GL(matrix.MultiplyPoint(new Vector2(+width_Half, +height_Half)));
            Vector2 pos_2 = World2GL(matrix.MultiplyPoint(new Vector2(+width_Half, -height_Half)));
            Vector2 pos_3 = World2GL(matrix.MultiplyPoint(new Vector2(-width_Half, -height_Half)));

            //CW
            // -------->
            // | 0(--) 1
            // |
            // | 3   2 (++)
            float u_left  = 0.0f;
            float u_right = 1.0f;

            float v_top    = 0.0f;
            float v_bottom = 1.0f;

            Vector3 uv_0 = new Vector3(u_left, v_bottom, 0.0f);
            Vector3 uv_1 = new Vector3(u_right, v_bottom, 0.0f);
            Vector3 uv_2 = new Vector3(u_right, v_top, 0.0f);
            Vector3 uv_3 = new Vector3(u_left, v_top, 0.0f);

            //CW
            // -------->
            // | 0   1
            // |
            // | 3   2
            if (!isDrawToneOutline)
            {
                _matBatch.SetPass_Texture_Normal(color2X, image, apPortrait.SHADER_TYPE.AlphaBlend);
            }
            else
            {
                _matBatch.SetPass_ToneColor_Custom(color2X, image, 0.0f, 0.0f);
            }
            _matBatch.SetClippingSize(_glScreenClippingSize);


            GL.Begin(GL.TRIANGLES);

            GL.TexCoord(uv_0);      GL.Vertex(new Vector3(pos_0.x, pos_0.y, depth));             // 0
            GL.TexCoord(uv_1);      GL.Vertex(new Vector3(pos_1.x, pos_1.y, depth));             // 1
            GL.TexCoord(uv_2);      GL.Vertex(new Vector3(pos_2.x, pos_2.y, depth));             // 2

            GL.TexCoord(uv_2);      GL.Vertex(new Vector3(pos_2.x, pos_2.y, depth));             // 2
            GL.TexCoord(uv_3);      GL.Vertex(new Vector3(pos_3.x, pos_3.y, depth));             // 3
            GL.TexCoord(uv_0);      GL.Vertex(new Vector3(pos_0.x, pos_0.y, depth));             // 0


            GL.End();
        }
Example #11
0
        public void DrawMesh(apMesh mesh, apMatrix3x3 matrix, Color color2X, bool isShowAllTexture, bool isDrawOutline, bool isDrawEdge, bool isDrawToneOutline = false)
        {
            try
            {
                //0. 메시, 텍스쳐가 없을 때
                //if (mesh == null || mesh._textureData == null || mesh._textureData._image == null)//이전 코드
                if (mesh == null || mesh.LinkedTextureData == null || mesh.LinkedTextureData._image == null)                //변경 코드
                {
                    return;
                }

                //1. 모든 메시를 보여줄때 (또는 클리핑된 메시가 없을 때) =>
                Color textureColor = new Color(0.5f, 0.5f, 0.5f, 1.0f);
                //Color shadedTextureColor = new Color(0.3f, 0.3f, 0.3f, 1.0f);
                Color atlasBorderColor    = new Color(0.0f, 1.0f, 1.0f, 0.5f);
                Color meshEdgeColor       = new Color(1.0f, 0.5f, 0.0f, 0.9f);
                Color meshHiddenEdgeColor = new Color(1.0f, 1.0f, 0.0f, 0.7f);

                matrix *= mesh.Matrix_VertToLocal;

                if (isShowAllTexture)
                {
                    //DrawTexture(mesh._textureData._image, matrix, mesh._textureData._width, mesh._textureData._height, textureColor, -10);
                    DrawTexture(mesh.LinkedTextureData._image, matrix, mesh.LinkedTextureData._width, mesh.LinkedTextureData._height, textureColor, -10);
                }

                Vector2 pos2_0 = Vector2.zero;
                Vector2 pos2_1 = Vector2.zero;
                Vector2 pos2_2 = Vector2.zero;

                Vector3 pos_0 = Vector3.zero;
                Vector3 pos_1 = Vector3.zero;
                Vector3 pos_2 = Vector3.zero;

                Vector2 uv_0 = Vector2.zero;
                Vector2 uv_1 = Vector2.zero;
                Vector2 uv_2 = Vector2.zero;

                //2. 메시를 렌더링하자
                if (mesh._indexBuffer.Count >= 3)
                {
                    if (!isDrawToneOutline)
                    {
                        _matBatch.SetPass_Texture_Normal(color2X, mesh.LinkedTextureData._image, apPortrait.SHADER_TYPE.AlphaBlend);
                    }
                    else
                    {
                        _matBatch.SetPass_ToneColor_Custom(color2X, mesh.LinkedTextureData._image, 0.0f, 0.0f);
                    }

                    _matBatch.SetClippingSize(_glScreenClippingSize);

                    GL.Begin(GL.TRIANGLES);
                    //------------------------------------------
                    apVertex vert0, vert1, vert2;
                    //Color color0 = Color.black, color1 = Color.black, color2 = Color.black;
                    Color color0 = Color.white, color1 = Color.white, color2 = Color.white;


                    for (int i = 0; i < mesh._indexBuffer.Count; i += 3)
                    {
                        if (i + 2 >= mesh._indexBuffer.Count)
                        {
                            break;
                        }

                        if (mesh._indexBuffer[i + 0] >= mesh._vertexData.Count ||
                            mesh._indexBuffer[i + 1] >= mesh._vertexData.Count ||
                            mesh._indexBuffer[i + 2] >= mesh._vertexData.Count)
                        {
                            break;
                        }

                        vert0 = mesh._vertexData[mesh._indexBuffer[i + 0]];
                        vert1 = mesh._vertexData[mesh._indexBuffer[i + 1]];
                        vert2 = mesh._vertexData[mesh._indexBuffer[i + 2]];


                        pos2_0 = World2GL(matrix.MultiplyPoint(vert0._pos));
                        pos2_1 = World2GL(matrix.MultiplyPoint(vert1._pos));
                        pos2_2 = World2GL(matrix.MultiplyPoint(vert2._pos));

                        pos_0 = new Vector3(pos2_0.x, pos2_0.y, vert0._zDepth * 0.1f);
                        pos_1 = new Vector3(pos2_1.x, pos2_1.y, vert1._zDepth * 0.5f);
                        pos_2 = new Vector3(pos2_2.x, pos2_2.y, vert2._zDepth * 0.5f);                        //<<Z값이 반영되었다.

                        uv_0 = mesh._vertexData[mesh._indexBuffer[i + 0]]._uv;
                        uv_1 = mesh._vertexData[mesh._indexBuffer[i + 1]]._uv;
                        uv_2 = mesh._vertexData[mesh._indexBuffer[i + 2]]._uv;


                        GL.Color(color0); GL.TexCoord(uv_0); GL.Vertex(pos_0);                         // 0
                        GL.Color(color1); GL.TexCoord(uv_1); GL.Vertex(pos_1);                         // 1
                        GL.Color(color2); GL.TexCoord(uv_2); GL.Vertex(pos_2);                         // 2

                        //Back Side
                        GL.Color(color2); GL.TexCoord(uv_2); GL.Vertex(pos_2);                         // 2
                        GL.Color(color1); GL.TexCoord(uv_1); GL.Vertex(pos_1);                         // 1
                        GL.Color(color0); GL.TexCoord(uv_0); GL.Vertex(pos_0);                         // 0



                        ////------------------------------------------
                    }
                    GL.End();
                }

                if (mesh._isPSDParsed && isDrawOutline)
                {
                    Vector2 pos_LT = matrix.MultiplyPoint(new Vector2(mesh._atlasFromPSD_LT.x, mesh._atlasFromPSD_LT.y));
                    Vector2 pos_RT = matrix.MultiplyPoint(new Vector2(mesh._atlasFromPSD_RB.x, mesh._atlasFromPSD_LT.y));
                    Vector2 pos_LB = matrix.MultiplyPoint(new Vector2(mesh._atlasFromPSD_LT.x, mesh._atlasFromPSD_RB.y));
                    Vector2 pos_RB = matrix.MultiplyPoint(new Vector2(mesh._atlasFromPSD_RB.x, mesh._atlasFromPSD_RB.y));


                    _matBatch.SetPass_Color();
                    _matBatch.SetClippingSize(_glScreenClippingSize);
                    GL.Begin(GL.LINES);

                    DrawLine(pos_LT, pos_RT, atlasBorderColor, false);
                    DrawLine(pos_RT, pos_RB, atlasBorderColor, false);
                    DrawLine(pos_RB, pos_LB, atlasBorderColor, false);
                    DrawLine(pos_LB, pos_LT, atlasBorderColor, false);

                    GL.End();
                }

                //외곽선을 그려주자
                //float imageWidthHalf = mesh._textureData._width * 0.5f;
                //float imageHeightHalf = mesh._textureData._height * 0.5f;

                float imageWidthHalf  = mesh.LinkedTextureData._width * 0.5f;
                float imageHeightHalf = mesh.LinkedTextureData._height * 0.5f;

                Vector2 pos_TexOutline_LT = matrix.MultiplyPoint(new Vector2(-imageWidthHalf, -imageHeightHalf));
                Vector2 pos_TexOutline_RT = matrix.MultiplyPoint(new Vector2(imageWidthHalf, -imageHeightHalf));
                Vector2 pos_TexOutline_LB = matrix.MultiplyPoint(new Vector2(-imageWidthHalf, imageHeightHalf));
                Vector2 pos_TexOutline_RB = matrix.MultiplyPoint(new Vector2(imageWidthHalf, imageHeightHalf));


                _matBatch.SetPass_Color();
                _matBatch.SetClippingSize(_glScreenClippingSize);
                GL.Begin(GL.LINES);

                DrawLine(pos_TexOutline_LT, pos_TexOutline_RT, atlasBorderColor, false);
                DrawLine(pos_TexOutline_RT, pos_TexOutline_RB, atlasBorderColor, false);
                DrawLine(pos_TexOutline_RB, pos_TexOutline_LB, atlasBorderColor, false);
                DrawLine(pos_TexOutline_LB, pos_TexOutline_LT, atlasBorderColor, false);

                GL.End();


                //3. Edge를 렌더링하자 (전체 / Ouline)
                if (isDrawEdge)
                {
                    Vector2 pos0 = Vector2.zero, pos1 = Vector2.zero;
                    if (mesh._edges.Count > 0)
                    {
                        _matBatch.SetPass_Color();
                        _matBatch.SetClippingSize(_glScreenClippingSize);
                        GL.Begin(GL.LINES);
                        for (int i = 0; i < mesh._edges.Count; i++)
                        {
                            pos0 = matrix.MultiplyPoint(mesh._edges[i]._vert1._pos);
                            pos1 = matrix.MultiplyPoint(mesh._edges[i]._vert2._pos);

                            DrawLine(pos0, pos1, meshEdgeColor, false);
                        }

                        for (int iPoly = 0; iPoly < mesh._polygons.Count; iPoly++)
                        {
                            for (int iHE = 0; iHE < mesh._polygons[iPoly]._hidddenEdges.Count; iHE++)
                            {
                                apMeshEdge hiddenEdge = mesh._polygons[iPoly]._hidddenEdges[iHE];

                                pos0 = matrix.MultiplyPoint(hiddenEdge._vert1._pos);
                                pos1 = matrix.MultiplyPoint(hiddenEdge._vert2._pos);

                                DrawLine(pos0, pos1, meshHiddenEdgeColor, false);
                            }
                        }

                        GL.End();
                    }
                }
            }
            catch (Exception ex)
            {
                Debug.LogException(ex);
            }
        }