} // void _LoadNaviFromTemplate()

    public bool resetGlobal_constantObjects(CTriCollector triCollector, bool bConstantlyCreateObj)
    {
        if (triCollector.m_listTris_naviStart.Count > 0)
        {
            foreach (int iTriStart in triCollector.m_listTris_naviStart)
            {
                CTRI triStartCurr = triCollector.getTri(iTriStart);
                if (null != triStartCurr)
                {
                    m_intervalUnitWalking.newIntervalConstantly(iTriStart,
                                                                m_processInput._respawnunitwalking,
                                                                m_processInput._timeinterval_unitwalking,
                                                                triStartCurr.GetCenterTri());
                }
            }
        }
        else
        {
            m_intervalUnitWalking.workprocessInterval = false;
        }

        m_intervalUnitWalking.workprocessInterval = bConstantlyCreateObj;

        return(true);
    }
Exemple #2
0
    public int getTriHypotenuse(CNAVICELL.CADJ_TRI[] arrAdjTri, List <CTRI> listTris, int iSeqTri)
    {
        if (arrAdjTri.Length < 1 || iSeqTri < 0)
        {
            return(-1);
        }

        CNAVICELL.CADJ_TRI tri_Adj = arrAdjTri[iSeqTri];
        CTRI tri = listTris[iSeqTri];

        int iEdge_Hyptenuse = tri.GetHypotenuseEdge();

        if (CTRI.NULL_TRI_EDGE == iEdge_Hyptenuse)
        {
            return(-1);
        }

        int iTri_Hypotenuse = tri_Adj._arrTrisAdjacent[iEdge_Hyptenuse];

        if (iTri_Hypotenuse == CNAVICELL.NULL_CELL)
        {
            return(-1);
        }

        return(iTri_Hypotenuse);
    }
    //@ Construct All Triangles RenderLines
    public void drawAllTrisOneDrawcall(List <CTRI> listTriangle, Color colorTriangles)
    {
        if (null == m_drawRenderMesh_triCollector)
        {
            return;
        }

        if (listTriangle.Count < 1)
        {
            return;
        }

        int iLengthMapping = listTriangle.Count * 3;

        Vector3[] arrVertexmapping = new Vector3[iLengthMapping];

        for (int iSeqTri = 0; iSeqTri < listTriangle.Count; ++iSeqTri)
        {
            CTRI triCurr = listTriangle[iSeqTri];
            for (int iPnt = 0; iPnt < 3; ++iPnt)
            {
                int     iSeqPnt   = iSeqTri * 3 + iPnt;
                Vector3 v3PntCurr = triCurr._arrv3PT[iPnt];

                arrVertexmapping[iSeqPnt] = v3PntCurr;
            }
        }

        m_iSequenceRenderMesh_forDebug = m_drawRenderMesh_triCollector.DrawNewRendermesh(DFLT_IDX_RENDERNAVIMESH,
                                                                                         arrVertexmapping,
                                                                                         colorTriangles,
                                                                                         CMATH.FEPSILON_F3,
                                                                                         -1.0f);
    } // public void drawAllTrisOneDrawcall()
Exemple #4
0
    //@ Intersect ray to tries iteration.
    public CBASE__ GetIntersectedRay(Vector3 lineOrigin, Vector3 lineDir)
    {
        if (true == m_listTris.IsNullOrEmpty())
        {
            return(null);
        }

        List <CTRI> triesForIteration = m_listTris.Where(t => { return(null != t.GetBaseLinked); }).ToListOrDefault();

        if (true == triesForIteration.IsNullOrEmpty())
        {
            return(null);
        }

        CTRI intersectedTri = triesForIteration.FirstOrDefault(t =>
        {
            return(CMATH.IntersectRayTriSimple(lineOrigin, lineDir, t._arrv3PT[0], t._arrv3PT[1], t._arrv3PT[2]));
        });

        if (null == intersectedTri)
        {
            return(null);
        }

        CBASE__ intersectedBase = intersectedTri.GetBaseLinked;

        return(intersectedBase);
    }
Exemple #5
0
    } // public bool setNewBase_fromListTris( List<CBASE__> listBase_ )

    //@ Construct New Base__
    protected int setNewBase_fromListTris(List <int> listTriIdx_Instant)
    {
        if (true == m_listTrisAll_copy.IsNullOrEmpty() ||
            true == listTriIdx_Instant.IsNullOrEmpty())
        {
            Debug.LogError("(true == m_listTrisAll_copy.IsNullOrEmpty() || true == listTriIdx_Instant.IsNullOrEmpty())");
            return(-1);
        }

        int     iFirstIdx = listTriIdx_Instant[0];
        CBASE__ baseNew   = new CBASE__();

        for (int iTri_ = 0; iTri_ < listTriIdx_Instant.Count; ++iTri_)
        {
            int  iSeqTri_  = listTriIdx_Instant[iTri_];
            CTRI triPicked = m_listTrisAll_copy.GetSafe(iSeqTri_);
            if (null == triPicked)
            {
                Debug.LogError("(null == triPicked)/setNewBase_fromListTris");
                continue;
            }
            baseNew.InsertNewTri(iSeqTri_, triPicked, false);
        }

        baseNew.CalculateBase__(iFirstIdx);
        m_listBase__.Add(baseNew);

        Clear_InstantTriangles_All();

        return(m_listBase__.Count);
    }
Exemple #6
0
    //@ Post-Initialize
    //@ Insert Cells Basic Information and calculate internal cell distance from cell center to each cell edge middle.
    //  It use for which cell is shortest way to GOAL.
    public void SetComponentCell(int iSeqCell_, CTRI Tri_)
    {
        m_iSeqCell   = iSeqCell_;
        m_tri_linker = Tri_;

        Array.Copy(Tri_._arrv3PT, m_arrv3PT, Tri_._arrv3PT.Length);
        computeCellData();
    } // protected void SetComponentCell(Vector3[] arv3TriPT, Vector3 v3NormalCell)
    //@ Construct New Triangle
    protected void SetNewTri(int iSeqTri, CTRI tri_in)
    {
        for (int iSeqPnt = 0; iSeqPnt < tri_in._arrv3PT.Length; ++iSeqPnt)
        {
            Vector3 v3PntTri = tri_in._arrv3PT[iSeqPnt];
            _listv3Pnts.Add(v3PntTri);
        }

        _listIdxTris.Add(iSeqTri);
        _listIdxTris.Sort();
    }
