예제 #1
0
    bool m_bDivingIntoWater = false; //to handle diving transions from water surface. if enabled,let finish it;

    //Vector3 m_LarasHeapPosition;
    // Use this for initialization
    void Start()
    {
        m_Transform        = transform;
        OnGUIUpdate       += GUIManager.HandleGUIUpdate;
        OnGUIPlayerHealth += GUIManager.HandleGUIPlayerHealth;
        OnPositionChanged += PositionChanged;

        //GotoKeyMapper.IdleState();
        KeyMapper.OnKeyDown += StateCodeHandler;
        KeyMapper.OnKeyIdle += IdleStateHandler;
        Mouse.m_OnMouseMove += OnMouseMove;

        physics   = new Physic3D(m_Transform.position);
        physics.g = 5000 * Settings.SceneScaling;
        //prevy = thistransform.position.y;
        LaraStatePlayer.OnJump     += JumpHandler;
        LaraStatePlayer.OnJumping  += JumpingHandler;
        LaraStatePlayer.OnMovement += MovementHandler;
        //LaraStatePlayer.OnPrimaryAction += PrimaryActionHandler; //this callback is not needed anymore

        //m_FreePosition = m_Transform.position;
        //m_PrevPlayPos = m_Transform.position;
        //m_GroundHeight = m_Transform.position.y;
        m_LarasHeap = m_Transform.Find("objPart:0");
        m_LarasHead = m_LarasHeap.Find("objPart:7").Find("objPart:14");
        //m_LarasHeapPosition = m_LarasHeap.position - Vector3.up * 0.25f;
        SetInitialPosition(m_Transform.position, transform.forward);

        physics.OnReachedMaximumHeight += DidReachedMaxJumpHeight;
    }
예제 #2
0
    public bool HitTest(Vector3 origin, Vector3 dir, ref Vector3 normal, float raylength = 200)
    {
        Vector3 hitpoint = Vector3.zero;
        int     faceid   = Physic3D.RayCast(m_Transform, m_RoomVertices, m_SharedTriangles, origin, dir, raylength, ref hitpoint);

        if (faceid != -1)
        {
            Triangle face = m_RoomAnalyzer.LodTriangles[faceid];
            normal = face.normal;
        }

        return(faceid != -1);
    }
예제 #3
0
 // Update is called once per frame
 void Update()
 {
     Physic3D.RayCast(mf.transform, mesh.vertices, mesh.triangles, transform.position, transform.forward, 10000, ref hp);
     Debug.DrawLine(transform.position, hp);
 }