Exemple #8
0
    public bool getTri(int iIdxTriangle, ref CTRI tri_out)
    {
        if (iIdxTriangle > m_listTris.Count)
        {
            Debug.Log("Accessed Index is out of range in Triangle Container");
            return(false);
        }

        tri_out = m_listTris[iIdxTriangle];

        return(true);
    }
Exemple #9
0
    //@ Collect all isoscelles right trignales
    public bool collectAll_IsoscellesRightTriangles(ref List <int> listIRTris)
    {
        for (int iSeqTri = 0; iSeqTri < m_listTris.Count; ++iSeqTri)
        {
            CTRI triCurr = m_listTris[iSeqTri];
            if (true == triCurr.IsoscelesRightAngleTriangle(0.05f))
            {
                listIRTris.Add(iSeqTri);
            }
        }

        return(listIRTris.Count > 0);
    }
    public Vector3 GetSatartTriagleCenterPosition(int startIndex)
    {
        if (m_GroundStartPoint_List.Count <= startIndex)
        {
            return(Vector3.zero);
        }

        int     index         = m_GroundStartPoint_List[startIndex];
        CTRI    tri           = m_MapTriangle[index];
        Vector3 startPosition = (tri._arrv3PT[0] + tri._arrv3PT[1] + tri._arrv3PT[2]) / 3.0f;;

        return(startPosition);
    }
    Vector3 GetStartTriangleRandomPosition(CTriCollector tricollector, int idxTriangle)
    {
        CTRI tri = tricollector.getTri(idxTriangle);

        float r1 = Random.Range(0.1f, 0.8f);
        float r2 = Random.Range(0.1f, (1.0f - r1 - 0.1f));
        float r3 = 1.0f - r1 - r2;

        float positionX = tri._arrv3PT[0].x * r1 + tri._arrv3PT[1].x * r2 + tri._arrv3PT[2].x * r3;
        float positionZ = tri._arrv3PT[0].z * r1 + tri._arrv3PT[1].z * r2 + tri._arrv3PT[2].z * r3;

        return(new Vector3(positionX, tri._arrv3PT[0].y, positionZ));
    }
Exemple #12
0
    public void AddToBlockEdge_Tri(CTRI tri_B, int iSeqTri)
    {
        if (m_listSeqBlockTri.Count > 0)
        {
            if (-1 < m_listSeqBlockTri.BinarySearch(iSeqTri))
            {
                return;
            }
        } // if (m_listSeqBlockTri.Count > 0)

        EDGE__ edge01 = new EDGE__(tri_B._arrv3PT[0], tri_B._arrv3PT[1]);
        EDGE__ edge12 = new EDGE__(tri_B._arrv3PT[1], tri_B._arrv3PT[2]);
        EDGE__ edge20 = new EDGE__(tri_B._arrv3PT[2], tri_B._arrv3PT[0]);

        AddToBlockEdge(edge01);
        AddToBlockEdge(edge12);
        AddToBlockEdge(edge20);
    } // void AddToBlockEdgeTri(CTRI tri_B)
    public Vector3 GetStartTriangleRandomPosition(int startIndex)
    {
        if (m_GroundStartPoint_List.Count <= startIndex)
        {
            return(Vector3.zero);
        }

        int  index = m_GroundStartPoint_List[startIndex];
        CTRI tri   = m_MapTriangle[index];

        float r1 = Random.Range(0.1f, 0.8f);
        float r2 = Random.Range(0.1f, (1.0f - r1 - 0.1f));
        float r3 = 1.0f - r1 - r2;

        float positionX = tri._arrv3PT[0].x * r1 + tri._arrv3PT[1].x * r2 + tri._arrv3PT[2].x * r3;
        float positionZ = tri._arrv3PT[0].z * r1 + tri._arrv3PT[1].z * r2 + tri._arrv3PT[2].z * r3;

        return(new Vector3(positionX, tri._arrv3PT[0].y, positionZ));
    }
    } // protected bool BuildAdjacentATri

    // 함수:ConstructTrisToCells
    // 네비게이션을 위한 모든 셀들과 인접 셀들을 생성한다
    //@ Construct all adjacent Cells for navigation.
    protected void ConstructTrisToCells(List <CTRI> listTris_)
    {
        int iCntTris = listTris_.Count;

        m_arrNavicells = new CNAVICELL[iCntTris];   // Tri카운트 만큼 네비셀 생성

        for (int iTri = 0; iTri < iCntTris; iTri++)
        {
            CTRI triCurr = listTris_[iTri];

            CNAVICELL naviCell = new CNAVICELL();
            naviCell.InitializeNaviCell();  // 각 셀들의 초기화

            //@ Compute each middle edge to Center
            naviCell.SetComponentCell(iTri, triCurr);   // Tri 기본 정보를 네비셀에 전달 그리고 각각의 미들 엣지,센터를 계산
            m_arrNavicells[iTri] = naviCell;
        }

        buildupAdjacentAll(ref m_arrNavicells); // 인접 셀 빌드업
    }
Exemple #15
0
    protected void DrawInstantTris(List <int> listTris_Instant)
    {
        if (null == m_drawRenderMesh)
        {
            return;
        }

        m_drawRenderMesh.DeleteDrawMesh_Range(m_iID_Instant_DrawForDEBUG, m_iID_Instant_DrawForDEBUG + m_listTrisAll_copy.Count);

        foreach (int iterIdxTri in listTris_Instant)
        {
            CTRI triRenderDebug = m_listTrisAll_copy[iterIdxTri];

            //@ Just For Draw Debug Triangles
            m_drawRenderMesh.DrawNewRendermesh(m_iID_Instant_DrawForDEBUG + iterIdxTri,
                                               triRenderDebug._arrv3PT,
                                               m_colorInstantSelect,
                                               m_fEpsilon_forZfight,
                                               CDrawRenderMesh.scaleadjust_render_093);
        }
    }
Exemple #16
0
    // ÇÔ¼ö:InitializeNaviCell()
    //@ Process °¢ ³×ºñ¼¿µéÀÇ ÃʱâÈ­ ÀÛ¾÷
    //@ Set all properties unprocessed and set NULL.
    public void InitializeNaviCell()
    {
        m_iSeqCell = NULL_CELL;

        for (int i = 0; i < 3; ++i)
        {
            m_arriAdjCells[i]        = NULL_CELL;
            m_arrfcosttoGoal_edge[i] = -1.0f;
        }

        m_iLevelToGoal  = NULL_LEVELFROMGOAL;
        m_eEdge_bestway = E_CELL_SIDEEDGE.E_EDGE_NULL;

        m_fcosttoGoal_ex  = CMATH.FLOAT_MAX;
        m_fcosttoGoal_cen = CMATH.FLOAT_MAX;

        m_tri_linker  = null;
        m_eStatusCell = E_CELL_STATUS.CELL_STATUS_ROAD;

        m_bUseWaytoPortal = false;
    }
    //@ Construct All Triangles RenderLines
    public void drawRenderTris_selectlist(List <CTRI> listTriangle, List <int> listTrisIdx, Color colorTris)
    {
        if (null == m_drawRenderMesh_triCollector)
        {
            return;
        }

        if (listTriangle.Count < 1 || listTrisIdx.Count < 1)
        {
            Debug.Log("drawAllTrisOneDrawcall():listTriangle.Count < 1 || listTrisIdx.Count < 1");
            return;
        }

        int iLengthMapping = listTrisIdx.Count * 3;

        Vector3[] arrVertexmapping = new Vector3[iLengthMapping];

        for (int iSeqTri = 0; iSeqTri < listTrisIdx.Count; ++iSeqTri)
        {
            int iTriIdxCurr = listTrisIdx[iSeqTri];

            CTRI triCurr = listTriangle[iTriIdxCurr];
            for (int iPnt = 0; iPnt < 3; ++iPnt)
            {
                int     iSeqPnt   = iSeqTri * 3 + iPnt;
                Vector3 v3PntCurr = triCurr._arrv3PT[iPnt];

                arrVertexmapping[iSeqPnt] = v3PntCurr;
            }
        } // for (int iSeqTri = 0; iSeqTri < listTrisIdx.Count; ++iSeqTri )

        m_iSequenceRenderMesh_forDebug = m_drawRenderMesh_triCollector.DrawNewRendermesh(DFLT_IDX_RENDERNAVI_TRIS_IR,
                                                                                         arrVertexmapping,
                                                                                         colorTris,
                                                                                         0.001f,
                                                                                         -1.0f);
    } // public void drawRenderTris_selectlist()
    //@ Triangle Collection Composition all renderLine of triangles.
    public void _drawRenderLine_AllTris_Debug(CTriCollector triCollector)
    {
        if (null == m_drawRenderLine_triCollector)
        {
            return;
        }

        List <CTRI> listTriangle = triCollector.getTris();

        if (listTriangle.Count < 1)
        {
            return;
        }

        if (m_iSequenceRenderLine_forDebug >= 0)
        {
            return;
        }


        int iLengthMapping = listTriangle.Count * 3;

        Vector3[] arrVertexmapping = new Vector3[iLengthMapping];

        for (int iSeqTri = 0; iSeqTri < listTriangle.Count; ++iSeqTri)
        {
            CTRI triCurr = listTriangle[iSeqTri];
            for (int iPnt = 0; iPnt < 3; ++iPnt)
            {
                int     iSeqPnt   = iSeqTri * 3 + iPnt;
                Vector3 v3PntCurr = triCurr._arrv3PT[iPnt];
                arrVertexmapping[iSeqPnt] = v3PntCurr;
            }
        }

        m_iSequenceRenderLine_forDebug = m_drawRenderLine_triCollector.DrawNewLine_user(arrVertexmapping);
    } // public void _drawRenderLine_AllTris_Debug()
    //@ For DEBUG, Set Draw way StartCell to Goal
    public void drawStartCellToGoal(CNavigation navigation, CTriCollector tricollector)
    {
        UndrawStartCellToGoal();
        _SetundrawNaviCells_Text3D();

        if (null == navigation.m_arrNavicells)
        {
            return;
        }

        bool bResultOrganized = navigation.collectWay_allStartsToGoal(tricollector, ref m_arrSequenceCell);

        if (false == bResultOrganized)
        {
            return;
        }

        CNAVICELL[] arrNavicells = navigation.m_arrNavicells;

        List <int> listSeqTri      = getListSequenceOrganized();
        int        iBasisUniqueNum = m_iBasisUniqueNum_RenderMesh;

        for (int iTriAdj = 0; iTriAdj < listSeqTri.Count; ++iTriAdj)
        {
            int  iSeqUniqueNum = iBasisUniqueNum + listSeqTri[iTriAdj];
            CTRI triAdj_       = arrNavicells[listSeqTri[iTriAdj]].trilinkcell;

            m_drawRenderMesh_navi.DrawNewRendermesh(iSeqUniqueNum,
                                                    triAdj_._arrv3PT,
                                                    Color.Lerp(Color.gray, Color.black, 0.5f),
                                                    CMATH.FEPSILON_F3 + CMATH.FEPSILON_F3,
                                                    CDrawRenderMesh.scaleadjust_render_070);
        }

        _drawText3D_SeqCells(tricollector, tricollector.m_listTris_naviStart);
    } // private void drawStartCellToGoal()
    //@ Debug Draw for Tri Eachtype
    public void drawAllTri_eachFunctional(CTriCollector triCollector, bool bRepresentBlocks)
    {
        if (null == m_drawRenderMesh_triCollector)
        {
            return;
        }

        undrawAllTri();

        List <int> listTrisPicked_naviGoal      = triCollector.m_listTris_naviGoal;
        List <int> listTrisPicked_naviBlock     = triCollector.m_listTris_naviBlock;
        List <int> listTrisPicked_naviBlockRoad = triCollector.m_listTris_naviBlockRoad;
        List <int> listTrisPicked_naviStart     = triCollector.m_listTris_naviStart;

        // Blocks
        if (true == bRepresentBlocks)
        {
            if (listTrisPicked_naviBlock.Count > 0)
            {
                foreach (int iIdxTri in listTrisPicked_naviBlock)
                {
                    CTRI triRenderDebug = triCollector.getTri(iIdxTri);
                    m_drawRenderMesh_triCollector.DrawNewRendermesh(DFLT_IDX_RENDERTRI_TYPE + iIdxTri,
                                                                    triRenderDebug._arrv3PT,
                                                                    Color.Lerp(Color.blue, Color.black, 0.5f),
                                                                    CMATH.FEPSILON_F2 * 3.0f,
                                                                    CDrawRenderMesh.scaleadjust_render_095);
                }
            }

            // BlockRoads
            if (listTrisPicked_naviBlockRoad.Count > 0)
            {
                foreach (int iIdxTri in listTrisPicked_naviBlockRoad)
                {
                    CTRI triRenderDebug = triCollector.getTri(iIdxTri);
                    m_drawRenderMesh_triCollector.DrawNewRendermesh(DFLT_IDX_RENDERTRI_TYPE + iIdxTri,
                                                                    triRenderDebug._arrv3PT,
                                                                    Color.Lerp(Color.blue, Color.white, 0.2f),
                                                                    CMATH.FEPSILON_F2 * 3.0f,
                                                                    CDrawRenderMesh.scaleadjust_render_095);
                }
            }
        } // if (true == bRepresentBlocks)

        // Goals
        if (listTrisPicked_naviGoal.Count > 0)
        {
            foreach (int iIdxTri in listTrisPicked_naviGoal)
            {
                CTRI triRenderDebug = triCollector.getTri(iIdxTri);
                m_drawRenderMesh_triCollector.DrawNewRendermesh(DFLT_IDX_RENDERTRI_TYPE + iIdxTri,
                                                                triRenderDebug._arrv3PT,
                                                                Color.red,
                                                                CMATH.FEPSILON_F2 * 3.0f,
                                                                CDrawRenderMesh.scaleadjust_render_093);
            }
        }



        // Starts
        if (listTrisPicked_naviStart.Count > 0)
        {
            foreach (int iIdxTri in listTrisPicked_naviStart)
            {
                CTRI triRenderDebug = triCollector.getTri(iIdxTri);
                m_drawRenderMesh_triCollector.DrawNewRendermesh(DFLT_IDX_RENDERTRI_TYPE + iIdxTri,
                                                                triRenderDebug._arrv3PT,
                                                                Color.yellow,
                                                                CMATH.FEPSILON_F2 * 3.0f,
                                                                CDrawRenderMesh.scaleadjust_render_093);
            }
        }
    } // public void drawAllTri_eachFunctional()
    public bool LoadStage()
    {
        if (null == m_Filename)
        {
            return(false);
        }
        Release();

        string filepath = m_Forder + m_Filename + m_Ext;

        CFileManager tFile = CFileManager.GetInstance;

        //  load stream
        Stream ms = tFile.LoadFile(filepath);

        if (null == ms)
        {
            return(false);
        }

        BinaryReader br = new BinaryReader(ms);

        //  MapTri
        int count  = 0;
        int count2 = 0;

        count = br.ReadInt32();
        CTRI tri = null;

        for (int i = 0; i < count; i++)
        {
            tri = new CTRI();
            for (int j = 0; j < 3; j++)
            {
                tri._arrv3PT[j].x = br.ReadSingle();
                tri._arrv3PT[j].y = br.ReadSingle();
                tri._arrv3PT[j].z = br.ReadSingle();
                tri._arriIV[j]    = br.ReadInt32();
            }

            tri._v3TriNormal.x    = br.ReadSingle();
            tri._v3TriNormal.y    = br.ReadSingle();
            tri._v3TriNormal.z    = br.ReadSingle();
            tri._arrEdgeLength[0] = br.ReadSingle();
            tri._arrEdgeLength[1] = br.ReadSingle();
            tri._arrEdgeLength[2] = br.ReadSingle();

            AddTriangle(tri);
        }
        //  MapArrageBase
        count = br.ReadInt32();
        CBASE__ towerArrange = null;

        for (int i = 0; i < count; i++)
        {
            towerArrange = new CBASE__();
            count2       = br.ReadInt32();
            for (int j = 0; j < count2; j++)
            {
                towerArrange._listIdxTris.Add(br.ReadInt32());
            }

            count2 = br.ReadInt32();
            for (int j = 0; j < count2; j++)
            {
                Vector3 vec = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle());
                towerArrange._listv3Pnts.Add(vec);
            }
            //  중앙포지션
            towerArrange._v3PositionCenter.x = br.ReadSingle();
            towerArrange._v3PositionCenter.y = br.ReadSingle();
            towerArrange._v3PositionCenter.z = br.ReadSingle();

            //  삼각형 정보
            count2 = br.ReadInt32();
            for (int j = 0; j < count2; j++)
            {
                Vector3 vec = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle());
                towerArrange._listv3PntsSrc.Add(vec);
            }

            AddBaseTower(towerArrange);
            m_BaseTowerMeshIndex.Add(towerArrange._listIdxTris[0], i);
            m_BaseTowerMeshIndex.Add(towerArrange._listIdxTris[1], i);
        }
        //  MainCoreList
        count = br.ReadInt32();
        BaseInfo core;

        for (int i = 0; i < count; i++)
        {
            core = new BaseInfo();
            core.CoreLoad(br);
            AddMainCore(core);
        }
        //  SubCoreList
        count = br.ReadInt32();
        for (int i = 0; i < count; i++)
        {
            core = new BaseInfo();
            core.CoreLoad(br);
            AddSubCore(core);
        }
        //  StartBaseList
        count = br.ReadInt32();
        for (int i = 0; i < count; i++)
        {
            core = new BaseInfo();
            core.CoreLoad(br);
            AddStartBase(core);
        }
        //  BlockBaseList
        count = br.ReadInt32();
        for (int i = 0; i < count; i++)
        {
            core = new BaseInfo();
            core.CoreLoad(br);
            AddBlockBase(core);
        }
        //  GoalPoint
        count = br.ReadInt32();
        for (int i = 0; i < count; i++)
        {
            AddGoalPoint(br.ReadInt32());
        }
        //  GroundMonster_StartPoint
        count = br.ReadInt32();
        for (int i = 0; i < count; i++)
        {
            AddGroundStartPoint(br.ReadInt32());
        }
        //  BlockPoint
        count = br.ReadInt32();
        for (int i = 0; i < count; i++)
        {
            AddGroundBlockPoint(br.ReadInt32());
        }

        //  BlockRoadPoint
        count = br.ReadInt32();
        for (int i = 0; i < count; i++)
        {
            AddGroundBlockRoadPoint(br.ReadInt32());
        }

        //  flyPath list
        count = br.ReadInt32();
        CSplineGenerator path = null;

        for (int i = 0; i < count; i++)
        {
            path = new CSplineGenerator();

            path.SetTypeSplineCurve((E_TYPE_SPLINE)br.ReadUInt32());
            path.SetDivisionWeight(br.ReadSingle());

            count2 = br.ReadInt32();
            for (int j = 0; j < count2; j++)
            {
                Vector3 vec = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle());
                path.SetNewCurvePoint_spline(vec);
            }

            AddFlyPath(path);
        }

        //  파일포인터 맨처음으로
        ms.Seek(0, SeekOrigin.Begin);

        return(true);
    }