예제 #4
0
    public List <Edge> RayCast(Vector3 origin, Vector3 dir, float raylength = 200)
    {
        //first select a face from face network
        //then find a edge that is normal to ground.

        //if  normal going upward and found next edge diagonal - > go to mirror face
        //if normal going upward found next edge horizontal - > next edge lader step
        //                                                  -> if lader step found chek it is topmost go to mirror face
        //else

        //if normal going downward and found next edge horizontal - > go to mirror face
        //f normal going downward and found next edge diagonal - > third edge is lader step
        //                                                   -> if lader step found chek it is topmost go to mirror face

        Vector3 hitpoint = Vector3.zero;
        int     faceid   = Physic3D.RayCast(m_Transform, m_RoomVertices, m_SharedTriangles, origin, dir, raylength, ref hitpoint);

        //find all edeges connected to faceid
        List <Edge> edges = new List <Edge>();

        if (faceid != -1)
        {
            //Debug.Log("Room.RayCast:" + faceid);
            Triangle face      = m_RoomAnalyzer.LodTriangles[faceid];
            int      ntrycount = 0;

            Edge TempEdge     = null;
            Edge platformEdge = null;
            while (platformEdge == null)
            {
                for (int k = 0; k < face.vertex.Length; k++)
                {
                    int     nextid = (k + 1) % face.vertex.Length;
                    Vector3 upvec  = (face.vertex[nextid].position - face.vertex[k].position).normalized;
                    float   dot    = Vector3.Dot(Vector3.up, upvec);

                    if (dot == 1.0f)                    //goin upward
                    {
                        //check if next edge is diagonal
                        int     diagonalvtx0   = nextid;
                        int     diagonalvtx1   = (nextid + 1) % face.vertex.Length;
                        Vector3 diagvec        = (face.vertex[diagonalvtx1].position - face.vertex[diagonalvtx0].position).normalized;
                        bool    isdiag         = (Vector3.Dot(upvec, diagvec) != 0);
                        bool    gotomirrorface = false;

                        if (!isdiag)                        //found ladder step
                        {
                            Edge e = new Edge(face.vertex[diagonalvtx0].position, face.vertex[diagonalvtx1].position);
                            e.AtoB   = diagvec;
                            TempEdge = e;

                            //check if this is top most step
                            if (SurfaceAnalyzer.ComputeEdgeCollapseCost(face.vertex[diagonalvtx0], face.vertex[diagonalvtx1]) < 1)
                            {
                                platformEdge = e;
                                break;
                            }
                            else
                            {
                                gotomirrorface = true;
                            }
                        }
                        else
                        {
                            gotomirrorface = true;
                        }

                        if (gotomirrorface)
                        {
                            List <Triangle> faces = face.vertex[diagonalvtx0].face;
                            for (int i = 0; i < faces.Count; i++)
                            {
                                if (faces[i].HasVertex(face.vertex[diagonalvtx1]) && !faces[i].HasVertex(face.vertex[k]))
                                {
                                    face = faces[i];
                                    break;
                                }
                            }
                        }
                    }
                    else if (dot == -1.0f)
                    {
                        //check if next edge is diagonal
                        int     diagonalvtx0   = nextid;
                        int     diagonalvtx1   = (nextid + 1) % face.vertex.Length;
                        Vector3 diagvec        = (face.vertex[diagonalvtx1].position - face.vertex[diagonalvtx0].position).normalized;
                        bool    isdiag         = (Vector3.Dot(upvec, diagvec) != 0);
                        bool    gotomirrorface = false;

                        if (!isdiag)                        //found lowest ladder step
                        {
                            gotomirrorface = true;
                        }
                        else
                        {
                            Edge e = new Edge(face.vertex[diagonalvtx1].position, face.vertex[k].position);
                            e.AtoB   = (face.vertex[k].position - face.vertex[diagonalvtx1].position).normalized;
                            TempEdge = e;

                            //check if this is top most step
                            if (SurfaceAnalyzer.ComputeEdgeCollapseCost(face.vertex[diagonalvtx1], face.vertex[k]) < 1)
                            {
                                platformEdge = e;
                                break;
                            }
                            else
                            {
                                gotomirrorface = true;
                            }
                        }

                        if (gotomirrorface)
                        {
                            List <Triangle> faces = face.vertex[diagonalvtx1].face;
                            for (int i = 0; i < faces.Count; i++)
                            {
                                if (faces[i].HasVertex(face.vertex[k]) && !faces[i].HasVertex(face.vertex[diagonalvtx0]))
                                {
                                    face = faces[i];
                                    break;
                                }
                            }
                        }
                    }
                }

                ntrycount++;
                if (ntrycount > 20)
                {
                    if (TempEdge != null)
                    {
                        platformEdge = TempEdge;
                    }
                    break;
                }
            }

            if (platformEdge != null)
            {
                edges.Add(platformEdge);
            }
        }

        return(edges);
    }
예제 #5
0
    // Use this for initialization
    void Start()
    {
        m_Transform = transform;
        OnGUIUpdate += GUIManager.HandleGUIUpdate;
        OnGUIPlayerHealth += GUIManager.HandleGUIPlayerHealth;
        OnPositionChanged += PositionChanged;

        //GotoKeyMapper.IdleState();
        KeyMapper.OnKeyDown += StateCodeHandler;
        KeyMapper.OnKeyIdle += IdleStateHandler;
        Mouse.m_OnMouseMove += OnMouseMove;

        physics = new Physic3D(transform.position);
        physics.g = 5000;
        //prevy = thistransform.position.y;
        LaraStatePlayer.OnJump += JumpHandler;
        LaraStatePlayer.OnJumping += JumpingHandler;
        LaraStatePlayer.OnMovement += MovementHandler;
        LaraStatePlayer.OnPrimaryAction += PrimaryActionHandler;

        //m_FreePosition = transform.position;
        //m_PrevPlayPos = m_Transform.position;
        //m_GroundHeight = transform.position.y;

        SetInitialPosition(transform.position, transform.forward);
    }