Exemple #22
0
    }   //protected bool CTriContainer::constructAllTris_IVrecompute(

    //@ Construct all Triangle refer to Index Buffers, Vertex Buffers.
    protected bool constructAllTris_IV(int[] arrTri_in,
                                       Vector3[] arrVertex_in,
                                       ref List <CTRI> listTris_out)
    {
        Vector3[] arrv3TriVer = new Vector3[CTRI.CNTPNTTRI];

        int[] ariTriIdx = new int[CTRI.CNTPNTTRI];
        int   iCntVB    = arrVertex_in.Length;
        int   iCntIV    = arrTri_in.Length;

        if (iCntIV < 1 || iCntVB < 1)
        {
            Debug.Log("(iCntIV < 1 || iCntVB < 1)");
            return(false);
        }

        //int iCntTries = (iCntIV / CTRI.CNTPNTTRI) + 1;

        CTRI    triCurrent;
        Vector3 v3MinAABB = new Vector3(CMATH.FLOAT_MAX, CMATH.FLOAT_MAX, CMATH.FLOAT_MAX),
                v3MaxAABB = new Vector3(-CMATH.FLOAT_MAX, -CMATH.FLOAT_MAX, -CMATH.FLOAT_MAX);

        Vector3 v3VerTri;

        for (int iSeqIdx = 0, iTri = 0; iSeqIdx < iCntIV; iSeqIdx += 3, ++iTri)
        {
            ariTriIdx[0] = arrTri_in[iSeqIdx];
            ariTriIdx[1] = arrTri_in[iSeqIdx + 1];
            ariTriIdx[2] = arrTri_in[iSeqIdx + 2];

            for (int itV = 0; itV < 3; ++itV)
            {
                v3VerTri = new Vector3(arrVertex_in[ariTriIdx[itV]].x, arrVertex_in[ariTriIdx[itV]].y, arrVertex_in[ariTriIdx[itV]].z);

                if (v3VerTri.x > v3MaxAABB.x)
                {
                    v3MaxAABB.x = v3VerTri.x;
                }
                if (v3VerTri.y > v3MaxAABB.y)
                {
                    v3MaxAABB.y = v3VerTri.y;
                }
                if (v3VerTri.z > v3MaxAABB.z)
                {
                    v3MaxAABB.z = v3VerTri.z;
                }

                if (v3VerTri.x < v3MinAABB.x)
                {
                    v3MinAABB.x = v3VerTri.x;
                }
                if (v3VerTri.y < v3MinAABB.y)
                {
                    v3MinAABB.y = v3VerTri.y;
                }
                if (v3VerTri.z < v3MinAABB.z)
                {
                    v3MinAABB.z = v3VerTri.z;
                }

                arrv3TriVer[itV] = v3VerTri;
            }
            triCurrent = new CTRI();
            triCurrent.Set(arrv3TriVer, ariTriIdx);

            listTris_out.Add(triCurrent);
        }

        return(true);
    } //protected bool constructAllTris_IV(
Exemple #23
0
    //@ Collect All BaseTower List which calculated Perfect Square.
    static public bool CollectAll_perfectSqre_exceptGoalTri(CNAVICELL[] arrNavicells,
                                                            CTriCollector tricollector,
                                                            ref List <CBASE__> listBase)
    {
        int iCntNaviCell = arrNavicells.Length;


        if (iCntNaviCell < 1)
        {
            Debug.Log("if(iCntNaviCell < 1)");
            return(false);
        }

        List <int> listIdxTrisGoal  = tricollector.m_listTris_naviGoal;
        List <int> listIdxTrisStart = tricollector.m_listTris_naviStart;
        List <int> listTriIR        = new List <int>();

        CNAVICELL.CADJ_TRI[] arrAdjs_ = tricollector.arrayAllTriAdjacent;

        tricollector.collectAll_IsoscellesRightTriangles(ref listTriIR);

        List <int> listTri_Instant__            = new List <int>();
        bool       bValidatedBase_perfectSquare = false;

        foreach (int iIdxTri in listTriIR)
        {
            CNAVICELL.CADJ_TRI adjTri = arrAdjs_[iIdxTri];
            CTRI triCurr = tricollector.getTri(iIdxTri);
            bValidatedBase_perfectSquare = false;

            //@ process skip
            if (true == triCurr.inclinedPlane())
            {
                continue;
            }

            if (-1 < listIdxTrisGoal.BinarySearch(iIdxTri))
            {
                continue;
            }

            if (-1 < listIdxTrisStart.BinarySearch(iIdxTri))
            {
                continue;
            }

            int iEdge_Hyptenuse = triCurr.GetHypotenuseEdge();
            if (CTRI.NULL_TRI_EDGE == iEdge_Hyptenuse)
            {
                continue;
            }

            int iTri_Hypotenuse = adjTri._arrTrisAdjacent[iEdge_Hyptenuse];
            if (iTri_Hypotenuse == CNAVICELL.NULL_CELL)
            {
                continue;
            }

            CTRI triHyptenuse = tricollector.getTri(iTri_Hypotenuse);
            if (triHyptenuse.IsisoscelesRightAngle() == true)
            {
                bValidatedBase_perfectSquare = true;
                listTri_Instant__.Add(iIdxTri);
                listTri_Instant__.Add(iTri_Hypotenuse);
            }

            if (true == bValidatedBase_perfectSquare)
            {
                CBASE__ base__New = new CBASE__();
                for (int iTri_ = 0; iTri_ < listTri_Instant__.Count; ++iTri_)
                {
                    int  iSeqTri_  = listTri_Instant__[iTri_];
                    CTRI triPicked = tricollector.getTri(iSeqTri_);
                    base__New.InsertNewTri(iSeqTri_, triPicked, false);
                }
                bool bAlreadyExisted = false;
                foreach (CBASE__ base__Sub in listBase)
                {
                    if (true == base__Sub.IsSimilar(base__New))
                    {
                        bAlreadyExisted = true;
                        break;
                    }
                }

                if (false == bAlreadyExisted)
                {
                    base__New.CalculateBase__(iIdxTri);
                    listBase.Add(base__New);
                }

                listTri_Instant__.Clear();
            } // if(true==bValidatedBase_perfectSquare)
        }     // foreach(int iIdxTri in listTriIR)

        return(true);
    } // static public bool CollectAll_perfectSqre_exceptGoalTri()
 public void AddTriangle(CTRI tri)                   //  Add tri
 {
     m_MapTriangle.Add(tri);
 }
    // Collect all blocks start to goal. And then buildup shortest way start to goal.
    // 처음 스타트 부터 골까지의 모든 네비 블럭을 모은다(가장 짧은 길을 택한다)
    static public void collectWayToGoalLinear(CNAVICELL[] arrNavicells_,
                                              CNAVICELL cellStart_,
                                              ref List <CNAVICELL> listSequenceCell_,
                                              ref CComputeEdgeBlock processorEdge_)
    {
        bool    bOrganizedComplete = false;
        Vector3 v3PntEdge0         = new Vector3();
        Vector3 v3PntEdge1         = new Vector3();

        CNAVICELL cellWay = cellStart_;

        bOrganizedComplete = false;

        listSequenceCell_.Add(cellWay); //First unit is startcell.

        //@ first collect all blocks start -> goal.
        while (false == bOrganizedComplete)
        {
            CTRI triWaytoGoal = cellWay.trilinkcell;

            //@ if Adjacent cell is NULL, add new EDGE list.    //이웃셀이 없다면 추가한다
            for (int iSeqAdj = 0; iSeqAdj < cellWay.m_arriAdjCells.Length; ++iSeqAdj)
            {
                int             iIdxAdj = cellWay.m_arriAdjCells[iSeqAdj];
                CTRI.E_TRI_EDGE eEdge   = (CTRI.E_TRI_EDGE)iSeqAdj;

                //@ Checkup adjacent Edge Tri    //
                if (CNAVICELL.NULL_CELL == iIdxAdj)
                {
                    triWaytoGoal.GetEdgePoint(eEdge, ref v3PntEdge0, ref v3PntEdge1);
                    processorEdge_.AddToBlockEdge(v3PntEdge0, v3PntEdge1);       //-> Add Edge to Block List
                }
                else
                {
                    CNAVICELL cellAdj = arrNavicells_[iIdxAdj];

                    //@ Adj cell is block cell, then into list.
                    if (cellAdj.IsBlockCell())
                    {
                        processorEdge_.AddToBlockEdge_Tri(cellAdj.trilinkcell, iIdxAdj); //-> Add Edge to Block List
                    }
                }
            } // for (int iAdj = 0; iAdj < naviCellNextWay.m_arriAdjCells.Length; ++iAdj)

            int iIdxCellBestWay = cellWay.getIdxCell_nextWay();

            if (CNAVICELL.NULL_CELL == iIdxCellBestWay)
            {
                return;
            }

            cellWay = arrNavicells_[iIdxCellBestWay];

            listSequenceCell_.Add(cellWay); // Last unit must be goalcell.

            if (true == cellWay.IsGoalCell())
            {
                bOrganizedComplete = true;
            }
        } // while (false == bOrganizedComplete)
    }     // protected void collectWayToGoalLinear()
Exemple #26
0
    //@ Function has little risk about triangle match.
    protected bool constructAllTris_IVrecompute(int[] arrTri_in,
                                                Vector3[] arrVertex_in,
                                                ref List <CTRI> listTris_out)
    {
        Vector3[] arrv3TriVer = new Vector3[CTRI.CNTPNTTRI];
        int[]     ariTriIdx   = new int[CTRI.CNTPNTTRI];
        int       iCntVB      = arrVertex_in.Length;
        int       iCntIV      = arrTri_in.Length;

        //CHECKOVERLAPPED
        int iCntSameVer__ = 0;

        if (iCntIV < 1 || iCntVB < 1)
        {
            return(false);
        }

        int[] arrIBConvert = new int[iCntIV];

        int  iIVConvert = 0, iIVCurr = 0;
        bool bfindEQ = false;

        for (int iterIV = 0; iterIV < iCntIV; ++iterIV)
        {
            arrIBConvert[iterIV] = arrTri_in[iterIV];
        }

        for (int iterIV = 0; iterIV < iCntVB; ++iterIV)
        {
            Vector3 v3VBCurr = arrVertex_in[iterIV];
            iIVCurr = iterIV; bfindEQ = false;
            for (int iIVin = 0; iIVin < iIVCurr; ++iIVin)
            {
                Vector3 v3VBCurr_ = arrVertex_in[iIVin];

                //bfindEQ = CMATH.similarVector3_FIn(v3VBCurr, v3VBCurr_, 0.4f);
                bfindEQ = (v3VBCurr == v3VBCurr_);

                if (bfindEQ)
                {
                    //FORTEST
                    iCntSameVer__++;

                    iIVConvert = iIVin;
                    break;
                }
            } // for(int iIVin=0; iIVin<iterIV; ++IV_)

            if (true == bfindEQ)
            {
                for (int iSeqIV = 0; iSeqIV < iCntIV; ++iSeqIV)
                {
                    int iIBCurr = (int)arrTri_in[iSeqIV];
                    if (iIBCurr == iterIV)
                    {
                        arrIBConvert[iSeqIV] = iIVConvert;
                    }
                }
            }
        } // for(int iterIV=0; iterIV<arrVertex_in.size(); ++iterIV)

        //@ Overlap vertex
        if (0 < iCntSameVer__)
        {
            Debug.Log("Notice! (overlapped:" + iCntSameVer__ + " vertices.) Count of exactly same position vertices//constructAllTris_IVrecompute()//arrTri_in.Length=" + arrTri_in.Length);
        }

        //@Insert only validation succeeded triangle.
        CTRI    triCurrent;
        int     iSeqTriCurr = 0, iSeqTri_ = 0;
        Vector3 v3MinAABB = new Vector3(CMATH.FLOAT_MAX, CMATH.FLOAT_MAX, CMATH.FLOAT_MAX),
                v3MaxAABB = new Vector3(-CMATH.FLOAT_MAX, -CMATH.FLOAT_MAX, -CMATH.FLOAT_MAX);

        Vector3 v3VerTri;

        //@ overlap triangles
        int         iCntExactlySameTris = 0, iCntNotValidatePoly = 0;
        List <CTRI> listTriOverlap = new List <CTRI>();

        for (int iSeqIdx = 0, iTri = 0; iSeqIdx < iCntIV; iSeqIdx += 3, ++iTri)
        {
            ariTriIdx[0] = arrIBConvert[iSeqIdx];
            ariTriIdx[1] = arrIBConvert[iSeqIdx + 1];
            ariTriIdx[2] = arrIBConvert[iSeqIdx + 2];

            for (int itV = 0; itV < 3; ++itV)
            {
                v3VerTri = new Vector3(arrVertex_in[ariTriIdx[itV]].x, arrVertex_in[ariTriIdx[itV]].y, arrVertex_in[ariTriIdx[itV]].z);

                if (v3VerTri.x > v3MaxAABB.x)
                {
                    v3MaxAABB.x = v3VerTri.x;
                }
                if (v3VerTri.y > v3MaxAABB.y)
                {
                    v3MaxAABB.y = v3VerTri.y;
                }
                if (v3VerTri.z > v3MaxAABB.z)
                {
                    v3MaxAABB.z = v3VerTri.z;
                }

                if (v3VerTri.x < v3MinAABB.x)
                {
                    v3MinAABB.x = v3VerTri.x;
                }
                if (v3VerTri.y < v3MinAABB.y)
                {
                    v3MinAABB.y = v3VerTri.y;
                }
                if (v3VerTri.z < v3MinAABB.z)
                {
                    v3MinAABB.z = v3VerTri.z;
                }

                arrv3TriVer[itV] = v3VerTri;
            }

            triCurrent = new CTRI();
            triCurrent.Set(arrv3TriVer, ariTriIdx);

            if (true == triCurrent.isValidateASPoly())
            {
                bool bBeExistExactlysame = false;

                for (int iSeqIdx__ = 0; iSeqIdx__ < iSeqTriCurr; ++iSeqIdx__)
                {
                    if (iSeqIdx__ != iSeqIdx)
                    {
                        CTRI tri__ = listTris_out[iSeqIdx__];
                        if (tri__.isEqual(triCurrent))
                        {
                            //FORTEST
                            ++iCntExactlySameTris;

                            listTriOverlap.Add(triCurrent);
                            //FORTEST

                            bBeExistExactlysame = true;
                            break;
                        }
                    }
                } // for (int iSeqIdx__ = 0; iSeqIdx__ < iSeqTriCurr; ++iSeqIdx__)

                if (false == bBeExistExactlysame)
                {
                    iSeqTriCurr = iSeqTri_++;

                    listTris_out.Add(triCurrent);
                }
                else
                {
                    Debug.Log("!ERROR. Overlapped Triangle. Exist Exactly same TRI");
                }
            } // if(true==triCurrent.isValidateASPoly())
            else
            { // //CHECKOVERLAPPED
                ++iCntNotValidatePoly;
            } // if(true==triCurrent.isValidateASPoly())
        }     // for( uint iSeqIdx=0, iTri=0; iSeqIdx<iCntIV; iSeqIdx+=3,++iTri )

        //CHECKOVERLAPPED
        //@ maya에서 같은 위치에 Overlap된 polygon 작업이 있는 지 여부 검사.
        if (listTriOverlap.Count > 0)
        {
            int iSeq = 0;
            foreach (CTRI triOverlap in listTriOverlap)
            {
                m_drawRenderMesh_forcheckoverlap.DrawNewRendermesh(CMATH.INT_MAX_DIV248 + (iSeq++), triOverlap._arrv3PT, color_overllaped_triangle, CMATH.FEPSILON_F2, -1.0f);
            }

            string strDebugOut = "!ERROR triangles overlapped. //count=" + listTriOverlap.Count + "\n";
            strDebugOut += "!constructAllTris_IVrecompute:CountTris=" + listTris_out.Count + "//" +
                           "ExactlySameTris=" + iCntExactlySameTris + "//" + "NoValidateTris=" + iCntNotValidatePoly + "//" + UnityEngine.Random.Range(10.0f, 10000.0f);

            Debug.Log(strDebugOut);
        } // if(listTriOverlap.Count > 0)
          //CHECKOVERLAPPED

        return(true);
    }   //protected bool CTriContainer::constructAllTris_IVrecompute(
Exemple #27
0
    //@ Construct Triangle
    public bool InsertNewTri(int iSeqTri, CTRI tri_in, bool bConfirm)
    {
        bool bAlreadyExisted = false;

        if (_listIdxTris.Count > 0)
        {
            bAlreadyExisted = (-1 < _listIdxTris.BinarySearch(iSeqTri));
        }

        if (true == bAlreadyExisted)
        {
            return(false);
        }

        for (int iPnt = 0; iPnt < tri_in._arrv3PT.Length; ++iPnt)
        {
            _listv3PntsSrc.Add(tri_in._arrv3PT[iPnt]);
        }

        if (_listv3Pnts.Count < 1)
        {
            SetNewTri(iSeqTri, tri_in);
        }
        else
        {
            List <Vector3> listInsertPnt = new List <Vector3>();
            bool           bAlreadyPutin = false;

            for (int iPntTri = 0; iPntTri < 3; ++iPntTri)
            {
                Vector3 v3PntTri = tri_in._arrv3PT[iPntTri];

                bAlreadyPutin = false;

                for (int iSeqPnt = 0; iSeqPnt < _listv3Pnts.Count; ++iSeqPnt)
                {
                    Vector3 v3Pnt_ = _listv3Pnts[iSeqPnt];

                    if (CMATH.similarVector3_f2(v3PntTri, v3Pnt_))
                    {
                        bAlreadyPutin = true;
                        break;
                    }
                }

                if (false == bAlreadyPutin)
                {
                    listInsertPnt.Add(v3PntTri);
                }
            } // for(int iPntTri = 0; iPntTri < 3; ++iPntTri)

            if (listInsertPnt.Count > 0)
            {
                if (listInsertPnt.Count == tri_in._arrv3PT.Length)
                {
                    Debug.Log("(Wrong value.//listInsertPnt.Count > 0)//(listInsertPnt.Count == tri_in._arrv3PT.Length)//");
                }

                for (int iSeq = 0; iSeq < listInsertPnt.Count; ++iSeq)
                {
                    Vector3 v3Pnt = listInsertPnt[iSeq];
                    _listv3Pnts.Add(v3Pnt);
                }

                listInsertPnt.Clear();
            } // if(listInsertPnt.Count>0)

            _listIdxTris.Add(iSeqTri);
            _listIdxTris.Sort();
        } // if(_listv3Pnts.Count<1)

        tri_in.SetBaseLinked(this);

        return(true);
    } // public void InsertNewTri(int iSeqTri, CTRI tri_in)
    //@ Actually build up relationship with adjacent Cells and calculate cost of the way to GOAL.
    //@ Not acceptable 1 or more NULL CELL which status is CNAVICELL.NULL_CELL
    protected bool BuildAdjacentATri(ref CNAVICELL cellLeft,
                                     ref CNAVICELL[] arrNavicells)
    {
        if (true == cellLeft.DidSetAllAdjacent())
        {
            return(false);
        }

        int[] aruiIVleft = cellLeft.trilinkcell._arriIV;
        int[] aruiIVRight;
        bool  bFoundShared = false;
        int   iFoundShared = 0;

        int[] ariPointsShared_left  = new int[3];
        int[] ariPointsShared_right = new int[3];

        int iCntCells = arrNavicells.Length;

        for (int iSeqcell = 0; iSeqcell < iCntCells; ++iSeqcell)
        {
            CNAVICELL cellRight = arrNavicells[iSeqcell];
            CTRI      triRight_ = cellRight.trilinkcell;

            if (cellRight.seqCell == cellLeft.seqCell)
            {
                continue;
            }

            for (int i = 0; i < 3; ++i)
            {
                ariPointsShared_left[i] = ariPointsShared_right[i] = CNAVICELL.NULL_CELL;
            }

            aruiIVRight = triRight_._arriIV;

            iFoundShared = 0;
            int iSharedIV_left = 0, iSharedIV_right = 0;

            for (int iL = 0; iL < 3; ++iL)
            {
                for (int iR = 0; iR < 3; ++iR)
                {
                    if (aruiIVleft[iL] == aruiIVRight[iR])
                    {
                        ariPointsShared_left[iL]  = aruiIVleft[iL];
                        ariPointsShared_right[iR] = aruiIVRight[iR];

                        iSharedIV_left  = iSharedIV_left + iL;
                        iSharedIV_right = iSharedIV_right + iR;

                        ++iFoundShared;
                    }
                } // for( int iR=0; iR<3; ++iR )
            }     // for( int iL=0; iL<3; ++iL )

            bFoundShared = (iFoundShared > 1);
            if (true == bFoundShared)
            {
                if (iFoundShared > 2)
                {
                    break;
                }

                cellLeft.SetAdjacentCell(CNAVICELL.getTypeEdge(iSharedIV_left), cellRight.seqCell);
                cellRight.SetAdjacentCell(CNAVICELL.getTypeEdge(iSharedIV_right), cellLeft.seqCell);

                if (cellLeft.DidSetAllAdjacent() == true)
                {
                    break;
                }
            } // if( iFoundShared>1 )
        }     // for( it_=iterBegin; it_!=iterEnd; ++it_ )

        return(true);
    } // protected bool BuildAdjacentATri